背景
模塊A需要改造由原有的表TA1換成TA2,在這種情況下模塊B的表TB1中TBColumn1中數(shù)據(jù)要變更拭抬。
數(shù)據(jù)遷移要考慮的點
1.盡量線下遷移(減少發(fā)布新版本代碼后 舊數(shù)據(jù)不可用的范圍)
2.盡量不動原有的數(shù)據(jù),在保留原有數(shù)據(jù)的基礎(chǔ)上耻涛,任何時候都可以回滾代碼(數(shù)據(jù)非常重要)醇王。
3.盡量少的人工操作。
由于盡量線下刷庫的原則班缎,所以我們在B模塊表TB1中增加TBColumn2列存儲遷移后的數(shù)據(jù),此時B模塊老代碼引用TBcolumn1新代碼引用TBColumn2她渴,所以可以隨時切換达址。(又是一個空間換時間的方法)
根據(jù)上面幾點的考慮,我們采用線下全量刷庫 + 線上自動增量同步(定時任務(wù))趁耗。
具體邏輯是:
1. A 模塊線下刷庫(更新數(shù)據(jù)庫DDL腳本同時遷移數(shù)據(jù))沉唠,同時提供映射表給B。
2. B 模塊線下刷庫(更新數(shù)據(jù)庫DDL腳本同時遷移數(shù)據(jù))苛败。
3. A 满葛,B模塊同時發(fā)布代碼。
4. A模塊中定時任務(wù)掃描 就代碼產(chǎn)生的增量數(shù)據(jù)同步刷新著拭,同時同步通知B模塊更新纱扭。
//當(dāng)然也可以B模塊主動去A模塊查詢增量就數(shù)據(jù)。
5. 遷移完成后刪除 A,B 模塊中冗余(無用)的列儡遮,比如B模塊中刪除原有的TBColumn1列。
工作中具體實現(xiàn)示意圖
遷移工作共涉及到的細節(jié)
1.以企業(yè)為維度進行遷移暗赶,灰度一家企業(yè)遷移一家鄙币。
2.遷移具體時序:刷描述、刷數(shù)據(jù)蹂随、刪除舊數(shù)據(jù)十嘿。
3.支持冪:即我要多次刷程序也可以保證使用。
4.邊界條件: 如果沒有開通客戶賬戶的企業(yè)過來怎么辦岳锁,所以需要判斷客戶賬戶是否開啟绩衷。
由于需要支持冪等且程序中任何一部都可能導(dǎo)致失敗(有可能是網(wǎng)絡(luò)等外部原因激率、也有可能是程序代碼)咳燕,比如刷描述(成功)-> 刷數(shù)據(jù)(失敗)乒躺。那我要下次接著刷招盲,此時刷描述就需要可以多次刷。
那么進入細節(jié)分析其應(yīng)有的場景如下:
場景1:刷描述 嘉冒、刷數(shù)據(jù)曹货、成功->刪除回款描述咆繁。
場景2:
1).刷描述、刷數(shù)據(jù)顶籽、失敗->回款描述不用刷玩般。
2).刷描述、刷數(shù)據(jù)(回款field的描述沒有刪除可以繼續(xù)刷)礼饱、成功->刪除回款描述坏为。
感想
1).任何東西你要認真想一下才能帶入,把細節(jié)考慮好慨仿。
2).怎么帶入細節(jié)久脯,先描述最簡單的場景再逐步深入。比如(幾千萬個app往服務(wù)器定時上報內(nèi)容)app-> server镰吆,你先考慮怎么發(fā) -> 考慮數(shù)據(jù)量大了怎么處理 (a).如果消息不需要立馬再現(xiàn)帘撰,可以采用隊列緩沖。 b).如果立馬在數(shù)據(jù)庫再現(xiàn)可以采用熱點賬戶万皿,把update變成insert操作)摧找。