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

sh.reshardCollection()

在此页面上

  • 定义
  • 兼容性
  • 对进程重新分片
  • 例子
sh.reshardCollection(namespace, key, unique, options)

版本 5.0 中的新增功能

sh.reshardCollection()方法更改集合的分片键并更改数据的分布。

在对集合重新分片之前,请阅读重新分片要求重新分片限制。

重要

mongosh 方法

本页面提供 mongosh 方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。

有关数据库命令,请参阅 reshardCollection 命令。

如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。

sh.reshardCollection() 采用以下字段:

字段
类型
说明
namespace
字符串
要分片的集合的命名空间,格式为 "<database>.<collection>"
key
文档

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

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

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

另请参阅分片键索引

unique
布尔
可选。 指定分片键是否有唯一性约束。 仅支持false 。 默认为false
options
文档
可选。 包含可选字段的文档,这些字段包括numInitialChunkscollationzones

options字段支持以下字段:

字段
类型
说明
numInitialChunks
整型
可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值是当前分片键模式下集合存在的数据段数。 然后,MongoDB 将在集群中创建并均衡数据段。 numInitialChunks的结果必须小于每个分片的8192
collation
文档
可选。如果指定给 reshardCollection 的集合具有默认排序规则,则必须包含附带 { locale : "simple" } 的排序规则文档,否则 reshardCollection 命令将失败。
zones
阵列

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

[
{
min: <document with same shape as shardkey>,
max: <document with same shape as shardkey>,
zone: <string> | null
},
...
]

此方法可用于以下环境中托管的部署:

注意

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

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

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

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

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

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

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

在索引阶段:

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

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

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

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

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

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

    注意

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

  • 重新分片进程进入提交阶段后,无法使用sh.abortReshardCollection()结束该进程。

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

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

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

    提示

    另请参阅:

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

sh.reshardCollection( "sales.orders", { order_id: 1 } )

示例输出:

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

当您需要调整集群中各分片之间的数据分布以满足不断变化的需求或提高性能时,请使用区域对集合进行重新分片。

在以下示例中, test.scores集合位于shard0shard1上。 当前分片键为{ _id: 1}

1

在此示例中,此区域名为NewZone

sh.addShardToZone( “shard2”, ‘NewZone’ )
sh.addShardToZone( “shard3”, ‘NewZone’ )
2
sh.reshardCollection(
"test.scores",
{ "studentId": 1, "testId": 1},
{ zones: [ {
min: { "studentId": MinKey(), "testId": MinKey() },
max: { "studentId": MaxKey(), "testId": MaxKey() },
zone: "NewZone" }
]
} )

重新分片操作将区域NewZone中的分片添加为接收分片。 数据库主分片将添加为接收分片,作为区域定义中任何缺失范围的支持。 如果没有缺失范围,则会在“NewZone”中的分片上克隆该集合,例如本示例中的shard2shard3sh.reshardCollection返回以下内容:

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp( { t: 1699484530, i: 54 } ),
signature: {
hash: Binary.createFromBase64( "90ApBDrSSi4XnCpV3OWIH4OGO0Y=", 0 ),
keyId: Long( "7296989036055363606" )
} },
operationTime: Timestamp( { t: 1699484530, i: 54 } )
}

提示

另请参阅:

后退

sh.removeTagRange