reshardCollection
定义
reshardCollection
新版本5.0.
的
reshardCollection
命令更改集合的分区键并更改数据分布。提示
在
mongosh
中,此命令也可以通过sh.reshardCollection()
辅助方法运行.辅助方法对
mongosh
用户很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。
兼容性
此命令在以下环境中的部署中可用
MongoDB Atlas:云中MongoDB部署的全托管服务
注意
此命令在所有MongoDB Atlas集群中都受支持。有关Atlas对所有命令的支持信息,请参阅不受支持的命令。
MongoDB Enterprise:MongoDB的基于订阅的自托管版本
MongoDB Community:MongoDB的开源、免费使用和自托管版本
语法
该命令具有以下语法
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 | 字符串 | 要重新分片的集合的命名空间。采用形式 <数据库>.<集合> 。 |
键 | 文档 | |
unique | 布尔型 | |
numInitialChunks | 整数 | 可选。指定在重新分片集合时,在集群中所有分片上创建的初始块数量。默认为当前分片键模式下的集合存在的块数量。MongoDB 将在集群中创建并平衡块。`numInitialChunks` 必须小于每个分片 8192 。 |
collation | 文档 | 可选。如果 reshardCollection 中指定的集合具有默认的 校对规则,则必须包含一个包含 { locale : "simple" } 的校对规则文档,否则 reshardCollection 命令将失败。 |
zones | 数组 | 可选。为了维护或添加 区域,指定您的集合的区域,并在数组中指定。 |
forceRedistribution | 布尔型 | 可选。如果设置为 新版本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
集合的数据,将数据从区域zone01
和zone02
移动到zone03
和zone04
。
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() } } ] })