如何在數據庫遷移中保證數據一致性?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"本文最初發佈於王斌的個人博客,經原作者授權由InfoQ中文站翻譯並分享"},{"type":"text","text":",原文地址:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.binwang.me\/2020-11-29-Keep-Data-Consistency-During-Database-Migration.html","title":"","type":null},"content":[{"type":"text","text":"https:\/\/www.binwang.me\/2020-11-29-Keep-Data-Consistency-During-Database-Migration.html"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當一個系統存在很長一段時間後,經常會使用更新的技術來提高性能、可維護性或添加新特性。其中一個變化可能會是使用哪個數據庫。這可能是最困難的改變。在遷移過程中,有兩個數據源,這使得該系統成爲一個分佈式系統。在分佈式系統中,保持數據一致非常困難,而且很容易出錯。在本文中,我們將探索一種在遷移期間保持數據一致性的方法,並且這種方法的停機時間較短。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"前提條件"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了使用本文描述的方法,需要滿足一些要求:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"源數據庫支持捕獲數據更改(CDC)的方法,如MySQL的bin log。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"源數據庫可以導出一致的數據,並且可以在數據更改日誌中標記位置。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目標數據庫支持ACID事務。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"源和目標數據庫都支持讀寫權限控制。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"步驟"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"制定以下遷移步驟的兩個基本想法:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"在給定的時間點上,客戶端只向其中一個數據庫寫入,從而避免了分佈式事務易出錯、處理速度慢的問題。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"通過設置數據庫權限來實現數據庫切換。這比從客戶端代碼切換要快,而且更容易確保所有客戶端都切換。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面是具體步驟。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.將源數據庫轉儲到目標數據庫"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,我們需要源數據庫可以導出一致的數據。標記好已轉儲的位置。例如,在MySQL中,可以在使用"},{"type":"codeinline","content":[{"type":"text","text":"mysqldump"}]},{"type":"text","text":"轉儲數據庫時帶上"},{"type":"codeinline","content":[{"type":"text","text":"--master-data"}]},{"type":"text","text":"選項,這樣生成的文件中就會記錄bin log日誌的位置("},{"type":"link","attrs":{"href":"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html#option_mysqldump_master-data","title":"","type":null},"content":[{"type":"text","text":"使用文檔"}]},{"type":"text","text":")。從源數據庫獲得所有數據後,可以將它們插入目標數據庫。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲這是第一步,所以即使失敗了也很容易處理:重新開始即可。因此,重要的是,在導入轉儲數據時,任何錯誤都要捕獲。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2. 捕獲源數據庫的更改"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下一步是捕獲源數據庫的更改。例如,在MySQL中,可以使用"},{"type":"link","attrs":{"href":"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/binary-log.html","title":"","type":null},"content":[{"type":"text","text":"bin log"}]},{"type":"text","text":"捕獲更改並將其插入到目標數據庫中。因爲上一步記錄了開始位置,所以我們知道從哪裏開始解析和導入更改。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章