數據復制服務(Data Replication Service,簡稱DRS)支持在多種場景下,將源庫數據遷移到目標文檔數據庫實例,最大限度允許遷移過程中業務繼續對外提供使用,有效地將業務系統中斷時間和業務影響最小化,完成數據庫平滑遷移工作。
前提條件
使用數據復制服務進行數據遷移時,為了提高數據遷移的穩定性和安全性,請先閱讀以確保數據庫實例已滿足遷移條件。
遷移場景
- 全量遷移
該模式為數據庫一次性遷移,適用于可中斷業務的數據庫遷移場景,全量遷移將非系統數據庫的全部數據庫對象和數據一次性遷移至目標端數據庫,包括:表、視圖、存儲過程等。選擇 “全量遷移” 模式,建議停止對源數據庫的操作,否則遷移過程中源數據庫產生的新數據不會同步到目標數據庫。
- 全量+增量遷移
該模式為數據庫持續性遷移,適用于對業務中斷敏感的場景,通過全量遷移過程中完成的目標端數據庫的初始化后,增量遷移階段通過解析日志等技術,將遠端和目標端數據庫保持數據持續一致。選擇 “全量+增量” 遷移模式,增量遷移可以在全量遷移完成的基礎上實現數據的持續同步,無需中斷業務,實現遷移過程中源業務和數據庫繼續對外提供訪問。
支持的源和目標數據庫
表 支持的數據庫
| 源數據庫 | 目標數據庫 |
|---|---|
| 本地自建Mongo數據庫(3.2、3.4、4.0版本 ECS自建Mongo數據庫(3.2、3.4、4.0版本 其他云上Mongo數據庫(3.2、3.4、4.0版本,不支持騰訊云3.2版本) DDS實例(3.4、4.0版本) |
DDS實例(3.4、4.0、4.2版本) 說明:僅支持目標庫版本等于或高于源庫版本。 |
支持的遷移對象范圍
在使用DRS進行遷移時,不同類型的遷移任務,支持的遷移對象范圍不同,詳細情況可參考下表。 DRS會根據用戶選擇,在“預檢查”階段對遷移對象進行自動檢查 。
支持的遷移對象
| 類型名稱 | 使用須知 |
|---|---|
| 遷移對象范圍 | 遷移對象選擇維度:支持選擇表級、庫級或實例級(全部遷移)。 支持的遷移對象: 相互關聯的數據對象要確保同時遷移,避免遷移因關聯對象缺失,導致遷移失敗。常見的關聯關系:視圖引用集合、視圖引用視圖等。 副本集:目前只支持集合(包括驗證器,是否是固定集合),索引和視圖的遷移。? 集群:目前只支持集合(包括驗證器,是否是固定集合),分片鍵,索引和視圖的遷移。 單節點:目前只支持集合(包括驗證器,是否是固定集合),索引和視圖的遷移。? 只支持遷移用戶數據和源數據庫的賬號信息,不支持遷移系統庫(如local、admin、config等)和系統集合,如果業務數據在系統庫下,則需要先將業務數據移動到用戶數據庫下,可以使用renameCollection命令進行移出。 不支持視圖的創建語句中有正則表達式。 不支持_id字段沒有索引的集合。 不支持BinData()的第一個參數為2。 不支持范圍分片的情況下maxKey當主鍵。 支持遷移的對象有如下限制: 源數據庫的庫名不能包含/."和空格,集合名和視圖名中不能包含字符或以system.開頭。 |
數據庫賬號權限要求
在使用DRS進行遷移時,連接源庫和目標庫的數據庫賬號需要滿足以下權限要求,才能啟動實時遷移任務。不同類型的遷移任務,需要的賬號權限也不同,詳細可參考下表進行賦權。DRS會在“預檢查”階段對數據庫賬號權限進行自動檢查,并給出處理建議。
- 建議創建單獨用于DRS任務連接的數據庫帳號,避免因為數據庫帳號密碼修改,導致的任務連接失敗。
- 連接源和目標數據庫的帳號密碼修改后,請盡快修改DRS任務中的連接信息,避免任務連接失敗后自動重試,導致數據庫帳號被鎖定影響使用。
表 數據庫賬號權限
| 類型名稱 | 全量遷移 | 全量+增量遷移 |
|---|---|---|
| 源數據庫連接賬號 | 副本集:連接源數據庫的用戶需要有admin庫的readAnyDatabase權限。 單節點:連接源數據庫的用戶需要有admin庫的readAnyDatabase權限。 集群:連接源數據庫的用戶需要有admin庫的readAnyDatabase權限,有config庫的read權限。 果需要遷移源數據庫用戶和角色信息,連接源數據庫和目標庫數據庫的用戶需要有admin數據庫的系統表system.users、system.roles的read權限。 |
副本集:連接源數據庫的用戶需要有admin庫的readAnyDatabase權限,有local庫的read權限。 單節點:連接源數據庫的用戶需要有admin庫的readAnyDatabase權限,有local庫的read權限。 集群:連接源數據庫mongos節點的用戶需要有admin庫的readAnyDatabase權限,有config庫的read權限,連接源數據庫分片節點的用戶需要有admin庫的readAnyDatabase權限,有local庫的read權限。 如果需要遷移源數據庫用戶和角色信息,連接源數據庫和目標庫數據庫的用戶需要有admin數據庫的系統表system.users、system.roles的read權限。 |
| 目標數據庫連接賬號 | 連接目標數據庫的用戶需要有admin庫的dbAdminAnyDatabase權限,有目標數據庫的readWrite權限。對于目標數據庫是集群的實例,遷移賬號還要有admin庫的clusterManager權限。 | 連接目標數據庫的用戶需要有admin庫的dbAdminAnyDatabase權限,有目標數據庫的readWrite權限。對于目標數據庫是集群的實例,遷移賬號還要有admin庫的clusterManager權限。 |

用戶賦權參考語句:如連接源數據庫的用戶需要有admin庫的readAnyDatabase權限和config庫的read權限。
db.grantRolesToUser("用戶名",[{role:"readAnyDatabase",db:"admin"}, {role:"read",db:"config"}])
遷移操作
具體的遷移操作請參考《數據復制服務最佳實踐》中“MongoDB數據庫遷移”章節。