切換資料庫 如何在資料庫遷移中保證資料一致性?

2021-10-12 18:19:03 字數 2106 閱讀 8036

當乙個系統存在很長一段時間後,經常會使用更新的技術來提高效能、可維護性或新增新特性。其中乙個變化可能會是使用哪個資料庫。這可能是最困難的改變。在遷移過程中,有兩個資料來源,這使得該系統成為乙個分布式系統。在分布式系統中,保持資料一致非常困難,而且很容易出錯。在本文中,我們將探索一種在遷移期間保持資料一致性的方法,並且這種方法的停機時間較短。

1 前提條件

2 步驟

制定以下遷移步驟的兩個基本想法:

下面是具體步驟。

1. 將源資料庫轉儲到目標資料庫

首先,我們需要源資料庫可以匯出一致的資料。標記好已轉儲的位置。例如,在 mysql 中,可以在使用mysqldump轉儲資料庫時帶上--master-data選項,這樣生成的檔案中就會記錄 bin log 日誌的位置(使用文件)。從源資料庫獲得所有資料後,可以將它們插入目標資料庫。

因為這是第一步,所以即使失敗了也很容易處理:重新開始即可。因此,重要的是,在匯入轉儲資料時,任何錯誤都要捕獲。

2. 捕獲源資料庫的更改

在匯入時保持更改順序非常重要。所以最好是只使用乙個程序來解析和匯入更改。這個步驟非常具有挑戰性:這一步效能很重要。同步所有更改的時間就是遷移所需的停機時間。

我們還需要確保,即使出現系統故障,也不會錯過任何更改或多次匯入任何更改。因此,記錄更改日誌的位置非常重要。我們可以使用與匯入資料相同的事務將位置寫入目標資料庫,這非常方便。這樣,位置就可以與我們匯入的資料保持同步。

3. 拒絕客戶端到目標資料庫的寫操作

使用單一資料來源是一種保持資料一致性的簡單方法。到目前為止,我們使用源資料庫作為單一資料來源,並將更改同步到目標資料庫。我們不想讓其他寫操作把目標資料庫搞亂。因此,我們需要設定目標資料庫的許可權來拒絕來自客戶端的所有寫操作。例如,在 mysql 中,只向客戶端授予表的 select 許可權,並拒絕其他操作。我們允許讀取許可權,這樣在下一步中就可以比較讀取結果。

4. 修改客戶端,同時對兩個資料庫進行讀取和寫入

下一步是讓客戶端同時對源和目標資料庫進行讀取和寫入。

我們希望首先讀 / 寫源資料庫。如果沒有許可權錯誤,則使用此結果,否則使用來自目標資料庫的讀 / 寫結果。

對目標資料庫的讀 / 寫操作有兩個目的:

如果你想確保目標資料庫能夠處理這些負載,那麼在一段時間內允許對目標資料庫進行讀 / 寫操作是個好主意,但這只是作為乙個驗證,在那之後,目標資料庫中的資料會不一致。因此,在我們驗證了目標資料庫能夠處理系統流量之後,我們需要清理目標資料庫,並再次從步驟 1 開始。(在這些步驟中,我們不需要修改客戶端**)。

對於錯誤處理,有兩個關鍵點:

客戶端**如下:

db_operation()  catch (permissionexception e)  7  async  catch (exception e) 15  }16  return source_result17}
5. 拒絕客戶端對源資料庫的訪問,並等待更改同步

在對目標資料庫的讀寫操作有信心之後,就可以進行切換了。我們通過更改資料庫許可權來切換資料庫。首先,我們拒絕客戶端對源資料庫的所有訪問。然後等待更改完全同步到目標資料庫。在此期間,系統是停機的。因此,從源資料庫到目標資料庫的更改同步速度決定了它的停機時間。

6. 允許寫入目標資料庫

7. 可選:如果出現任何錯誤,則回退到源資料庫

如果到目前為止一切順利,那就太好了。但情況並非總是如此。也許目標資料庫無法處理新的流量(這就是我們說步驟 4 的測試很重要的原因),在這種情況下,我們就需要回退到源資料庫。

如果是在遷移期間丟失了提交的資料,那不是什麼大問題,回退也比較簡單:

如果儲存提交的資料並保持一致性非常重要,那麼在第 5 步之前,我們應該設定一種機制來捕獲從目標資料庫到源資料庫的更改,並在第 6 步之後標記更改位置。那麼,回退步驟將是下面這樣:

從目標資料庫到源資料庫的同步非常危險且難以測試,因此,在步驟 4 中測試目標資料庫能否處理新的流量就非常重要。

8. 清理客戶端**

切換到目標資料庫之後,我們就可以清除訪問源資料庫的**了。這樣,資料庫遷移就大功告成了!

點個在看少個 bug ?

如何在資料庫中使用索引

一 給資訊表建立索引 資訊表為 建立索引 create index 索引名 on 表名 列名.mysql create index idx lname pinyin on employee lname pinyin 顯示索引資訊 show index from 表名 mysql show index...

如何在資料庫動態建表

動態建表首先需要了解statement類 statement 物件用 connection 的方法createstatement 建立,例如 建立連線物件 connection connection dbutil.getconnection 建立statement物件 statement state...

在資料庫中儲存的是什麼

在資料庫中儲存的是資料以及資料之間的聯絡。資料庫是按照資料結構來組織 儲存和管理資料的倉庫,是乙個長期儲存在計算機內的 有組織的 可共享的 統一管理的大量資料的集合。學習 分享 mysql 教程 資料庫是 按照資料結構來組織 儲存和管理資料的倉庫 是乙個長期儲存在計算機內的 有組織的 可共享的 統一...