不停機無故障遷庫

2021-09-25 18:26:35 字數 1566 閱讀 9832

之前有寫過mongodb不停機遷移庫思路

但這次不僅是遷庫,而且要重構**,要搞乙個新服務出來,db要遷移到新庫中,要求不停機無故障,完成新服務上線和資料遷移,資料量是億級別的。

停機遷移:

功能暫停指的是:停止對資料庫進行讀和寫,系統返回降級資料或隨機資料。

先建立新服務,新服務只做**,將所有的讀、寫請求**到老系統(老系統最終會下掉) 

=> 提前寫好資料遷移指令碼 

=> 功能暫停 

=> 跑遷移指令碼,完成資料遷移 

=> 上線新系統和新儲存。

不停機遷移。

方法一:先建立新服務,新服務只做**,將所有的讀、寫請求**到老系統 

=> 將所有對老系統的呼叫,改為呼叫新系統

=> 新系統實現單寫雙讀

=> 跑資料遷移指令碼,完成資料遷移,做閱讀使用者的merge

=> 系統實現單讀單寫,只對新庫讀寫,去掉舊庫的操作 

=> 遷移完成。

方法二:改舊**

=>多乙個操作就是寫新庫(雙寫單讀就庫)

=>將遷庫指令碼提前完成,等上完雙寫後,然後執行遷庫指令碼

=>跑完資料後,上線新服務,全量切過來,如果不一下全量,新服務還得雙寫(不考慮上線時候的服務重啟造成的資料不一致)

最終選擇

方案比較:

方法一:需要先上線 個**服務,編寫多餘的**

方法二:切量時候需要全量去切,比較危險。想要灰度的時候**量也不少

最主要的是舊**亂成了一鍋粥,不好改,容易出錯,所以最終還是選擇了方法一

如何保證資料遷移的順利

1.保證指令碼掛掉再執行不會把重複資料寫到新庫里

這個一開始討論的時候,是因為遷閱讀數的時候遇到了乙個問題, 服務**裡,做了雙讀操作,全部閱讀數=舊庫閱讀數+新庫閱讀數。 再執行遷移的指令碼時,遷移完成的某條  新庫閱讀數=全部閱讀數。 此時如果按照服務**裡的加法,那就會多出來了閱讀數,直到遷移完成下掉合併舊庫閱讀數操作。 這個該如何解決?

我首先想到的就是遷完一條刪一條,但是這樣不好,如果資料遷錯了,庫里的資料又被刪光了,這就不好辦了。最終大佬決定遷移完成的在舊庫里set乙個新字段過去,表示該條資料被遷移過了。服務**裡,取舊庫的時候,如果看到了這個欄位就不去加舊的閱讀數了。同時遷庫指令碼裡也是,如果掛掉重啟後,有該字段的跳過,不遷移就不會有重複資料了。

2.遍歷億級資料

mongodb遍歷億級資料,這個一搜就能看到好幾個方法

方法一:用光標的方法

方法二:利用時間戳(前提要建好索引),sort limit 200條,然後記錄下最新的乙個時間戳,下次從這個時間戳開始。

正好舊庫里是_id是整形id,也有索引,所以就選擇了這個方法。

在寫遷庫指令碼時,也發現了資料存在的一些特點,要遷移的資料是在某個id區間內的,這下更好了,不需要幾億條資料,全都搜了。所以最終的語句如下

while(1) }).sort().limit(200)

if (empty(docs))

foreach($docs as $doc) 

}

總結:

遷庫有多種方法,要結合業務場景分析,多加思考,選擇最適合的一種就是最好的

迅為4418開發板7 24小時無故障執行 技術支援

核心板引數 核心板型別 板對板聯結器 郵票孔特點 拆裝方便,擴充套件性好 適合高震動場合 尺寸50mm 60mm pcb層數 6層pcb沉金設計 8層pcb沉金設計 聯結器高度 核心板聯結器組合高度1.5mm 04418 cpu armcortex a9 四核 s5p4418處理器 1.4ghz 6...

迅為4418開發板7 24小時無故障執行 技術支援

核心板引數 核心板型別 板對板聯結器 郵票孔 特點拆裝方便,擴充套件性好 適合高震動場合 尺寸50mm 60mm pcb層數 6層pcb沉金設計 8層pcb沉金設計 聯結器高度 核心板聯結器組合高度1.5mm 4418 cpu arm cortex a9 四核 s5p4418處理器 1.4ghz 6...