移动集合
从MongoDB 8.0开始,您可以使用 { moveCollection
命令将未分片的集合移动到不同的分片。
关于此任务
moveCollection
只能在分分片的集群上运行。moveCollection
只能移动未分片的集合。moveCollection
一次只能移动一个集合。moveCollection
最短持续时间为5分钟。在
moveCollection
运行后, Atlas Search索引需要重新构建。在
moveCollection
完成之前,您无法进行拓扑结构更改,例如添加或删除分片或在嵌入式和专用配置服务器之间进行转换。当
moveCollection
正在进行时,您无法对正在移动的集合运行以下操作:moveCollection
正在进行时,您无法对集群运行以下操作:在
moveCollection
正在进行时进行的索引构建可能会静默失败。正在进行
moveCollection
时,请勿创建索引。如果正在进行索引构建,请勿调用
moveCollection
。
访问控制
如果您的部署启用了访问权限控制,则enableSharding
角色会授予您运行moveCollection
命令的访问权限。
开始之前
在移动集合之前,请确保满足以下要求:
您的应用程序可以允许受影响的集合块进行两秒钟的写入。 在写入受阻期间,应用程序的延迟会增加。
您的数据库符合这些资源要求:
确保分片集合移动到的分片具有足够的存储空间用于集合及其索引。 目标分分片需要至少
( Collection storage size + Index Size ) * 2
字节可用。确保 I/O容量低于50 %。
确保 CPU 负载低于80 %。
重要
数据库不会强制执行这些要求。未能分配足够的资源可能会导致:
数据库空间不足并关闭
性能下降
操作花费的时间比预期长
如果应用程序存在流量较少的时间段,请尽可能在该时间段对集合执行此操作。
步骤
移动集合。
要将app
数据库上名为inventory
的未分片集合移至shard02
分分片,请运行moveCollection
:
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
要获取可用分分片ID 的列表,请运行sh.status()
。 有关详细信息,请参阅sh.status() 输出。
监控 moveCollection 操作的进度。
监控剩余时间。
要监控
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' } ]