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

停機遷移方案

我先給你說一個最low 的方案,就是很簡單,大傢伙兒凌晨12 點開始運維,網站或者app 掛個公告,說0 點到早上6 點進行運維,無法訪問。
接著到0點停機,系統停掉,沒有流量寫入了,此時老的單庫單表數據庫靜止了。然後你之前得寫好一個導數的一次性工具,此時直接跑起來,然後將單庫單表的數據嘩嘩嘩讀出來,寫到分庫分錶裡面去。
導數完了之後,就ok 了,修改系統的數據庫連接配置啥的,包括可能代碼和SQL 也許有修改,那你就用最新的代碼,然後直接啟動連到新的分庫分錶上去。
驗證一下,ok了,完美,大家伸個懶腰,看看看凌晨4 點鐘的北京夜景,打個滴滴回家吧。
但是這個方案比較low,誰都能幹,我們來看看高大上一點的方案。
database-shard-method-1

雙寫遷移方案

這個是我們常用的一種遷移方案,比較靠譜一些,不用停機,不用看北京凌晨4 點的風景。
簡單來說,就是在線上系統裡面,之前所有寫庫的地方,增刪改操作,除了對老庫增刪改,都加上對新庫的增刪改,這就是所謂的雙寫,同時寫倆庫,老庫和新庫。
然後系統部署之後,新庫數據差太遠,用之前說的導數工具,跑起來讀老庫數據寫新庫,寫的時候要根據gmt_modified這類字段判斷這條數據最後修改的時間,除非是讀出來的數據在新庫裡沒有,或者是比新庫的數據新才會寫。簡單來說,就是不允許用老數據覆蓋新數據。
導完一輪之後,有可能數據還是存在不一致,那麼就程序自動做一輪校驗,比對新老庫每個表的每條數據,接著如果有不一樣的,就針對那些不一樣的,從老庫讀數據再次寫。反复循環,直到兩個庫每個表的數據都完全一致為止。
接著當數據完全一致了,就ok 了,基於僅僅使用分庫分錶的最新代碼,重新部署一次,不就僅僅基於分庫分錶在操作了麼,還沒有幾個小時的停機時間,很穩。所以現在基本玩兒數據遷移之類的,都是這麼幹的。
database-shard-method-2

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

利用 Keepalived 提供 VIP