假設(shè)我們的應(yīng)用現(xiàn)在使用了具有兩個分片的數(shù)據(jù)集群,通過關(guān)鍵字哈希的方式進(jìn)行路由,如下圖所示。

因為兩個分片已經(jīng)不能滿足容量的需求,所以現(xiàn)在需要擴(kuò)容到4個分片,達(dá)到原來兩倍的總大小,因此我們需要遷移。
遷移的具體過程如下。
1. 雙寫
按照新規(guī)則和舊規(guī)則同時往新新舊數(shù)據(jù)系統(tǒng)中寫數(shù)據(jù),如下圖所示。

這里,我們?nèi)匀话凑张f的規(guī)則,也就是關(guān)鍵字哈希除以2取余來路由分片,同時按照新的規(guī)則,也就是關(guān)鍵字哈希除以4取余來路由到新的4個分片上,來完成數(shù)據(jù)的雙寫。
2. 遷移歷史數(shù)據(jù)
把舊緩存集群中的歷史數(shù)據(jù)讀取出來,按照新的規(guī)則寫到新的數(shù)據(jù)集群中,如下圖所示。

在這個過程中,我們需要遷移歷史數(shù)據(jù),在遷移的過程中可能需要遷移工具,這也需要一部分開發(fā)工作量。在遷移后,我們還需要對遷移的數(shù)據(jù)進(jìn)行驗證,表明我們的數(shù)據(jù)遷移成功。
3. 切讀
把應(yīng)用層所有的讀操作路由到新的數(shù)據(jù)集群上,如下圖所示。

image.png
在這一步驟里,把應(yīng)用中讀取的操作的數(shù)據(jù)源轉(zhuǎn)換成新的數(shù)據(jù)集群,這是應(yīng)用的讀寫操作已經(jīng)完全發(fā)生在新的數(shù)據(jù)庫集群上了。這一步一般不需要上線代碼,我們會在一開始上雙寫時就實現(xiàn)開關(guān)邏輯,這里只需要將讀的開關(guān)切換到新的集群即可。
4. 下線雙寫
在這一步,我們把寫入舊的集群的邏輯下線,,如下圖所示。

這一步通常是在雙寫和切讀后驗證沒有任何問題,并保證數(shù)據(jù)一致性的情況下,才把這部分代碼下線。同時可以把舊的分片下線,如果是擴(kuò)容的場景,并且重用了舊的分片1和分片2,則還可以清理分片1和分片2中的冗余數(shù)據(jù)。
可以用“軟著陸”來形容雙寫遷移方案,這和新領(lǐng)導(dǎo)上任后,一般先招心腹,慢慢的替代老下屬的職責(zé),慢慢淘汰老下屬,慢慢實現(xiàn)軟著陸如出一轍。
更多的關(guān)于“通用架構(gòu)師應(yīng)該如何把控遷移技術(shù)方案”的內(nèi)容,請參加艷鵬在gitchat上的嘮嗑節(jié)目。
