前言
服務重構,老版系統為php代碼,新版系統改為Java。
數據層面沿用之前老版服務的數據庫結構,部分庫字段進行修改。
最終目的:服務實現切換,數據實現切換(老庫到新庫),不能停機升級,盡量減小對用戶影響。
實現方案:日志追加
下面具體說一下自己的實現方案,可能會有紕漏的地方,僅做參考。
日志追加法
-
步驟一
通過用戶執行的新增、修改、刪除操作,記錄到日志文件中,old_db不再寫入新數據。
日志的格式統一為被修改的庫、被修改的表、被修改的字段等信息。
保證日志的統一性,方便日志同步服務同步數據。
-
步驟二
開發一個數據同步服務syn-data-service,將舊庫的數據同步到新庫中。
-
步驟三
當數據同步完畢后,將new-service設置為暫不可寫數據(日志同步很快,會犧牲部分用戶體驗)。 且開發一個日志同步工具syn-log-service,將日志同步到新庫中
4,步驟四
開發一個compare-service,進行數據校驗
5,步驟五
數據沒有問題后切換為new-db,用戶執行的新增、修改、刪除 雙寫到日志和new_db中。
6,步驟六
兜底策略:如果發現數據有大規模不一致或者大規模數據丟失的情況,可以通過日志回寫到old_db中,然后切換服務到old_server。
大致步驟如上所示,可能有考慮不周全的地方,這里只是短時間的犧牲了用戶的體驗來完整數據同步的一致性。
步驟六是我多加的一個步驟,做任何事情都要想一個兜底策略,這也是我最近感觸最深的一點體驗。用於不要過分相信依賴的調用方,做好plan b。