移动集合
从MongoDB 8.0版本开始,您可以使用moveCollection
命令将未分片的集合移动到不同的分片。moveCollection
命令。
关于此任务
moveCollection
只能在分片集群上运行。moveCollection
只能移动未分片的集合。moveCollection
一次只能移动一个集合。moveCollection
的最短持续时间为5分钟。在运行
moveCollection
后,需要重建Atlas Search索引。在
moveCollection
完成之前,您不能进行拓扑更改,例如添加或删除分片或在不同配置服务器之间切换。在
moveCollection
执行过程中,您不能对正在移动的集合执行以下操作在
moveCollection
执行过程中,您不能对集群执行以下操作在
moveCollection
执行过程中发生的索引构建可能会静默失败。在
moveCollection
执行过程中,请不要创建索引。如果存在正在进行的索引构建,请不要调用
moveCollection
。
访问控制
如果您的部署启用了访问控制,则enableSharding
角色会授予您运行moveCollection
命令的权限。
开始之前
在您移动集合之前,请确保您满足以下要求
您的应用程序可以容忍两秒钟的写入阻塞时间。在此期间,您的应用程序将经历延迟增加。
您的数据库满足以下资源要求
确保您要移动集合到的分片有足够的空间来存储集合及其索引。目标分片需要至少
(集合存储大小 + 索引大小) * 2
字节可用。确保您的I/O容量低于50%。
确保您的CPU负载低于80%。
重要
数据库不会强制执行这些要求。资源分配不足可能导致以下情况:
数据库空间不足并关闭
性能下降
操作时间超过预期
如果您的应用程序有时间流量较少的时段,尽可能在此时段内对集合执行此操作。
步骤
移动集合。
要将名为 inventory
的未分片集合从 app
数据库移动到 shard02
分片,请运行 moveCollection
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
要获取可用的分片ID列表,请运行 sh.status()
。有关详细信息,请参阅 sh.status() 输出。
监视移动集合操作的进度。
监视剩余时间。
要监视
moveCollection
操作的剩余时间,请使用$currentOp
管道阶段。此示例展示了如何检查
app.inventory
集合上moveCollection
的进度。db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "app.inventory" } } ] ) 注意
要查看更新后的值,您需要持续运行前面的管道。
$currentOp
管道输出totalOperationTimeElapsedSecs
:操作已消耗的时间(秒)remainingOperationTimeEstimatedSecs
:当前moveCollection
操作的剩余时间(秒)。当一个新的moveCollection
操作开始时,它返回-1
。
注意
remainingOperationTimeEstimatedSecs
已设置为悲观时间估计- 追赶阶段时间估计设置为克隆阶段时间,这
- 是一个相对较长时间。
- 实际上,如果只有少量待写操作,则
- 实际追赶阶段时间相对较短。
此管道阶段输出类似于以下内容
[ { shard: '<shard>', type: 'op', desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>', op: 'command', ns: '<database>.<collection>', originatingCommand: { reshardCollection: '<database>.<collection>', key: <shardkey>, unique: <boolean>, collation: { locale: 'simple' } }, totalOperationTimeElapsedSecs: <number>, remainingOperationTimeEstimatedSecs: <number>, ... }, ... ] 监控传输的字节数。
要监控传输的字节数,请使用
shardingStatistics.resharding.active.bytesCopied
并将其与集合中的字节数进行比较。
确认集合已移动。
要确认集合已移动到预期的分片,请使用 $collStats
管道阶段。
此示例展示了如何确认 app.inventory
集合存在于预期的分片上
db.inventory.aggregate( [ { $collStats: {} }, { $project: { "shard": 1 } } ] )
此管道阶段输出类似于以下内容
[ { shard: 'shard02' } ]