作者 | 吳守陽
審校 | 重樓
速覽
1、主要特點
2、使用場景
3、限制
4、注意事項
5、連接方式
6、使用方法
7、參數詳解
8、總結
MongoSync 是引入 MongoDB 6.0 的一個新的遷移工具,用于在不同 MongoDB 部署之間進行數據遷移。它取代了之前的 mongoexport 和mongoimport,以及mongodump 和mongorestore 的部分功能,提供了更為高效和安全的數據遷移體驗。
1、主要特點
- 實時數據遷移:MongoSync 支持實時數據遷移,可以在源和目標數據庫之間同步數據更改,確保數據的一致性和實時性。
- 增量遷移:它能夠進行增量數據遷移,這意味著在初次遷移完成后,只遷移自上次遷移以來的更改,減少了數據傳輸量和遷移時間。
- 斷點續傳:MongoSync 具備斷點續傳功能。如果遷移過程中出現中斷,可以從中斷的地方繼續遷移,避免了完全重新開始的需要。
- 數據驗證:在遷移過程中,MongoSync 會進行數據驗證,確保遷移后的數據與源數據一致。
- 多線程和并發處理:MongoSync 支持多線程和并發處理,可以利用多核CPU并行處理數據,提高遷移效率。
- 安全性和加密:在數據遷移過程中,MongoSync 可以使用加密通道,保護數據在傳輸過程中的安全。
2、使用場景
- 數據中心遷移:當需要將數據從一個數據中心遷移到另一個數據中心時。
- 云遷移:將本地部署的 MongoDB 數據遷移到云服務提供商(如 MongoDB Atlas)。
- 數據庫升級:在進行版本升級或架構調整時,將數據從舊部署遷移到新部署。
- 數據備份和恢復:作為數據備份策略的一部分,定期將數據遷移到備用數據庫。
3、限制
- 目標集群必須為空。
- MongoSync 不驗證集群或環境是否正確配置。
- 在 MongoSync 運行期間,其他客戶端不應向目標集群寫入數據。
- 如果禁用了寫入阻塞,用戶在開始提交過程前必須阻止對源集群的寫入。
- 不復制 system.* 類型的集合。
- 不支持字段名以美元符號 ($) 開頭的文檔。
- 不支持 MongoDB 無服務器(Serverless)集群。
- 不支持 MongoDB 共享層(Shared Tier)。
- 不支持可查詢加密(Queryable Encryption)。
- 無法同步在相同字段上同時定義了唯一索引和非唯一索引的集合。
- 在嘗試使用 MongoDB Atlas 集群前,應禁用“所有查詢都需要索引”選項(M10+)。
- MongoSync 不同步用戶或角色。
- MongoSync 不復制在源集群上進行的 applyOps 操作至目標集群。
- MongoSync 必須使用主讀取偏好從源集群讀取數據。
- MongoSync 不支持同步 Atlas Search 索引。
- MongoSync 僅支持使用 WiredTiger 存儲引擎的集群。
MongoDB 社區版
MongoDB 不測試社區版的集群間同步,并且在大多數情況下,不為社區部署提供集群間同步的支持。若想在 MongoDB 社區版中使用集群間同步,需聯系 MongoDB 銷售代表討論需求和定制化選項。
不支持的集合類型
- 時間序列集合不受支持。
- 設置了 expireAfterSeconds 的聚類集合不受支持。
分片集群
- MongoSync 不支持從分片集群到復制集的同步。
- 從復制集到分片集群的同步有以下限制:
- 在同步過程中,MongoSync 允許用戶重命名 sharding.shardingEntriesStart 命令選項中包含的集合。
- 在同步過程中使用 sharding.createSupportingIndexes 選項創建支持分片鍵的索引后,不能在源集群上創建這些索引。
- 在一個集合內,_id 字段在集群所有分片上必須是唯一的。
- 同步期間不能使用 movePrimary 命令重新分配主分片。
- 區域配置不會被復制,MongoSync 只復制數據,不繼承區域。
- 同步過程中不能添加或移除分片。
- MongoSync 僅同步所有分片上存在的索引。
- MongoSync 僅同步所有分片上具有一致索引規范的索引。
- 必須在整個遷移期間停止源和目標分片集群的平衡器。
- 同步過程中不得在源或目標集群上運行 moveChunk 或 moveRange 命令。
- 同步期間不能細化分片鍵或使用 reshardCollection 修改分片鍵。
反向同步
- 若舊源集群上的唯一索引部分分布在分片上,反向同步可能會導致失敗,確保反向前所有分片上有唯一索引。
- 源和目標集群的分片數量必須相同,不同拓撲或主要版本的集群無法反向同步。
多個集群
- MongoSync 不支持將多個源集群同步到單一目標集群。
- 一個集群不能同時作為 MongoSync 的源集群和目標集群。
過濾同步
- 過濾不支持反向同步。
- 開始前目標集群中不應包含用戶數據。
- 開始前目標集群中不應包含系統數據庫。
- 不能修改正在使用的過濾器,要創建新過濾器,參考替換現有過濾器。
- 只能在特定情況下重命名集合。
- 如果過濾器包含視圖但不包含基礎集合,只有視圖元數據會被同步到目標集群。
- 過濾器中不能指定系統集合或系統數據庫。
- 使用 $out 聚合階段或 mapReduce 命令(設置為創建或替換集合)時,必須配置過濾器以使用整個數據庫,不能限制過濾器到數據庫內的集合。
限制集合
- 自1.3.0版本起,集群間同步支持限制集合,但有一些限制。
- convertToCapped 和 cloneCollectionAsCapped 不受支持。
- 源集群上的限制集合在同步期間正常工作。
- 目標集群上的限制集合在同步期間會有臨時變化,沒有文檔數量的最大限制,最大集合大小為1PB,MongoSync 在提交時恢復原始的最大文檔數量和最大文檔大小。
4、注意事項
當源集群或目標集群為分片集群時,停止 balancer,并且不要在整個生命周期內運行 moveChunk 或 moveRange 命令 遷移。要停止均衡器,請運行 balancerStop 命令并等待命令完成。
5、連接方式
SRV 連接方案的形式為:
mongodb+srv://[username:password@][host.domain.TLD][:port][/defaultauthdb][?options]
標準 URI 連接方案的格式為:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
在使用MongoSync 進行集群間同步時,正確的連接字符串是至關重要的。無論是使用 SRV 還是標準 URI 方案,你都需要確保提供足夠的信息來準確地連接到源和目標集群。對于復制集,直接指定 mongod 實例;而對于分片集群,則應指定mongos 實例。通過遵循這些指南,你可以確保MongoSync 正確地初始化并執行數據同步。
6、使用方法
MongoSync 集群到集群:
shard01遷移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard01 --port 27181
shard02遷移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard02 --port 27182
shard03遷移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard03 --port 27183
檢查進度
curl mongosync01Host:27181/api/v1/progress -XGET
暫停實例MongoSync
curl mongosync01Host:27181/api/v1/pause -XPOST --data '{}'
恢復同步
curl mongosync01Host:27181/api/v1/resume -XPOST --data '{}'
mongosync01Host為創建mongosync的實例地址
7、參數詳解
--cluster0 value
用于指定第一個集群的URI,該集群可以作為數據源或目標。
--cluster1 value
用于指定第二個集群的URI,同樣可以作為數據源或目標。
--verbosity value
設置日志的詳細程度級別,可選值包括:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC(默認值為 DEBUG)。
--logPath DIRECTORY
指定日志輸出的目錄路徑。
--port value
設置HTTP API服務器的端口號(默認值為 27182)。
--id value
當使用多個 mongosync 實例時,該標志應設置為 mongosync 將負責追蹤的源分片ID。如果僅使用單個 mongosync 實例,則不應設置此標志。
--config value
指定配置文件的路徑。
--version, -v
打印 mongosync 的版本信息。
--disableTelemetry
如果設置,將禁用遙測跟蹤(默認值為 false)。
--loadLevel value
控制內部并行度參數的數字,范圍從 1(最小并行度)到 4(最大并行度)(默認值為 3)。
總結
MongoSync 是 MongoDB 6.0 提供的一種強大且靈活的數據遷移工具,它簡化了數據遷移的過程,提高了遷移的效率和安全性,是進行數據庫遷移項目的理想選擇。如果你正計劃進行數據遷移,MongoSync 值得考慮。不過,在使用之前,建議先在測試環境中試驗,以熟悉其操作流程并評估其性能影響。
作者介紹
吳守陽,51CTO社區編輯,擁有8年DBA工作經驗,熟練管理MySQL、Redis、MongoDB等開源數據庫。精通性能優化、備份恢復和高可用性架構設計。善于故障排除和自動化運維,保障系統穩定可靠。具備良好的團隊合作和溝通能力,致力于為企業提供高效可靠的數據庫解決方案。