Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

移动集合

在此页面上

  • 关于此任务
  • 访问控制
  • 开始之前
  • 步骤
  • 了解详情

从MongoDB 8.0开始,您可以使用 { moveCollection命令将未分片的集合移动到不同的分片。

如果您的部署启用了访问权限控制,则enableSharding角色会授予您运行moveCollection命令的访问权限。

在移动集合之前,请确保满足以下要求:

  • 您的应用程序可以允许受影响的集合块进行两秒钟的写入。 在写入受阻期间,应用程序的延迟会增加。

  • 您的数据库符合这些资源要求:

    • 确保分片集合移动到的分片具有足够的存储空间用于集合及其索引。 目标分分片需要至少( Collection storage size + Index Size ) * 2字节可用。

    • 确保 I/O容量低于50 %。

    • 确保 CPU 负载低于80 %。

重要

数据库不会强制执行这些要求。未能分配足够的资源可能会导致:

  • 数据库空间不足并关闭

  • 性能下降

  • 操作花费的时间比预期长

如果应用程序存在流量较少的时间段,请尽可能在该时间段对集合执行此操作。

1

要将app数据库上名为inventory的未分片集合移至shard02分分片,请运行moveCollection

db.adminCommand(
{
moveCollection: "app.inventory",
toShard: "shard02"
}
)

要获取可用分分片ID 的列表,请运行sh.status() 。 有关详细信息,请参阅sh.status() 输出。

2
  1. 监控剩余时间。

    要监控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>,
    ...
    },
    ...
    ]
  2. 监控传输的字节数。

    要监控传输的字节数,请使用shardingStatistics.resharding.active.bytesCopied并与集合中的字节数进行比较。

3

要确认集合已移至预期分分片,请使用$collStats管道阶段。

此示例演示如何确认预期分片上存在app.inventory集合:

db.inventory.aggregate( [
{ $collStats: {} },
{ $project: { "shard": 1 } }
] )

此管道阶段的输出类似于以下内容:

[ { shard: 'shard02' } ]

后退

可移动集合