Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

在分片集群中分割数据段

通常,如果 数据段超过最大 数据块 , MongoDB会在 数据块 后分割该数据段。但是,在以下情况下,您可能需要手动分割数据段:

  • 您的集群中有大量数据,但数据段却很少,就像使用现有数据部署集群后的情况一样。

  • 您希望添加数据块最初驻留在单个数据段或分分片的数据。 示例,您计划插入大量分分片键介于300400之间的数据,所有分片分片介于250500之间的数据都位于单个数据数据块中。

注意

MongoDB 提供了mergeChunks命令,用于将连续的数据段范围合并为单个数据段。 有关更多信息,请参阅在分片集群中合并数据段。

如果移动有利于将来的插入,则负载均衡器可能会立即将最近分割的数据段迁移到新的分片。 负载均衡器不区分手动分割的数据段和系统自动分割的数据段。

警告

在拆分分片collection中的数据以创建新数据块时要小心。当您对包含现有数据的collection进行分片时,MongoDB 会自动创建数据块以均匀分布collection。要在分片集群中有效分割数据,必须考虑数据块中的文档数量和平均文档大小,以创建统一的数据块大小。当数据块大小不规则时,分片可能具有相同数量的数据块,但数据大小差异很大。避免创建导致collection具有不同大小数据块的分割。

使用sh.status()确定集群中的当前数据块范围。

要手动分割数据段,请使用带有 middlefind 字段的 split 命令。mongosh 提供了辅助方法 sh.splitFind()sh.splitAt()

splitFind() 将包含与该查询匹配的第一个返回文档的数据段分割成两个大小相等的数据段。您必须将分片集合的完整命名空间(即“<database>.<collection>”)指定为 splitFind()splitFind() 中的查询不需要使用分片键,尽管这样做几乎总是有意义的。

例子

以下命令分割那些包含 records 数据库 people 集合 zipcode 字段 63109 值的数据段:

sh.splitFind( "records.people", { "zipcode": "63109" } )

使用 splitAt() 将数据段分成两部分,使用查询的文档作为新数据段的下限:

例子

以下命令分割那些包含 records 数据库 people 集合 zipcode 字段 63109 值的数据段。

sh.splitAt( "records.people", { "zipcode": "63109" } )

注意

splitAt() 不一定将数据段分割为两个大小相等的数据段。分割发生在与查询匹配的文档的位置,无论该文档位于数据段中的什么位置。

提示

另请参阅:

后退

创建范围