資料庫平滑遷移方案與實踐分享

有夢想的老王發表於2021-11-17

背景:
     在一個資料庫中存在A表與B表,但AB兩個表按目前架構邊界劃分的話,是屬於兩個組織下的兩個系統,導致相互之間有穩定性風險。為增強系統穩定性,進行儲存分離。準備將B表的所有資料,遷移到新庫中。

可能存在的問題:
1、由於原來的AB表在一個資料庫中,程式碼中可以用事務控制兩個表,遷移後不支援本地事務,如何解決?
2、原來是一個資料來源,現在分為兩個資料來源,如何解決?
3、由於這兩個表,是核心鏈路的核心資料,遷移過程無法停機遷移,如何保證安全穩定的不停機平滑遷移?
4、遷移過程如何保證資料一致?

遷移準備工作:
1、表準備
2、事務支援需要找相關人員確認,應對事務解耦後的方案
3、資料來源梳理

叢集遷移方案:
一、整體方案
DBA線上建立新資料庫,同步原資料庫資料; 
1、全量同步方案: 源庫匯出資料進行全量初始化,dba通過多執行緒抽取源資料進行插入
2、增量同步方案: 記錄全量時刻的binlog位點,通過binlog進行資料增量同步  增量資料進行資料一致性校驗,通過工具進行資料校驗;
3、系統中配置多個資料來源,涉及到的表具有開關;可進行雙寫、指定寫新庫/老庫,指定讀主庫/新庫
4、程式碼上線 ,上線後寫老庫,讀老庫;不做任何變更
5、增量資料此時已經開啟;
6、選取流量低峰期開啟雙寫開關,觀察寫新庫是否存在報錯,且對整體的tps是否有影響;大約5min左右
7、關閉增量資料同步,觀察30min,無異常報錯,且資料正常寫入,只保留雙寫。 此時資料校驗進行新增資料校驗;如果產生問題,進行開關回切,增量binlog繼續開啟
8、觀察業務有無異常,跑一週時間,觀察資料是否有告警
9、切換讀新庫,跑一週時間
10、無異常,選取流量低峰期進行 大資料切換讀新庫備份機、binlog切換讀新庫備份機,此時會有一小段時間的重複資料產生,下游資料需要自己保證冪等性。
11、關閉老庫寫操作
12、跑一段時間,無問題,完全走新庫
二、具體流程圖

注意點:
原資料庫的binlog事件,需要提前接入;binlog監聽維度的切換是在程式碼上線之前即可監聽,外圍需要保證冪等性;
大資料是否有抽取資料,需要確認;切換完成後,需要抽取新的庫資料;  大資料進行抽數需要進行lion變更;
確認update是否會進行覆蓋,可能存在覆蓋,但是兩者應該最終一致
遷移過程可控,問題可發現;老庫寫入確保無問題
binlog資料消費可能早於新庫寫入,因此切換讀流量前需要進行binlog切換
樂觀鎖多版本更新,系統異常可感知,業務異常不可感知,樂觀鎖更新雙寫情況下保證最終一致性
查詢業務流量做比對

風險點: 
由於連線修改在mapper層面,防止有mapper.method方法覆蓋不全導致的寫資料丟失
需要增加比對資料任務,進行資料比對
需要增加同步資料任務,防止切換過程資料丟失,進行資料彌補
資料比對、資料修復指令碼、告警:

通過指令碼(增量資料比對)
job手工比對(存量資料的比對)
修復資料job(指定表,指定更新時間範圍)—相當於後門

相關文章