現(xiàn)在有一個(gè)未分庫分表的系統(tǒng),未來要分庫分表,如何設(shè)計(jì)才可以讓系統(tǒng)從未分庫分表動(dòng)態(tài)切換到分庫分 表上?

面試官心理分析

你看看,你現(xiàn)在已經(jīng)明白為啥要分庫分表了,你也知道常用的分庫分表中間件了,你也設(shè)計(jì)好你們?nèi)绾畏謳旆直淼姆桨噶耍ㄋ讲鸱帧⒋怪辈鸱帧⒎直恚菃栴}來了,你接下來該怎么把你那個(gè)單庫單表的系統(tǒng)給遷移到分庫分表上去?

所以這都是一環(huán)扣一環(huán)的,就是看你有沒有全流程經(jīng)歷過這個(gè)過程。


面試題剖析

這個(gè)其實(shí)從 low 到高大上有好幾種方案,我們都玩兒過,我都給你說一下


停機(jī)遷移方案

我先給你說一個(gè)最 low 的方案,就是很簡(jiǎn)單,大家伙兒凌晨 12 點(diǎn)開始運(yùn)維,網(wǎng)站或者 app 掛個(gè)公告,說 0 點(diǎn)到早上 6 點(diǎn)進(jìn)行運(yùn)維,無法訪問。接著到 0 點(diǎn)停機(jī),系統(tǒng)停掉,沒有流量寫入了,此時(shí)老的單庫單表數(shù)據(jù)庫靜止了。然后你之前得寫好一個(gè)導(dǎo)數(shù)的一次性工具,此時(shí)直接跑起來,然后將單庫單表的數(shù)據(jù)嘩嘩嘩讀出來,寫到分庫分表里面去。導(dǎo)數(shù)完了之后,就 ok 了,修改系統(tǒng)的數(shù)據(jù)庫連接配置啥的,包括可能代碼和 SQL 也許有修改,那你就用最新的代碼,然后直接啟動(dòng)連到新的分庫分表上去。驗(yàn)證一下,ok 了,完美,大家伸個(gè)懶腰,看看看凌晨 4 點(diǎn)鐘的北京夜景,打個(gè)滴滴回家吧。這個(gè)方案比較 low,誰都能干,我們來看看高大上一點(diǎn)的方案。


雙寫遷移方案

這個(gè)是我們常用的一種遷移方案,比較靠譜一些,不用停機(jī),不用看北京凌晨 4 點(diǎn)的風(fēng)景。

簡(jiǎn)單來說,就是在線上系統(tǒng)里面,之前所有寫庫的地方,增刪改操作,除了對(duì)老庫增刪改,都加上對(duì)新庫的增刪改,這就是所謂的雙寫,同時(shí)寫倆庫,老庫和新庫。

然后系統(tǒng)部署之后,新庫數(shù)據(jù)差太遠(yuǎn),用之前說的導(dǎo)數(shù)工具,跑起來讀老庫數(shù)據(jù)寫新庫,寫的時(shí)候要根據(jù)gmt_modified 這類字段判斷這條數(shù)據(jù)最后修改的時(shí)間,除非是讀出來的數(shù)據(jù)在新庫里沒有,或者是比新庫的數(shù)據(jù)新才會(huì)寫。簡(jiǎn)單來說,就是不允許用老數(shù)據(jù)覆蓋新數(shù)據(jù)。

導(dǎo)完一輪之后,有可能數(shù)據(jù)還是存在不一致,那么就程序自動(dòng)做一輪校驗(yàn),比對(duì)新老庫每個(gè)表的每條數(shù)據(jù),接著如果有不一樣的,就針對(duì)那些不一樣的,從老庫讀數(shù)據(jù)再次寫。反復(fù)循環(huán),直到兩個(gè)庫每個(gè)表的數(shù)據(jù)都完全一致為止。

接著當(dāng)數(shù)據(jù)完全一致了,就 ok 了,基于僅僅使用分庫分表的最新代碼,重新部署一次,不就僅僅基于分庫分表在操作了么,還沒有幾個(gè)小時(shí)的停機(jī)時(shí)間,很穩(wěn)。所以現(xiàn)在基本玩兒數(shù)據(jù)遷移之類的,都是這么干的。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容