文档菜单
文档首页
/
MongoDB 手册
/ / /

reshardCollection

在本页

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 注意事项
  • 重新分片过程
  • 示例
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
字符串
要重新分片的集合的命名空间。采用形式 <数据库>.<集合>
文档

指定新字段或字段集作为分片键。的文档。

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

设置字段值为

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

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

版本8.0.

在重新分片过程中发生的索引构建可能会静默失败。

  • 不要在重新分片过程中创建索引。

  • 如果有正在进行的索引构建,不要启动重新分片过程。

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

  • 捐赠者,当前存储分片集合的数据块

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

分片可以是捐赠者和接收者同时存在。除非使用区域,否则捐赠者分片集与接收者分片集相同。

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

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

在索引阶段

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

  • 每个接收者分片构建必要的新的索引。这包括分片集合上的所有现有索引,如果分片集合上不存在与新分片键模式兼容的索引,则还包括该索引。

在克隆、应用和同步阶段

  • 每个分片接收器都会克隆一个在新的分片键下它将拥有的文档的初始副本。

  • 每个分片接收器开始应用操作日志条目,这些操作是在接收器克隆数据之后发生的。

  • 当完成分片操作所需剩余时间的估计小于 两秒 时,分片协调器将阻止集合的写入。

    注意

    如果需要,可以通过发出 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 8.0 开始,您可以在相同键上重新分片集合,这可以用于将数据重新分配到新的分片。

在将分片添加到集群后,您使用带有 forceRedistribution 选项的 reshardCollection 命令来在集群中重新分配数据

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

从MongoDB 8.0版本开始,您可以使用reshardCollection命令将数据移动到新的区域,而不改变分区键。

以下命令使用相同的分区键重新分配accounts.sales集合的数据,将数据从区域zone01zone02移动到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