对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

reshardCollection(数据库命令)

reshardCollection

版本 5.0 中的新增功能。

The reshardCollection command changes the shard key for a collection and changes the distribution of your data.

提示

In mongosh, this command can also be run through the sh.reshardCollection() helper method.

Helper methods are convenient for mongosh users, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.

此命令可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

该命令具有以下语法:

db.runCommand(
{
reshardCollection: "<database>.<collection>",
key: <shardkey>,
unique: <boolean>,
numInitialChunks: <integer>,
collation: { locale: "simple" },
zones: [
{
min: <document with same shape as shardkey>,
max: <document with same shape as shardkey>,
zone: <string> | null
},
...
]
}
)

该命令接受以下字段:

字段
类型
说明

reshardCollection

字符串

要重新分片的集合的命名空间。 采用<database>.<collection>形式。

key

文档

指定用作分片键的一个或多个新字段的文档。

{ <field1>: <1|"hashed">, ... }

将字段值设置为以下任一项:

unique

布尔

可选。 指定分片键是否有唯一性约束。 仅支持false 。 默认为false

numInitialChunks

整型

可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值是当前分片键模式下集合存在的数据段数。 然后,MongoDB 将在集群中创建并均衡数据段。 numInitialChunks的结果必须小于每个分片的8192

如果看到错误“提供的分片键没有足够的关联基数来制作所需数量的数据段”,请使用较低的 numInitialChunks 值对集合重新分片。

collation

文档

可选。如果指定给 reshardCollection 的集合具有默认排序规则,则必须包含附带 { locale : "simple" } 的排序规则文档,否则 reshardCollection 命令将失败。

zones

阵列

可选。 要维护或添加区域,请在数组中为集合指定区域。

重新分片期间进行的索引构建可能会静默失败。

  • 请勿在重新分片进程创建索引。

  • 如果正在进行索引构建,请勿启动重新分片进程。

在集合重新分片操作中,分片可以是:

  • 发送分片,它目前存储分片集合的数据段

  • 接收分片,它根据分片键区域存储分片集合的新数据段。

分片可以同时是发送分片和接收分片。除非您使用区域,否则发送分片集与接收分片相同。

配置服务器主节点始终是重新分片协调器,并启动重新分片操作的每个阶段。

在初始化阶段,重新分片协调器会确定分片集合的新数据分布。

在索引阶段:

  • 每个分片接收者都会创建一个新的空分片集合,其集合选项与现有分片集合相同。 这个新的分片集合是接收分片写入新数据的目标。

  • 每个分片接收者都会构建必要的新索引。 其中包括分片集合上的所有现有索引,以及与新分片键模式兼容的索引(如果分片集合上尚不存在此类索引)。

在克隆、应用和追赶阶段:

  • 每个分片接收者都克隆其在新分片键下拥有的文档的初始副本。

  • 每个分片接收者开始应用接收者克隆数据后发生的操作中的 oplog 条目。

  • 当完成重新分片操作的剩余时间估计低于两秒时,重新分片协调器会阻止对集合的写入。

    注意

    如果需要,可以通过发出commitReshardCollection命令手动强制完成重新分片操作。 如果完成重新分片操作的当前时间估计是您的集合阻止写入的可接受持续时间,则这非常有用。 commitReshardCollection命令会阻止提前写入并强制完成重新分片操作。 在写入受阻期间,应用程序的延迟会增加。

  • 一旦重新分片进程到达提交阶段,就不能再通过abortReshardCollection中止。

  • 当所有分片都达到严格一致性时,重新分片协调器会提交重新分片操作并安装新的路由表。

  • 重新分片协调器指示每个发送分片和接收分片主节点独立地重命名临时分片集合。 临时集合将成为新的重新分片集合。

  • 每个捐赠分片都会删除旧的分片集合。

以下示例使用新的分片键{ order_id: 1 }sales.orders集合重新分片:

db.adminCommand({
reshardCollection: "sales.orders",
key: { order_id: 1 }
})

MongoDB 返回以下内容:

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp(1, 1624887954),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: 0
}
},
operationTime: Timestamp(1, 1624887947)
}