同步分片集群
在此页面上
有两种方法可以同步分片的集群。 您可以使用一个 mongosync
或多个mongosync
实例。 为了在大型或重载集群中获得最佳性能,请为源集群分片的每个分片使用一个mongosync
实例。
重要
当源集群或目标集群是分分片集群时,请停止两个集群上的负载负载均衡器,并且在整个迁移生命周期中不要运行moveChunk
或moveRange
命令。 要停止负载均衡器,请运行balancerStop
命令并等待命令完成。
配置单个mongosync
实例
要配置单个mongosync
,请按照集群架构的连接说明连接到集群中的mongos
实例。
将单个 mongosync
连接到分片集群时,请勿使用 replicaSet
选项或 id
选项。
本页的其余部分将介绍如何使用多个mongosync
实例进行集群到集群的同步。
配置多个mongosync
实例
mongosync
实例的数量必须与源集群上的分片数量相匹配。 您必须在所有实例之间使用相同版本的mongosync
。 对于副本集源,您只能使用一个mongosync
实例。
当您配置多个mongosync
实例在分片集群之间同步时,您必须向每个mongosync
实例发送相同的 API 端点命令。
要配置多个mongosync
实例:
确定分片 ID
要获取分片 ID,请连接到源集群 mongos
并运行 listShards
命令。
db.adminCommand( { listShards: 1 } )
该信息位于shards
数组中。
shards: [ { _id: 'shard01', host: 'shard01/localhost:27501,localhost:27502,localhost:27503', state: 1, topologyTime: Timestamp({ t: 1656612236, i: 2 }) }, { _id: 'shard02', host: 'shard02/localhost:27504,localhost:27505,localhost:27506', state: 1, topologyTime: Timestamp({ t: 1656612240, i: 4 }) } ]
连接mongosync
实例
这些说明使用通用连接字符串。 要修改集群架构的连接字符串,请参阅架构特定的连接详细信息。
提示
单个主机服务器可以运行多个mongosync
实例。 要提高性能,请在多个主机服务器上运行mongosync
。
运行第一个mongosync
实例:
mongosync \ --cluster0 "mongodb://user:password@cluster0host:27500" \ --cluster1 "mongodb://user:password@cluster1host:27500" \ --id shard01 --port 27601
运行多个mongosync
实例时,实例数量必须等于分片数量。 每个mongosync
实例都必须使用--id
选项或id
设置启动,以指定其复制的分片。
为源集群中的每个分片运行新的mongosync
实例。 为每个额外的mongosync
实例编辑--id
和--port
字段。
mongosync \ --cluster0 "mongodb://user:password@cluster0host:27500" \ --cluster1 "mongodb://user:password@cluster1host:27500" \ --id shard02 --port 27602
和--cluster0
--cluster1
mongos
选项的连接字符串应指向实例。在此示例中,它们使用相同的mongos
实例。
每个mongosync
实例:
连接到源集群中的
mongos
实例。连接到目标集群中的
mongos
实例。从由
--id
选项标识的源集群复制单个分片。指定同步期间使用的唯一端口。 请考虑指定一系列端口以简化集群到集群同步操作的脚本编写。
mongosync
启动多个 实例
使用curl
或其他 HTTP 客户端向每个mongosync
实例发出启动命令。
curl mongosync01Host:27601/api/v1/start -XPOST --data \ '{ "source": "cluster0", "destination": "cluster1", \ "reversible": false, "enableUserWriteBlocking": false }' curl mongosync02Host:27602/api/v1/start -XPOST --data \ '{ "source": "cluster0", "destination": "cluster1", \ "reversible": false, "enableUserWriteBlocking": false }'
所有mongosync
实例的start
命令选项必须相同。
检查进度
要查看特定分片的同步进度,请使用curl
或其他 HTTP 客户端向同步该分片的mongosync
实例发出进度命令。
curl mongosync02Host:27602/api/v1/progress -XGET
此命令检查在mongosync02Host
上运行并使用port 27602
进行同步的mongosync
实例的进度。 要检查其他分片的进度,请更新主机和端口号,然后对每个mongosync
实例重复执行 API 调用。
暂停mongosync
实例
Pause命令将暂时停止单个分片上的同步进程。 它不会暂停可能正在运行的任何其他mongosync
实例。 使用curl
或其他 HTTP 客户端向mongosync
实例发出pause
命令。
curl mongosync01Host:27601/api/v1/pause -XPOST --data '{}'
此命令暂停在mongosync01Host
上运行并使用port 27601
进行同步的mongosync
实例。 要暂停其他分片上的同步,请更新主机和端口号,然后对每个mongosync
实例重复执行 API 调用。
恢复同步
如果一个或多个mongosync
实例暂停,您可以使用恢复命令来恢复同步。 对每个暂停的mongosync
实例运行单独的resume
命令以继续同步。
使用curl
或其他 HTTP 客户端向每个mongosync
实例发出恢复命令。
curl mongosync01Host:27601/api/v1/resume -XPOST --data '{}'
此命令可在mongosync01Host
上运行并使用port 27601
的mongosync
实例上恢复同步。 要在其他分片上恢复同步,请更新主机和端口号,然后对每个mongosync
实例重复执行 API 调用。
从多个mongosync
实例提交同步
当您想要完成同步时,请发出进度命令并检查canCommit
和lagTimeSeconds
的值。
为了最大限度地减少源集群上的写入阻塞,应仅在lagTimeSeconds值对于应用程序而言足够小时时运行commit
命令。
如果lagTimeSeconds
值足够小,并且canCommit
为true
,则发出提交命令以提交同步。 对所有mongosync
实例重复该过程。
commit
操作处于阻塞状态。 直到对每个mongosync
实例调用了commit
后, commit
命令才会返回。
// Check progress curl mongosync01Host:27601/api/v1/progress -XGET // Commit curl mongosync01Host:27601/api/v1/commit -XPOST --data '{}'
这些命令仅检查在mongosync01Host
上运行并使用port 27601
的mongosync
实例的进度和提交同步。 要同步所有分片,请在任何其他可能正在运行的mongosync
实例上额外调用progress
和commit
。
数据验证
在将应用程序负载从源集群转移到目标集群之前,请检查数据以确保同步成功。
有关详细信息,请参阅验证数据传输。
反转同步方向
要反向同步,使原始目标集群充当源集群:
如果尚未执行此操作,请向每个
mongosync
实例发出提交命令,并等待所有提交完成。 要检查同步进程是否已提交,请向所有mongosync
实例发出进度命令,并查看每个响应的state
字段是否包含值COMMITTED
。向每个
mongosync
实例发出反向命令。
reverse
操作处于阻塞状态。 直到对每个mongosync
实例调用了reverse
后, reverse
命令才会返回。
curl mongosync01Host:27601/api/v1/reverse -XPOST --data '{}'
此命令可反转在mongosync01Host
上运行并使用port
27601
的mongosync
实例的同步。 对任何其他可能正在运行的mongosync
实例额外调用reverse
。
注意
仅当在启动 API启动mongosync
时将reversible
和enableUserWriteBlocking
都设置为true
时,才能实现反向同步。