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

reshardCollection

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • Considerations
  • 对进程重新分片
  • 示例
reshardCollection

版本 5.0 中的新增功能

reshardCollection命令更改集合的分片键并更改数据的分布。

提示

mongosh中,该命令也运行通过 sh.reshardCollection()辅助方法运行。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

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

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

注意

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

该命令具有以下语法:

db.adminCommand(
{
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
},
...
],
forceRedistribution: <bool>
}
)

该命令接受以下字段:

字段
类型
说明
reshardCollection
字符串
要重新分片的集合的命名空间。 采用<database>.<collection>形式。
key
文档

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

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

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

unique
布尔
可选。 指定分片键是否有唯一性约束。 仅支持false 。 默认为false
numInitialChunks
整型
可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值是当前分片键模式下集合存在的数据段数。 然后,MongoDB 将在集群中创建并均衡数据段。 numInitialChunks的结果必须小于每个分片的8192
collation
文档
可选。 如果reshardCollection中指定的集合具有默认排序规则,则必须包含附带{ locale : "simple" }的排序规则文档,否则reshardCollection命令将失败。
zones
阵列
可选。 要维护或添加区域,请在数组中为集合指定区域。
forceRedistribution
布尔

可选。 如果设置为true ,即使新分片键与旧分片键相同,操作也会运行。 与zones选项一起使用可将数据移至特定区域。

版本 7.2 中的新增内容

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

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

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

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

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

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

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

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

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

在索引阶段:

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

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

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

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

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

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

    注意

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

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

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

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

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

    提示

    另请参阅:

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

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

输出:

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

提示

另请参阅:

从 MongoDB 7.2 开始,您可以对同一键对集合重新分片,这可用于将数据重新分发到新的分片上。

将分片添加到集群后,可以使用带有forceRedistribution选项的reshardCollection命令在集群中重新分发数据:

db.adminCommand({
reshardCollection: "accounts.invoices",
key: { store_id: "hashed" },
forceRedistribution: true
})

从 MongoDB 7.2 开始,您可以使用reshardCollection命令将数据移入新区域,而无需更改分片键。

accounts.sales以下命令使用相同的分片键重新分布collection的数据,将数据从zoneszone01zone02 移动到zone03zone04

db.adminCommand({
reshardCollection: "accounts.sales",
key: { region_id: "hashed" },
forceRedistribution: true,
zones: [
{
zone: "zone04",
min: { region_id: MinKey() },
max: { region_id: 10 }
},
{
zone: "zone05",
min: { region_id: 10 },
max: { region_id: MaxKey() }
}
]
})

后退

removeShardFromZone