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
文档
unique
布尔
可选。 指定分片键是否有唯一性约束。 仅支持
false
。 默认为false
。options
文档
可选。 包含可选字段的文档,这些字段包括
numInitialChunks
、collation
和zones
。options
字段支持以下字段:字段类型说明numInitialChunks
整型
可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值为
90
。 然后, MongoDB将在集群中创建并均衡数据段。numInitialChunks
的结果必须小于每个分片的8192
。collation
文档
可选。如果指定给
reshardCollection
的集合具有默认排序规则,则必须包含附带{ locale : "simple" }
的排序规则文档,否则reshardCollection
命令将失败。zones
阵列
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
Considerations
重新分片期间进行的索引构建可能会静默失败。
请勿在重新分片进程创建索引。
如果正在进行索引构建,请勿启动重新分片进程。
对进程重新分片
在集合重新分片操作中,分片可以是:
分片可以同时是发送分片和接收分片。
配置服务器主节点始终是重新分片协调器,并启动重新分片操作的每个阶段。
初始化阶段
在初始化阶段,重新分片协调器会确定分片集合的新数据分布。
克隆阶段
在克隆阶段:
每个接收分片都会创建一个临时的空分片的集合,其集合选项与发送分片的集合相同。 这个新集合是接收分片写入新数据的目标。 在索引阶段之前,接收分片不会创建除
_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
集合位于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 } ) }