Docs 菜单
Docs 主页
/
MongoDB Cluster-to-Cluster Sync
/

同步分片集群

在此页面上

  • 配置单个 mongosync实例
  • 配置多个mongosync实例
  • 启动多个mongosync实例
  • 检查进度
  • 暂停mongosync实例
  • 恢复同步
  • 从多个mongosync实例提交同步
  • 数据验证
  • 反转同步方向

有两种方法可以同步分片的集群。 您可以使用一个 mongosync或多个mongosync实例。 为了在大型或重载集群中获得最佳性能,请为源集群分片的每个分片使用一个mongosync实例。

重要

当源集群或目标集群是分片集群时,您必须停止这两个集群上的负载负载均衡器,并且在迁移期间不得运行moveChunkmoveRange 命令。要停止负载均衡器,请运行balancerStop 命令并等待命令完成。

要配置单个mongosync ,请按照集群架构的连接说明连接到集群中的mongos实例。

将单个 mongosync 连接到分片集群时,请勿使用 replicaSet 选项或 id 选项。

本页的其余部分将介绍如何使用多个mongosync实例进行集群到集群的同步。

mongosync实例的数量必须与源集群上的分片数量相匹配。 您必须在所有实例之间使用相同版本的mongosync 。 对于副本集源,您只能使用一个mongosync实例。

当您配置多个mongosync实例在分片集群之间同步时,您必须向每个mongosync实例发送相同的 API 端点命令。

要配置多个mongosync实例:

  1. 验证集群配置

  2. 确定分片 ID

  3. 连接实例

1

mongosync 1.1 开始,您可以在具有不同分片数量的集群之间进行同步。 但是,如果要反向同步,源集群和目标集群必须具有相同数量的分片。

2

要获取分片 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 })
}
]
3

这些说明使用通用连接字符串。 要修改集群架构的连接字符串,请参阅架构特定的连接详细信息。

提示

单个主机服务器可以运行多个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选项标识的源集群复制单个分片。

  • 指定同步期间使用的唯一端口。 请考虑指定一系列端口以简化集群到集群同步操作的脚本编写。

使用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 调用。

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 27601mongosync实例上恢复同步。 要在其他分片上恢复同步,请更新主机和端口号,然后对每个mongosync实例重复执行 API 调用。

当您想要完成同步时,请发出进度命令并检查canCommitlagTimeSeconds的值。

为了最大限度地减少源集群上的写入阻塞,应仅在lagTimeSeconds值对于应用程序而言足够小时时运行commit命令。

如果lagTimeSeconds值足够小,并且canCommittrue ,则发出提交命令以提交同步。 对所有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 27601mongosync实例的进度和提交同步。 要同步所有分片,请在任何其他可能正在运行的mongosync实例上额外调用progresscommit

在将应用程序负载从源集群转移到目标集群之前,请检查数据以确保同步成功。

有关详细信息,请参阅验证数据传输。

注意

要反向同步,使原始目标集群充当源集群:

  • 如果尚未执行此操作,请向每个mongosync实例发出提交命令,并等待所有提交完成。 要检查同步进程是否已提交,请向所有mongosync实例发出进度命令,并查看每个响应的state字段是否包含值COMMITTED

  • 向每个mongosync实例发出反向命令。

reverse操作处于阻塞状态。 直到对每个mongosync实例调用了reverse后, reverse命令才会返回。

curl mongosync01Host:27601/api/v1/reverse -XPOST --data '{}'

此命令可反转在mongosync01Host上运行并使用port 27601mongosync实例的同步。 对任何其他可能正在运行的mongosync实例额外调用reverse

注意

仅当在启动 API启动mongosync时将reversibleenableUserWriteBlocking都设置为true时,才能实现反向同步。

后退

将副本集同步到分片集群