什么是海外云雙寫實(shí)現(xiàn)數(shù)據(jù)遷移方案?隨著業(yè)務(wù)的發(fā)展,存儲(chǔ)也會(huì)經(jīng)常性的需要遷移。雙寫是比較靠譜不用停機(jī),不用看辦公室外凌晨4點(diǎn)的風(fēng)景,數(shù)據(jù)遷移將一批數(shù)據(jù)從同構(gòu)存儲(chǔ)系統(tǒng)(如MySQLA到MySQLB)或異構(gòu)存儲(chǔ)系統(tǒng)(如MySQL-MongoDB)間搬運(yùn)遷移。最簡(jiǎn)單的數(shù)據(jù)遷移方式是通過腳本或定時(shí)任務(wù)將數(shù)據(jù)進(jìn)行搬運(yùn),亦或是通過類似canal之類的工具進(jìn)行數(shù)據(jù)同步。
雙寫就是在線上系統(tǒng)里面,之前所有寫庫(kù)的地方,增刪改操作,都除了對(duì)老庫(kù)增刪改,都加上對(duì)新庫(kù)的增刪改,這就是所謂雙寫,同時(shí)寫倆庫(kù),老庫(kù)和新庫(kù)??梢员WC遷移過程是在線的、遷移前后數(shù)據(jù)是一致的、遷移過程是可回滾的。數(shù)據(jù)雙寫遷移方案分為五大步,分別是:同步、雙寫、校驗(yàn)、切讀、切寫。以MySQL數(shù)據(jù)遷移至MongoDB為例來說明這五大步的流程。
海外云數(shù)據(jù)遷移雙寫方案可通過canal或mq做實(shí)現(xiàn):
1、增加新庫(kù),按照現(xiàn)有節(jié)點(diǎn), 增加對(duì)應(yīng)的數(shù)量。
2、數(shù)據(jù)遷移:避免增量影響, 先斷開主從,再導(dǎo)入(耗時(shí)較長(zhǎng)), 同步完成并做校驗(yàn)
3、增量同步:開啟Canal同步服務(wù), 監(jiān)聽從節(jié)點(diǎn)數(shù)據(jù)庫(kù), 再開啟主從同步,從節(jié)點(diǎn)收到數(shù)據(jù)后會(huì)通過Canal服務(wù), 傳遞至新的DB節(jié)點(diǎn)。
4、切換新庫(kù):通過Nginx,切換訪問流量至新的服務(wù)。
5、修復(fù)切換異常數(shù)據(jù):在切換過程中, 如果出現(xiàn),Canal未同步,但已切換至新庫(kù)的請(qǐng)求(比如下單,修改了資金, 但還未同步 ), 可以通過定制程序, 讀取檢測(cè)異常日志,做自動(dòng)修復(fù)或人工處理。
針對(duì)此種情況, 最好是在凌晨用戶量小的時(shí)候, 或?qū)iT停止外網(wǎng)訪問,進(jìn)行切換,減少異常數(shù)據(jù)的產(chǎn)生。
6、數(shù)據(jù)校驗(yàn):為保障數(shù)據(jù)的完全一致, 有必要對(duì)數(shù)據(jù)的數(shù)量完整性做校驗(yàn)。
雙寫方案可以實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)同步和遷移,可以保證數(shù)據(jù)的一致性和完整性,但是需要考慮到數(shù)據(jù)同步的性能和可靠性問題。同時(shí),雙寫方案也需要考慮到數(shù)據(jù)的安全性和隱私性問題,需要采取相應(yīng)的安全措施來保護(hù)數(shù)據(jù)的安全性。
導(dǎo)完一輪之后,有可能數(shù)據(jù)還是存在不一致,那么就程序自動(dòng)做一輪校驗(yàn),比對(duì)新老庫(kù)每個(gè)表的每條數(shù)據(jù),接著如果有不一樣的,就針對(duì)那些不一樣的,從老庫(kù)讀數(shù)據(jù)再次寫。反復(fù)循環(huán),直到兩個(gè)庫(kù)每個(gè)表的數(shù)據(jù)都完全一致為止。
接著當(dāng)數(shù)據(jù)完全一致了,就 ok 了,基于僅僅使用分庫(kù)分表的最新代碼,重新部署一次,不就僅僅基于分庫(kù)分表在操作了么,還沒有幾個(gè)小時(shí)的停機(jī)時(shí)間,很穩(wěn)。所以現(xiàn)在基本玩兒數(shù)據(jù)遷移之類的,都是這么干的。