在使用Data Transmission Service(DTS)同步/遷移包含TTL(Time-To-Live)索引的MongoDB集合時,可能會遇到任務產生延遲和資料不一致問題。本方案通過在同步/遷移期間臨時修改目標端TTL索引的到期時間,確保資料同步/遷移的效率與一致性。
業務情境說明
在業務發展或架構升級中,需要將一個包含大量使用TTL索引的集合(例如,使用者會話、日誌、臨時快取資料)的MongoDB執行個體,通過DTS進行全量和增量資料同步/遷移至新的MongoDB執行個體。核心目標是確保同步/遷移過程平滑、高效,無資料丟失,且對業務影響最小。
然而,TTL索引的自動刪除機制與DTS的資料同步機制存在衝突,可能導致同步/遷移任務產生延遲和資料不一致問題。原因分析如下:
增量寫入時DELETE未命中資料,影響同步/遷移效率:源端TTL索引在刪除到期資料時,會在Oplog中產生DELETE記錄,DTS會同步該DELETE行為。如果此時目標端的TTL索引已刪除相應的資料,將導致DTS在批量寫入時出現DELETE未命中資料的情況,即MongoDB引擎返回的影響行數與預期行數不符,從而進入異常處理邏輯分支,影響遷移效率。
TTL索引非即時刪除到期資料導致資料不一致:MongoDB的TTL索引刪除資料並非即時執行,因此可能出現到期資料在源端依然存在,而在目標端已被刪除的情況。這將導致資料不一致的現象。
樣本案例:
由於MongoDB的Oplog/ChangeStream中對於UPDATE操作只記錄被更新的欄位,不記錄資料更新前後所有欄位的值,因此當UPDATE未命中資料時採用忽略此次UPDATE的策略。
時序
源端
目標端
1
業務INSERT資料
2
DTS同步INSERT資料
3
資料已到期但未被TTL索引刪除
4
業務UPDATE資料(如:UPDATE了TTL索引欄位,修改到期時間)
5
TTL索引刪除資料
6
DTS同步UPDATE未命中資料,忽略此次操作
此時目標端MongoDB執行個體上會缺少這條資料。
最佳實務
為規避目標端MongoDB的TTL索引在刪除到期資料時對DTS資料同步產生的影響,核心邏輯是在DTS同步/遷移的整個過程中(包括全量和增量同步處理/遷移)暫時停用目標端資料庫的TTL索引功能,待同步/遷移切換完成後再行恢複。
流程如下:
同步/遷移前準備:在源端資料庫,通過指令碼識別並備份所有含TTL索引的集合及其到期時間配置。
檢查並修改目標端配置:
請首先檢查目標端是否已包含待同步/遷移的集合以及TTL索引。
若無:請先使用結構遷移將集合約步至目標端,並串連到目標端資料庫,將已識別的TTL索引的到期時間修改為一個資料庫允許的最大值,使其在同步/遷移期間不會觸發自動刪除。
若有:在啟動DTS任務前,串連到目標端資料庫,將已識別的TTL索引的到期時間修改為一個資料庫允許的最大值,使其在同步/遷移期間不會觸發自動刪除。
執行DTS同步/遷移並監控:正常配置並啟動DTS的全量及增量同步處理任務,並持續監控關鍵計量以確保同步/遷移過程的穩定性和健康度。由於目標端的TTL索引已失效,DTS可以無衝突地同步源端的所有插入、更新和刪除操作,避免了效率下降和資料不一致的風險。
在DTS控制台建立並啟動資料同步/遷移任務。
在同步/遷移過程中,重點監控以下指標:
DTS任務延遲:在DTS控制台任務詳情頁查看,確保增量同步處理延遲處於較低水平。
目標端執行個體儲存空間使用率:在目標端MongoDB執行個體中查看。由於目標端資料不會到期,儲存空間使用量會持續增長,需確保空間充足。
同步/遷移後恢複:在DTS完成同步且業務流量切換至新執行個體後,使用同步/遷移前備份的配置,將目標端資料庫的TTL索引恢複至原始的到期時間。恢複後,MongoDB的後台線程會開始清理在同步/遷移期間積壓的到期文檔。
注意事項:
在DTS增量同步處理/遷移過程中,源端TTL索引刪除到期資料的行為將被DTS同步至目標端。
在延長目標端TTL索引的到期時間後,若在DTS全量同步/遷移期間或DTS增量同步/遷移存在延遲,目標端MongoDB將會出現源端已到期的資料。因此,需根據源端的寫入量適當擴大目標端MongoDB執行個體的儲存空間。
若同步對象中的TTL索引到期時間較短(例如在臨時資料或日誌情境中),則不建議進行存量資料的同步/遷移。在極端情況下,可能會出現全量同步/遷移的資料在目標端迅速到期,從而導致目標端資料為空白的現象。業務方面可考慮採用雙寫或僅進行增量同步處理/遷移的方案。