reverse
说明
反转已提交同步操作的方向。
例如:
您有一个
COMMITTED
同步操作。cluster0
是源,cluster1
是目标。同步操作为
COMMITTED
后,新的写入仅发生在目标集群上。 源集群不会接受新的写入。
在这种情况下,您可以使用reverse
端点将写入从cluster1
同步到cluster0
,包括mongosync
到达canWrite=true
之后在cluster1
上发生的任何写入。 要在同步期间检查canWrite
状态,请使用 /progress端点。
要求
要使用reverse
端点:
mongosync
必须在初始同步开始时配置。 对/start API 端点的调用必须设置:reversible
totrue
enableUserWriteBlocking
到true
。
同步开始后,您无法更新这些选项。
mongosync
必须处于COMMITTED
状态。目标集群 oplog 在
mongosync
到达canWrite=true
和接收/reverse
请求之间不得滚动。唯一索引需要正确的格式。 如果集合的索引最初是在 MongoDB 4.2上创建的,则这些集合的格式可能不正确。
要验证集合索引是否使用正确的格式,请参阅验证唯一索引。
源集群和目标集群的分片数量必须相同。当集群具有不同的拓扑或主要版本时,将无法进行反向同步。
mongosync
连接字符串中指定的用户必须对源集群和目标集群具有所需的权限。 这些权限会有所不同,具体取决于您的环境以及您要运行写入阻塞还是反向同步。
注意
当您配置多个mongosync
实例在分片集群之间同步时,您必须向每个mongosync
实例发送相同的 API 端点命令。
有关更多信息,请参阅反向多个 Mongosync。
验证唯一索引
为了反转方向, mongosync
要求所有唯一索引使用正确的格式。 从 MongoDB 4.2或更早版本开始且此后升级的集群可能包含格式不正确的唯一索引。
要更正索引,您可以重新同步原始源集群中的所有节点。 要重新同步所有节点:
或者,为避免重新同步,您可以对所有节点上具有唯一索引的每个集合使用db.collection.validate()
方法和full = false
,以确定每个集合是否包含格式不正确的唯一索引。 如果db.collection.validate()
没有返回有关唯一索引的警告,则可以跳过重新同步。
请求
POST /api/v1/reverse
请求正文参数
此端点不使用 HTTP 请求正文参数。 但是,您必须指定带有空对象{ }
的--data
选项。
响应
字段 | 类型 | 说明 |
---|---|---|
success | 布尔 | 当请求成功时,该值为 true 。 |
error | 字符串 | 如果发生错误,则指示错误名称。 当 success 为true 时,响应中将省略此字段。 |
errorDescription | 字符串 | 所发生错误的详细描述。 当 success 为true 时,响应中将省略此字段。 |
例子
以下示例反转了已提交同步操作的方向。
请求
curl localhost:27182/api/v1/reverse -XPOST --data '{ }'
响应
{"success":true}
行为
reverse
端点启动 REVERSING
状态。 mongosync
会交换源集群和目标集群,并继续应用变更事件。
如果reverse
同步成功, mongosync
将进入RUNNING
状态。 同步从原始同步作业的相反方向继续进行。 您无需重新启动整个同步进程即可复制原始数据。
要查看源集群和目标集群同步的映射方向,请使用进度端点并检查directionMapping
对象。
嵌入式验证程序
默认,会为副本集迁移启用嵌入式验证程序,并对可逆同步的正向执行验证检查。当您调用 /reverse
端点时,mongosync
会禁用验证程序。即使在额外调用 /reverse
端点后,验证器仍会保持禁用状态。
端点保护
mongosync
不保护reverse
端点。 但是,默认情况下,该 API 仅绑定到本地主机,不接受来自其他来源的调用。 此外, reverse
调用不会公开连接档案或用户数据。
限制
reverse
端点不支持筛选同步。