Docs 菜单

Docs 主页开发应用程序MongoDB Manual

在分片集群中分割数据段

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

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

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

注意

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

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

警告

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

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

要手动分割数据段,请使用带有字段middlefindsplit命令。 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() 不一定将数据段分割为两个大小相等的数据段。分割发生在与查询匹配的文档的位置,无论该文档位于数据段中的什么位置。

提示

另请参阅:

← 在分片集群中创建数据块