ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs 菜单

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

整型

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

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

collation

文档

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

zones

阵列

可选。 指定集合的区域。

要维护或添加区域,请在大量中指定集合的区域:

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

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

重要

M0 、M2 、M5 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。

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

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

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

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

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

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

分片可以同时是发送分片和接收分片。

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

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

在克隆阶段:

  • 每个接收分片都会创建一个临时的空分片的集合,其集合选项与发送分片的集合相同。 这个新集合是接收分片写入新数据的目标。 在索引阶段之前,接收分片不会创建除 _id索引之外的任何索引。

  • 每个接收分片都从发送分片克隆集合数据,包括接收分片在新分片键下拥有的所有文档。

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

在应用和追赶阶段:

  • 每个接收分片开始应用在接收分片克隆数据后写入相应发送分片的 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 } )
}

提示

另请参阅: