面試題
現(xiàn)在有一個未分庫分表的系統(tǒng),未來要分庫分表补箍,如何設(shè)計才可以讓系統(tǒng)從未分庫分表動態(tài)切換到分庫分表上改执?
面試官心理分析
你看看,你現(xiàn)在已經(jīng)明白為啥要分庫分表了坑雅,你也知道常用的分庫分表中間件了辈挂,你也設(shè)計好你們?nèi)绾畏謳旆直淼姆桨噶耍ㄋ讲鸱帧⒋怪辈鸱窒忌ァ⒎直恚┠馗冢菃栴}來了,你接下來該怎么把你那個單庫單表的系統(tǒng)給遷移到分庫分表上去?
所以這都是一環(huán)扣一環(huán)的后豫,就是看你有沒有全流程經(jīng)歷過這個過程悉尾。
面試題剖析
這個其實從 low 到高大上有好幾種方案,我們都玩兒過挫酿,我都給你說一下构眯。
停機(jī)遷移方案
我先給你說一個最 low 的方案,就是很簡單早龟,大家伙兒凌晨 12 點開始運維惫霸,網(wǎng)站或者 app 掛個公告,說 0 點到早上 6 點進(jìn)行運維葱弟,無法訪問壹店。
接著到 0 點停機(jī),系統(tǒng)停掉芝加,沒有流量寫入了硅卢,此時老的單庫單表數(shù)據(jù)庫靜止了。然后你之前得寫好一個導(dǎo)數(shù)的一次性工具藏杖,此時直接跑起來将塑,然后將單庫單表的數(shù)據(jù)嘩嘩嘩讀出來,寫到分庫分表里面去蝌麸。
導(dǎo)數(shù)完了之后点寥,就 ok 了,修改系統(tǒng)的數(shù)據(jù)庫連接配置啥的来吩,包括可能代碼和 SQL 也許有修改敢辩,那你就用最新的代碼,然后直接啟動連到新的分庫分表上去误褪。
驗證一下责鳍,ok了,完美兽间,大家伸個懶腰,看看看凌晨 4 點鐘的北京夜景正塌,打個滴滴回家吧嘀略。
但是這個方案比較 low,誰都能干乓诽,我們來看看高大上一點的方案帜羊。
雙寫遷移方案
這個是我們常用的一種遷移方案,比較靠譜一些鸠天,不用停機(jī)讼育,不用看北京凌晨 4 點的風(fēng)景。
簡單來說,就是在線上系統(tǒng)里面奶段,之前所有寫庫的地方饥瓷,增刪改操作,除了對老庫增刪改痹籍,都加上對新庫的增刪改呢铆,這就是所謂的雙寫,同時寫倆庫蹲缠,老庫和新庫棺克。
然后系統(tǒng)部署之后,新庫數(shù)據(jù)差太遠(yuǎn)线定,用之前說的導(dǎo)數(shù)工具娜谊,跑起來讀老庫數(shù)據(jù)寫新庫,寫的時候要根據(jù) gmt_modified 這類字段判斷這條數(shù)據(jù)最后修改的時間斤讥,除非是讀出來的數(shù)據(jù)在新庫里沒有因俐,或者是比新庫的數(shù)據(jù)新才會寫。簡單來說周偎,就是不允許用老數(shù)據(jù)覆蓋新數(shù)據(jù)抹剩。
導(dǎo)完一輪之后,有可能數(shù)據(jù)還是存在不一致蓉坎,那么就程序自動做一輪校驗澳眷,比對新老庫每個表的每條數(shù)據(jù),接著如果有不一樣的蛉艾,就針對那些不一樣的钳踊,從老庫讀數(shù)據(jù)再次寫。反復(fù)循環(huán)勿侯,直到兩個庫每個表的數(shù)據(jù)都完全一致為止拓瞪。
接著當(dāng)數(shù)據(jù)完全一致了,就 ok 了助琐,基于僅僅使用分庫分表的最新代碼祭埂,重新部署一次,不就僅僅基于分庫分表在操作了么兵钮,還沒有幾個小時的停機(jī)時間蛆橡,很穩(wěn)。所以現(xiàn)在基本玩兒數(shù)據(jù)遷移之類的掘譬,都是這么干的泰演。