發表文章

目前顯示的是 6月, 2020的文章

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

圖片
停機遷移方案 我先給你說一個最low 的方案,就是很簡單,大傢伙兒凌晨12 點開始運維,網站或者app 掛個公告,說0 點到早上6 點進行運維,無法訪問。 接著到0點停機,系統停掉,沒有流量寫入了,此時老的單庫單表數據庫靜止了。 然後你之前得寫好一個 導數的一次性工具 ,此時直接跑起來,然後將單庫單表的數據嘩嘩嘩讀出來,寫到分庫分錶裡面去。 導數完了之後,就ok 了,修改系統的數據庫連接配置啥的,包括可能代碼和SQL 也許有修改,那你就用最新的代碼,然後直接啟動連到新的分庫分錶上去。 驗證一下,ok了,完美,大家伸個懶腰,看看看凌晨4 點鐘的北京夜景,打個滴滴回家吧。 但是這個方案比較low,誰都能幹,我們來看看高大上一點的方案。 雙寫遷移方案 這個是我們常用的一種遷移方案,比較靠譜一些,不用停機,不用看北京凌晨4 點的風景。 簡單來說,就是在線上系統裡面,之前所有寫庫的地方,增刪改操作, 除了對老庫增刪改,都加上對新庫的增刪改 ,這就是所謂的 雙寫 ,同時寫倆庫,老庫和新庫。 然後 系統部署 之後,新庫數據差太遠,用之前說的導數工具,跑起來讀老庫數據寫新庫,寫的時候要根據gmt_modified這類字段判斷這條數據最後修改的時間,除非是讀出來的數據在新庫裡沒有,或者是比新庫的數據新才會寫。 簡單來說,就是不允許用老數據覆蓋新數據。 導完一輪之後,有可能數據還是存在不一致,那麼就程序自動做一輪校驗,比對新老庫每個表的每條數據,接著如果有不一樣的,就針對那些不一樣的,從老庫讀數據再次寫。 反复循環,直到兩個庫每個表的數據都完全一致為止。 接著當數據完全一致了,就ok 了,基於僅僅使用分庫分錶的最新代碼,重新部署一次,不就僅僅基於分庫分錶在操作了麼,還沒有幾個小時的停機時間,很穩。 所以現在基本玩兒數據遷移之類的,都是這麼幹的。