當一個系統(tǒng)存在很長一段時間后像吻,經(jīng)常會使用更新的技術來提高性能峻黍、可維護性或添加新特性。其中一個變化可能會是使用哪個數(shù)據(jù)庫拨匆。這可能是最困難的改變姆涩。在遷移過程中,有兩個數(shù)據(jù)源惭每,這使得該系統(tǒng)成為一個分布式系統(tǒng)骨饿。在分布式系統(tǒng)中,保持數(shù)據(jù)一致非常困難台腥,而且很容易出錯宏赘。在本文中,我們將探索一種在遷移期間保持數(shù)據(jù)一致性的方法黎侈,并且這種方法的停機時間較短察署。
前提條件
為了使用本文描述的方法,需要滿足一些要求:
源數(shù)據(jù)庫支持捕獲數(shù)據(jù)更改(CDC)的方法峻汉,如MySQL的bin log贴汪。
源數(shù)據(jù)庫可以導出一致的數(shù)據(jù),并且可以在數(shù)據(jù)更改日志中標記位置休吠。
目標數(shù)據(jù)庫支持ACID事務扳埂。
源和目標數(shù)據(jù)庫都支持讀寫權限控制。
步驟
制定以下遷移步驟的兩個基本想法:
在給定的時間點上瘤礁,客戶端只向其中一個數(shù)據(jù)庫寫入聂喇,從而避免了分布式事務易出錯、處理速度慢的問題蔚携。
通過設置數(shù)據(jù)庫權限來實現(xiàn)數(shù)據(jù)庫切換希太。這比從客戶端代碼切換要快,而且更容易確保所有客戶端都切換酝蜒。
下面是具體步驟誊辉。
1.將源數(shù)據(jù)庫轉(zhuǎn)儲到目標數(shù)據(jù)庫
首先,我們需要源數(shù)據(jù)庫可以導出一致的數(shù)據(jù)亡脑。標記好已轉(zhuǎn)儲的位置堕澄。例如,在 MySQL 中霉咨,可以在使用 mysqldump
轉(zhuǎn)儲數(shù)據(jù)庫時帶上 --master-data
選項蛙紫,這樣生成的文件中就會記錄 bin log 日志的位置( 使用文檔 )。從源數(shù)據(jù)庫獲得所有數(shù)據(jù)后途戒,可以將它們插入目標數(shù)據(jù)庫坑傅。
因為這是第一步,所以即使失敗了也很容易處理:重新開始即可喷斋。因此唁毒,重要的是蒜茴,在導入轉(zhuǎn)儲數(shù)據(jù)時,任何錯誤都要捕獲浆西。
2. 捕獲源數(shù)據(jù)庫的更改
下一步是捕獲源數(shù)據(jù)庫的更改粉私。例如,在 MySQL 中近零,可以使用 bin log 捕獲更改并將其插入到目標數(shù)據(jù)庫中诺核。因為上一步記錄了開始位置,所以我們知道從哪里開始解析和導入更改久信。
推薦閱讀:
深入淺出Redis窖杀,十年阿里架構師分享:有了它還怕不懂Redis原理?
字節(jié)跳動總結的設計模式 PDF 火了入篮,完整版開放分享
刷Github時發(fā)現(xiàn)了一本阿里大神的算法筆記陈瘦!標星70.5K
為什么阿里巴巴的程序員成長速度這么快幌甘,看完他們的內(nèi)部資料我懂了
看完三件事??
如果你覺得這篇內(nèi)容對你還蠻有幫助,我想邀請你幫我三個小忙:
點贊锅风,轉(zhuǎn)發(fā)酥诽,有你們的 『點贊和評論』,才是我創(chuàng)造的動力皱埠。
關注公眾號 『 Java斗帝 』肮帐,不定期分享原創(chuàng)知識。
同時可以期待后續(xù)文章ing??