有两种方法可以同步分片集群。您可以使用一个 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 --cluster1mongos选项的连接字符串应指向实例。在此示例中,它们使用相同的mongos实例。
每个mongosync实例:
连接到源集群中的
mongos实例。连接到目标集群中的
mongos实例。从由
--id选项标识的源集群复制单个分片。指定同步期间使用的唯一端口。请考虑指定范围端口以简化 Mongosync 操作的脚本编写。
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时,才能实现反向同步。