迁移 mongomirror
在此页面上
mongomirror
是一个工具,用于将数据从现有的 MongoDB 副本集手动迁移到 MongoDB Atlas 副本集。mongomirror
不要求您关闭现有副本集或应用程序,也不导入用户、角色数据或复制 config
数据库。
将 mongomirror
用于:
将数据集从 MongoDB Atlas 外部托管的 MongoDB 部署 一次性迁移到 MongoDB Atlas 集群。
将数据集从一个 Atlas 集群一次性迁移到一个 Atlas 集群。
另请参阅选择数据导入和迁移工具。
先决条件
源 MongoDB 部署
源 MongoDB 部署必须是副本集。如果源是独立运行的 MongoDB 部署,则在运行
mongomirror
之前, 应将独立运行转换为副本集。源副本集必须运行 2.6 或更高版本的 MongoDB。
源MongoDB副本集不能是
M0
免费集群或M2/M5
共享集群。在此过程中,始终请勿更改
featureCompatibilityVersion
标志。从 MongoDB 4.4 或更早版本迁移到运行 MongoDB 5.0 或更高版本的 Atlas 集群时,请从集合中删除任何 geoHaystack 索引。
mongomirror
与 TTL 索引不兼容。删除所有现有 TTL 索引,并在迁移流程完成后重建它们。如果因其对查询性能十分重要而不想删除现有索引,则请 联系支持人员 以了解备用选项。在迁移过程中,不要对命名空间进行任何更改,例如使用
renameCollection
命令或执行包含$out
聚合阶段的聚合管道。您不能将
renameCollection
命令或$out
聚合阶段用作初始同步的一部分,初始同步作为mongomirror
进程的一部分运行。在迁移的初始同步阶段,不得重新启动主节点。
如果 MongoDB 部署包含的索引的键值超过索引键值限制,则在启动实时迁移之前修改索引,使其不包含过大的键值。
源副本集所需的访问权限
mongomirror
必须具有源副本集的网络访问权限。如果源副本集需要身份验证,则须在运行 mongomirror
时包含用户档案。您必须指定至少具有以下特权的数据库用户:
读取所有数据库和集合。
admin
数据库上的readAnyDatabase
角色满足了此要求。阅读 oplog。参见 Oplog 访问权限。
运行
getParameter
命令。
如果不存在这样的用户,请在源 MongoDB 副本集中创建该用户。不同的 MongoDB 服务器版本有不同的内置角色。根据 MongoDB Server 版本选择内置角色,然后在 mongosh
: 中运行相应命令:
对于源集群,用户必须拥有
readAnyDatabase
、clusterMonitor
和backup
角色。要验证将运行实时迁移过程的数据库用户是否具有这些角色,请在
admin
数据库上运行 db.getUser() 命令。use admin db.getUser("admin") { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "roles" : [ { "role" : "backup", "db" : "admin" }, { "role" : "clusterMonitor", "db" : "admin" } { "role" : "readAnyDatabase", "db" : "admin" } ] } ... 此外,源集群的数据库用户必须具有读取
admin
数据库的 oplog 的角色。如需了解更多信息,请参阅 Oplog 访问权限。对于运行 MongoDB 3.4 的源集群,用户至少必须拥有
clusterMonitor
和readAnyDatabase
角色。例如:use admin db.createUser( { user: "mySourceUser", pwd: "mySourceP@$$word", roles: [ "clusterMonitor", "readAnyDatabase" ] } ) 对于运行 MongoDB 3.2 的源集群,用户必须至少拥有
clusterManager
和readAnyDatabase
角色,以及对local
数据库的读取权限。为此,需要一个自定义角色,而您可使用以下命令创建该角色:use admin db.createRole( { role: "migrate", privileges: [ { resource: { db: "local", collection: "" }, actions: [ "find" ] } ], roles: ["readAnyDatabase", "clusterManager"] } ) db.createUser( { user: "mySourceUser", pwd: "mySourceP@$$word", roles: [ "migrate" ] } ) 对于运行 MongoDB 2.6 或 3.0 的源集群,用户必须至少拥有
readAnyDatabase
角色。例如:use admin db.createUser( { user: "mySourceUser", pwd: "mySourceP@$$word", roles: [ "readAnyDatabase" ] } )
目标 Atlas 部署
目标 Atlas 部署:
不能是
M0
免费集群、M2
或M5
共享集群。不能是无服务器实例。
必须是副本集。
必须采用与源集群 MongoDB 版本相同或更高的版本。请参阅升级路径。
不得包含任何与源集群重叠的命名空间。如果
mongomirror
在目标集群上检测到重叠的命名空间,它则会在启动此流程之前失败。如果目标集群包含重叠的命名空间,请使用--drop
从目标集群中删除所有数据,或是使用--includeNamespace
列出要从源集群导入的命名空间。必须在其 IP 访问列表中包含以下任一对象:
运行
mongomirror
的服务器的公共 IP 地址,或是如果设置为 VPC 对等互连,则为对等方的 VPC CIDR 区块(或子集) 或对等 VPC 的安全组。
注意
要查找集群中任何节点的公共 IP 地址,请从命令行使用
nslookup
工具。要了解更多信息,请参阅 Atlas 集群的公网 IP 是否有变化?
目标集群所需的访问权限
mongomirror
必须具有目标集群的网络访问权限。
必须指定具有 Atlas admin
角色的数据库用户才能运行 mongomirror
。要了解更多信息,请参阅添加数据库用户。
升级路径
重要
mongomirror
MongoDB6.0 + 源集群和6.0 + 目标集群之间的迁移不支持mongomirror
。您不能使用 从源副本集6 迁移。0 .x 或更高版本迁移到目标副本集6 0。 .x 或更高版本。
您可以使用mongomirror
从以前版本上的源副本集迁移到MongoDB版本6.0 的目标副本集。
mongomirror
支持以下迁移路径。
Source Replica Set MongoDB Version | Target Atlas Replica Set MongoDB Version |
---|---|
5.0 | 6.0 |
4.4 | 6.0 |
4.2 | 6.0 |
4.0 | 6.0 |
3.6 | 6.0 |
3.4 | 6.0 |
3.2 | 6.0 |
3.0 | 6.0 |
2.6 | 6.0 |
立即下载 mongomirror
注意
在 macOS 64位上,下载mongomirror
文件后首次尝试打开时,会显示安全警报。 要继续,请参阅 通过覆盖安全设置打开应用。
操作系统 | 立即下载 |
---|---|
Amazon Linux 1 | |
Amazon Linux 2 | |
Debian 9.2 | |
Debian 10 | |
macOS 64 位 | |
RHEL 6.2 | |
RHEL 7.0 | |
RHEL 7.1 PPC 64 LE | |
RHEL 7.2 s390x | |
RHEL 8.0 | |
RHEL 8.1 PPC 64 LE | |
SLES 12 | |
SLES 15 | |
Ubuntu 14.04 | |
Ubuntu 16.04 | |
Ubuntu 16.04 ARM | |
Ubuntu 18.04 | |
Ubuntu 18.04 ARM | |
Ubuntu 20.04 | |
Ubuntu 20.04 ARM | |
Windows |
mongomirror
处理
当您启动 mongomirror
时,它会:
通过 TLS/SSL 连接到 Atlas。
执行初始同步,将现有 MongoDB 副本集中的集合复制到 Atlas 中的目标集群。
在初始同步之后,持续跟踪副本集的oplog以获取传入的更改,并在Atlas中的目标集群上重放这些更改。
mongomirror
config
不会复制mongomirror
数据库。如果您在源集群或目标集群上启用线路压缩,则--compressors
会使用线路压缩,并使用 指定允许使用哪些压缩库。mongomirror
会在前台的目标集群上构建所有索引,而无论索引是如何在源集群上构建的。前台索引构建会区块对数据库的所有其他操作。要学习;了解更多信息,请参阅对已填充集合的索引构建操作。
一旦启动,mongomirror
就会持续运行,直到关闭为止:
如果您在初始同步阶段关闭
mongomirror
,则在重新启动mongomirror
之前,请检查目标集群是否为空,或者运行mongomirror
并附带--drop
。如果在 oplog 追踪阶段关闭
mongomirror
,进程将停止追踪 oplog 。您可以重新启动mongomirror
,使用--bookmarkFile
. 从最后一条已处理的 oplog 记录继续追踪。
运行 mongomirror
在源副本集中设置数据库用户。
如果源副本集需要身份验证,您必须在运行 mongomirror
时包含用户凭证。有关要求,请参阅源副本集所需的访问权限。
请记下该用户的用户名和密码,因为运行 mongomirror
时必须指定这些档案。
AtlasGoDatabase Access在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
在侧边栏中,单击 Security 标题下的 Database Access。
显示数据库访问页面。
在目标 Atlas 集群中设置数据库用户。
必须指定具有 Atlas admin
角色的数据库用户才能运行 mongomirror
。有关创建数据库用户的文档,请参阅添加数据库用户。
如果不存在该用户,则创建该用户:
如果尚未显示,请单击 Database Users 标签页。
单击 Add New Database User(添加新的数据库用户)。
添加 Atlas admin 用户。
请记下为新用户选择的用户名和密码,在运行 mongomirror
时必须指定这些凭据。
更新 IP 访问列表。
如果您运行 mongomirror
时所使用的主机不在集群的 IP 访问列表中,请更新该列表。您可以指定以下任一项:
将运行
mongomirror
的服务器的公共 IP 地址,或者如为 VPC 对等设置,则为对等方的 VPC CIDR 块(或子网)或对等方 VPC 的安全组。
AtlasGoClusters在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果尚未出现,请单击侧边栏中的 Clusters(集群)。
会显示集群页面。
复制目标集群主机信息。
您可以从 Atlas 用户界面获取 Atlas 集群的主机名信息。
注意
使用 mongomirror
迁移数据时,无需使用驱动程序。
在 Connect 对话框中单击 Shell。
从下拉列表中选择 3.4 or earlier。连接字符串应类似于以下示例。为便于阅读,此示例已分为多行:
mongodb://<db_username>:<db_password>@ 00.foo.mongodb.net:27017, 01.foo.mongodb.net:27017, 02.foo.mongodb.net:27017/test? ssl=true&replicaSet=myAtlasRS&authSource=admin 在文本编辑器中,粘贴
replicaSet
的值,添加正斜杠 (/
),然后将主机列表追加为逗号分隔值,如下例所示:myAtlasRS/00.foo.mongodb.net:27017,01.foo.mongodb.net:27017,02.foo.mongodb.net:27017
在下一步中,将此值用于 --destination
。
要完成迁移过程,请切换到 Atlas。
切换到 Atlas
在 mongomirror
完成初始同步并跟踪副本集的 oplog 后,您可以切换到目标 Atlas 集群。
更新客户端应用程序,使用 Atlas 集群。
通过集群面板上的 Connect(连接)按钮提供的 Atlas 连接字符串,更新客户端应用程序。
有关连接 Atlas 的详细信息,请参阅通过驱动程序连接。
监控
mongomirror
会将其进度记录到终端中的标准输出。初始同步期间,mongomirror
会为其复制的每个集合记录一个进度条。例如:
2021-08-09T16:35:50.227-0000 [#....................] park.events 2179/34184 (6.4%) 2021-08-09T16:35:50.227-0000 [#############........] zoo.animals 29000/49778 (58.3%)
跟踪 oplog 时,mongomirror
会记录源集群上的最新 oplog 条目与目标集群上最后处理的 oplog 条目之间的滞后时间(以秒为单位)。例如:
2016-12-12T16:22:17.027-0800 Current lag from source: 6s
6 秒的延迟时间意味着处理的最后一个 oplog 条目 mongomirror
比源集群上可用的最新条目早 6 秒。
注意
mongomirror
赶上此滞后的用时可能大于或小于 6 秒,具体取决于每秒到达的条目数。
0 秒延迟时间表示 mongomirror
正在处理比最新 oplog 条目晚到一秒以内的条目。
如果源集群具有索引,则 mongomirror
将在目标集群上建立相同的索引。进度日志显示索引建立过程的开始时间和结束时间。要查看索引建立进度,您可以:
在目标集群的主节点上使用 currentOp 命令。
command
字段显示有关运行操作的信息。索引构建条目如下所示:"command" : { "createIndexes" : "perfs", "indexes" : [ { "key" : { "animal" : "text" }, "name" : "animal_text" } ]... 下载目标集群的 mongodb 日志,然后搜索索引相关行的最新条目。与索引构建相关的日志消息如下所示:
{"t":{"$date":"2021-08-09T16:35:50.227+00:00"},"s":"I", "c":"INDEX", "id":20447, "ctx":"conn1080","msg":"Index build: completed","attr":{"buildUUID":{"uuid":{"$uuid":"c4a62739-bf19-456d-bbd6-7baa29f1063b"}}}}
性能
为避免争用网络和 CPU 资源,请在副本集的 mongod
实例主机以外的主机上运行 mongomirror
。
mongomirror
会影响源副本集的性能,其效果类似于存在从节点:对于初始同步阶段,负载会随着数据集的大小而扩展变化。
初始同步完成后,负载会以每小时使用 oplog 千兆字节的速度递增。
事务语法, Options, and Examples
有关mongomirror
事务语法、选项和示例,请参阅mongomirror 参考页面。
故障排除
对于 mongomirror
故障排除,请参阅实时迁移(拉取)的常见验证后错误。