面試官心理分析
你看看幅恋,你現(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ù)遷移之類的,都是這么干的霜定。