全部產品
Search
文件中心

Data Transmission Service:MongoDB為源時同步/遷移含TTL索引集合最佳實務

更新時間:Jan 10, 2026

在使用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索引功能,待同步/遷移切換完成後再行恢複。

流程如下

  1. 同步/遷移前準備:在源端資料庫,通過指令碼識別並備份所有含TTL索引的集合及其到期時間配置。

    單擊展開查看樣本指令碼

    // 指令碼:尋找並列印所有TTL索引資訊
    const collections = db.getCollectionNames();
    let ttlIndexes = [];
    collections.forEach(collName => {
        const indexes = db.getCollection(collName).getIndexes();
        indexes.forEach(idx => {
            if (idx.hasOwnProperty('expireAfterSeconds')) {
                console.log(`發現TTL索引 -> 集合: ${collName}, 索引名: ${idx.name}, 到期時間: ${idx.expireAfterSeconds}秒`);
                ttlIndexes.push({
                    collection: collName,
                    name: idx.name,
                    expireAfterSeconds: idx.expireAfterSeconds
                });
            }
        });
    });
    // 將以下JSON輸出結果儲存到檔案中,用於後續步驟。
    printjson(ttlIndexes);
  2. 檢查並修改目標端配置

    1. 請首先檢查目標端是否已包含待同步/遷移的集合以及TTL索引。

    2. 若無:請先使用結構遷移將集合約步至目標端,並串連到目標端資料庫,將已識別的TTL索引的到期時間修改為一個資料庫允許的最大值,使其在同步/遷移期間不會觸發自動刪除。

    3. 若有:在啟動DTS任務前,串連到目標端資料庫,將已識別的TTL索引的到期時間修改為一個資料庫允許的最大值,使其在同步/遷移期間不會觸發自動刪除。

  3. 執行DTS同步/遷移並監控:正常配置並啟動DTS的全量及增量同步處理任務,並持續監控關鍵計量以確保同步/遷移過程的穩定性和健康度。由於目標端的TTL索引已失效,DTS可以無衝突地同步源端的所有插入、更新和刪除操作,避免了效率下降和資料不一致的風險。

    1. 在DTS控制台建立並啟動資料同步/遷移任務。

    2. 在同步/遷移過程中,重點監控以下指標:

      • DTS任務延遲:在DTS控制台任務詳情頁查看,確保增量同步處理延遲處於較低水平。

      • 目標端執行個體儲存空間使用率:在目標端MongoDB執行個體中查看。由於目標端資料不會到期,儲存空間使用量會持續增長,需確保空間充足。

  4. 同步/遷移後恢複:在DTS完成同步且業務流量切換至新執行個體後,使用同步/遷移前備份的配置,將目標端資料庫的TTL索引恢複至原始的到期時間。恢複後,MongoDB的後台線程會開始清理在同步/遷移期間積壓的到期文檔。

注意事項

  • 在DTS增量同步處理/遷移過程中,源端TTL索引刪除到期資料的行為將被DTS同步至目標端。

  • 在延長目標端TTL索引的到期時間後,若在DTS全量同步/遷移期間或DTS增量同步/遷移存在延遲,目標端MongoDB將會出現源端已到期的資料。因此,需根據源端的寫入量適當擴大目標端MongoDB執行個體的儲存空間。

  • 若同步對象中的TTL索引到期時間較短(例如在臨時資料或日誌情境中),則不建議進行存量資料的同步/遷移。在極端情況下,可能會出現全量同步/遷移的資料在目標端迅速到期,從而導致目標端資料為空白的現象。業務方面可考慮採用雙寫或僅進行增量同步處理/遷移的方案。