如何設計才可以讓系統從未分庫分表動態切換到分庫分表上?

  • 2019 年 11 月 24 日
  • 筆記

停機遷移方案

我先給你說一個最 low 的方案,就是很簡單,大傢伙兒凌晨 12 點開始運維,網站或者 app 掛個公告,說 0 點到早上 6 點進行運維,無法訪問。

接著到 0 點停機,系統停掉,沒有流量寫入了,此時老的單庫單表資料庫靜止了。然後你之前得寫好一個導數的一次性工具,此時直接跑起來,然後將單庫單表的數據嘩嘩嘩讀出來,寫到分庫分表裡面去。

導數完了之後,就 ok 了,修改系統的資料庫連接配置啥的,包括可能程式碼和 SQL 也許有修改,那你就用最新的程式碼,然後直接啟動連到新的分庫分表上去。

驗證一下,ok了,完美,大家伸個懶腰,看看看凌晨 4 點鐘的北京夜景,打個滴滴回家吧。

但是這個方案比較 low,誰都能幹,我們來看看高大上一點的方案。

雙寫遷移方案

這個是我們常用的一種遷移方案,比較靠譜一些,不用停機,不用看北京凌晨 4 點的風景。

簡單來說,就是在線上系統裡面,之前所有寫庫的地方,增刪改操作,除了對老庫增刪改,都加上對新庫的增刪改,這就是所謂的雙寫,同時寫倆庫,老庫和新庫。

然後系統部署之後,新庫數據差太遠,用之前說的導數工具,跑起來讀老庫數據寫新庫,寫的時候要根據 gmt_modified 這類欄位判斷這條數據最後修改的時間,除非是讀出來的數據在新庫里沒有,或者是比新庫的數據新才會寫。簡單來說,就是不允許用老數據覆蓋新數據。

導完一輪之後,有可能數據還是存在不一致,那麼就程式自動做一輪校驗,比對新老庫每個表的每條數據,接著如果有不一樣的,就針對那些不一樣的,從老庫讀數據再次寫。反覆循環,直到兩個庫每個表的數據都完全一致為止。

接著當數據完全一致了,就 ok 了,基於僅僅使用分庫分表的最新程式碼,重新部署一次,不就僅僅基於分庫分表在操作了么,還沒有幾個小時的停機時間,很穩。所以現在基本玩兒數據遷移之類的,都是這麼乾的。

Exit mobile version