完成切换进程
您可以使用 mongosync切换进程最终完成迁移并将应用程序工作负载从源集群转移到目标集群。
mongosync
应保持活动状态,直到达到 COMMITTED 状态。这允许 mongosync
同步迁移期间发生的任何其他写入。
注意
在将应用程序工作负载切换到目标集群之前,应始终验证同步是否成功。 有关详细信息,请参阅验证数据传输。
步骤
验证 mongosync 的状态。
在开始切换进程之前,调用进度端点以确定mongosync
的状态。 确保mongosync
进程状态显示以下值:
canCommit
是true
。lagTimeSeconds
很小(接近0
)。如果在转换开始时
lagTimeSeconds
不接近0
,则转换可能需要很长时间。使用嵌入式验证程序时,请检查
verification.source
和verification.destination
返回文档。两个文档中的lagTimeSeconds
字段应接近0
,并且phase
字段应显示"stream hashing"
。如果调用了
/commit
且值不接近0
,或者验证者未处于流哈希阶段,则切换进程可能需要很长时间。
以下示例返回同步进程的状态。
请求
curl localhost:27182/api/v1/progress -XGET
响应
{ "progress": { "state":"RUNNING", "canCommit":true, "canWrite":false, "info":"change event application", "lagTimeSeconds":0, "collectionCopy": { "estimatedTotalBytes":694, "estimatedCopiedBytes":694 }, "directionMapping": { "Source":"cluster0: localhost:27017", "Destination":"cluster1: localhost:27018" }, "verification": { "source": { "estimatedDocumentCount": 42, "hashedDocumentCount": 42, "lagTimeSeconds": 2, "totalCollectionCount": 42, "scannedCollectionCount": 10, "phase": "stream hashing" }, "destination": { "estimatedDocumentCount": 42, "hashedDocumentCount": 42, "lagTimeSeconds": 2, "totalCollectionCount": 42, "scannedCollectionCount": 10, "phase": "stream hashing" } } }, "success": true }
停止对源上已同步集合的任何写入操作。
如果您启动
mongosync
时将enableUserWriteBlocking
设立为true
,mongosync
则会在提交(步骤 4)期间为您阻止整个源集群上的所有写入操作。mongosync
如果您没有使用enableUserWriteBlocking
来启动setUserWriteBlockMode
,请确保已禁用写入功能。示例,在源集群上运行 命令:db.adminCommand( { setUserWriteBlockMode: 1, global: true } ) 如果
mongosync
使用筛选同步,则无需禁用对整个源集群的写入。但是,您必须确保停止对过滤包含的集合的写入操作。
验证数据传输。
验证数据是否成功从源同步到目标集群。
有关详细信息,请参阅验证数据传输。
在目标集群上启用应用程序写入。
要启用写入功能,更新setUserWriteBlockMode
:
db.adminCommand( { setUserWriteBlockMode: 1, global: false } )
然后,将应用程序工作负载传输到目标集群。
行为
canWrite 和 COMMITTED
mongosync
允许在 COMMITTED
状态之前的阶段写入目标集群。
在初始同步中,mongosync
将源集群上的唯一索引复制为目标集群上的非唯一索引。在提交期间,目标集群上的相关非唯一索引将被设立为 prepareUnique
。完成后,/progress
端点开始返回 canWrite:
true
。具有 prepareUnique
索引的集合会拒绝违反唯一索引约束的新文档。然后,mongosync
将 prepareUnique
索引转换为唯一索引。完成后,mongosync
会将其状态更改为 COMMITTED
。
注意
同步大型集合时,将 prepareUnique
索引转换为唯一索引可能会占用大量资源。这可能会导致 /progress
端点返回 canWrite: true
和 mongosync
达到 COMMITTED
状态之间需要很长时间。