reshardCollection
定义
reshardCollection
版本 5.0 中的新增功能。
reshardCollection
命令更改集合的分片键并更改数据的分布。提示
在
mongosh
中,该命令也运行通过sh.reshardCollection()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB 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 | 字符串 | 要重新分片的集合的命名空间。 采用 <database>.<collection> 形式。 |
key | 文档 | |
unique | 布尔 | |
numInitialChunks | 整型 | 可选。 指定对集合重新分片时要在集群中所有分片中创建的数据段的初始数量。 默认值是当前分片键模式下集合存在的数据段数。 然后,MongoDB 将在集群中创建并均衡数据段。 numInitialChunks 的结果必须小于每个分片的8192 。 |
collation | 文档 | |
zones | 阵列 | 可选。 要维护或添加区域,请在数组中为集合指定区域。 |
forceRedistribution | 布尔 | 可选。 如果设置为 版本 7.2 中的新增内容。 |
对进程重新分片
在集合重新分片操作中,分片可以是:
分片可以同时是发送分片和接收分片。除非您使用区域,否则发送分片集与接收分片相同。
配置服务器主节点始终是重新分片协调器,并启动重新分片操作的每个阶段。
初始化阶段
在初始化阶段,重新分片协调器会确定分片集合的新数据分布。
索引阶段
在索引阶段:
每个分片接收者都会创建一个新的空分片集合,其集合选项与现有分片集合相同。 这个新的分片集合是接收分片写入新数据的目标。
每个分片接收者都会构建必要的新索引。 其中包括分片集合上的所有现有索引,以及与新分片键模式兼容的索引(如果分片集合上尚不存在此类索引)。
克隆、应用和追赶阶段
在克隆、应用和追赶阶段:
每个分片接收者都克隆其在新分片键下拥有的文档的初始副本。
每个分片接收者开始应用接收者克隆数据后发生的操作中的 oplog 条目。
当完成重新分片操作的剩余时间估计低于两秒时,重新分片协调器会阻止对集合的写入。
注意
如果需要,可以通过发出
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 7.2 开始,您可以对同一键对集合重新分片,这可用于将数据重新分发到新的分片上。
将分片添加到集群后,可以使用带有forceRedistribution
选项的reshardCollection
命令在集群中重新分发数据:
db.adminCommand({ reshardCollection: "accounts.invoices", key: { store_id: "hashed" }, forceRedistribution: true })
将数据重新分布到不同区域
从 MongoDB 7.2 开始,您可以使用reshardCollection
命令将数据移入新区域,而无需更改分片键。
accounts.sales
以下命令使用相同的分片键重新分布collection的数据,将数据从zoneszone01
和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() } } ] })