假設(shè)我們的應(yīng)用現(xiàn)在使用了具有兩個(gè)分片的數(shù)據(jù)集群作彤,通過(guò)關(guān)鍵字哈希的方式進(jìn)行路由,如下圖所示乌逐。
因?yàn)閮蓚€(gè)分片已經(jīng)不能滿足容量的需求竭讳,所以現(xiàn)在需要擴(kuò)容到4個(gè)分片,達(dá)到原來(lái)兩倍的總大小浙踢,因此我們需要遷移绢慢。
遷移的具體過(guò)程如下。
1. 雙寫(xiě)
按照新規(guī)則和舊規(guī)則同時(shí)往新新舊數(shù)據(jù)系統(tǒng)中寫(xiě)數(shù)據(jù)洛波,如下圖所示胰舆。

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

在這個(gè)過(guò)程中女嘲,我們需要遷移歷史數(shù)據(jù),在遷移的過(guò)程中可能需要遷移工具诞帐,這也需要一部分開(kāi)發(fā)工作量欣尼。在遷移后,我們還需要對(duì)遷移的數(shù)據(jù)進(jìn)行驗(yàn)證停蕉,表明我們的數(shù)據(jù)遷移成功愕鼓。
3. 切讀
把應(yīng)用層所有的讀操作路由到新的數(shù)據(jù)集群上,如下圖所示慧起。
image.png
在這一步驟里菇晃,把應(yīng)用中讀取的操作的數(shù)據(jù)源轉(zhuǎn)換成新的數(shù)據(jù)集群,這是應(yīng)用的讀寫(xiě)操作已經(jīng)完全發(fā)生在新的數(shù)據(jù)庫(kù)集群上了蚓挤。這一步一般不需要上線代碼磺送,我們會(huì)在一開(kāi)始上雙寫(xiě)時(shí)就實(shí)現(xiàn)開(kāi)關(guān)邏輯,這里只需要將讀的開(kāi)關(guān)切換到新的集群即可灿意。
4. 下線雙寫(xiě)
在這一步估灿,我們把寫(xiě)入舊的集群的邏輯下線,缤剧,如下圖所示馅袁。
這一步通常是在雙寫(xiě)和切讀后驗(yàn)證沒(méi)有任何問(wèn)題,并保證數(shù)據(jù)一致性的情況下鞭执,才把這部分代碼下線司顿。同時(shí)可以把舊的分片下線,如果是擴(kuò)容的場(chǎng)景兄纺,并且重用了舊的分片1和分片2大溜,則還可以清理分片1和分片2中的冗余數(shù)據(jù)。
可以用“軟著陸”來(lái)形容雙寫(xiě)遷移方案估脆,這和新領(lǐng)導(dǎo)上任后钦奋,一般先招心腹,慢慢的替代老下屬的職責(zé)疙赠,慢慢淘汰老下屬付材,慢慢實(shí)現(xiàn)軟著陸如出一轍。
更多的關(guān)于“通用架構(gòu)師應(yīng)該如何把控遷移技術(shù)方案”的內(nèi)容圃阳,請(qǐng)參加艷鵬在gitchat上的嘮嗑節(jié)目厌衔。