sh.reshardCollection()
定义
sh.reshardCollection(namespace, key, unique, options)
版本 5.0 中的新增功能。
sh.reshardCollection()
方法更改集合的分片键并更改数据的分布。重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。有关数据库命令,请参阅
reshardCollection
命令。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
sh.reshardCollection()
采用以下字段:
options
字段支持以下字段:
字段 | 类型 | 说明 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
numInitialChunks | 整型 | 可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值是当前分片键模式下集合存在的数据段数。 然后,MongoDB 将在集群中创建并均衡数据段。 numInitialChunks 的结果必须小于每个分片的8192 。 | ||||||||
collation | 文档 | 可选。如果指定给 reshardCollection 的集合具有默认排序规则,则必须包含附带 { locale : "simple" } 的排序规则文档,否则 reshardCollection 命令将失败。 | ||||||||
zones | 阵列 | 可选。 要维护或添加区域,请在数组中指定集合的区域:
|
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关所有命令的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
对进程重新分片
在集合重新分片操作中,分片可以是:
分片可以同时是发送分片和接收分片。除非您使用区域,否则发送分片集与接收分片相同。
配置服务器主节点始终是重新分片协调器,并启动重新分片操作的每个阶段。
初始化阶段
在初始化阶段,重新分片协调器会确定分片集合的新数据分布。
索引阶段
在索引阶段:
每个分片接收者都会创建一个新的空分片集合,其集合选项与现有分片集合相同。 这个新的分片集合是接收分片写入新数据的目标。
每个分片接收者都会构建必要的新索引。 其中包括分片集合上的所有现有索引,以及与新分片键模式兼容的索引(如果分片集合上尚不存在此类索引)。
克隆、应用和追赶阶段
在克隆、应用和追赶阶段:
每个分片接收者都克隆其在新分片键下拥有的文档的初始副本。
每个分片接收者开始应用接收者克隆数据后发生的操作中的 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
集合位于shard0
和shard1
上。 当前分片键为{ _id: 1}
。
sh.reshardCollection
使用新区域信息运行
sh.reshardCollection( "test.scores", { "studentId": 1, "testId": 1}, { zones: [ { min: { "studentId": MinKey(), "testId": MinKey() }, max: { "studentId": MaxKey(), "testId": MaxKey() }, zone: "NewZone" } ] } )
重新分片操作将区域NewZone
中的分片添加为接收分片。 数据库主分片将添加为接收分片,作为区域定义中任何缺失范围的支持。 如果没有缺失范围,则会在“NewZone”中的分片上克隆该集合,例如本示例中的shard2
和shard3
。 sh.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 } ) }