分片群集中的分割块

通常,如果块超过最大chunk size,则 MongoDB 在插入后拆分chunk。但是,在以下情况下,您可能需要手动拆分块:

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

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

Note

2.6 版中的新功能:MongoDB 提供了mergeChunks命令,可将连续的块范围合并为一个块。有关更多信息,请参见在分片群集中合并块

如果此举有利于将来的插入,则balancer可立即将最近拆分的块迁移到新的分片。平衡器不区分手动拆分的块和系统自动拆分的块。

Warning

在分片集合中拆分数据以创建新块时,请务必小心。在分片具有现有数据的集合时,MongoDB 会自动创建块以均匀地分布该集合。为了在分片群集中有效地拆分数据,必须考虑一个块中的文档数和平均文档大小才能创建统一的块大小。当块的大小不规则时,碎片可能具有相同数量的块,但数据大小却大不相同。避免创建导致集合大小不同的集合的拆分。

使用sh.status()确定整个集群的当前块范围。

要手动拆分块,请对字段middlefind使用split命令。 mongo shell 提供了辅助方法sh.splitFind()sh.splitAt()

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

Example

以下命令为records数据库的people集合中的zipcode字段拆分包含值63109的块:

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

使用splitAt()将大块一分为二,将查询的文档用作新大块的下限:

Example

以下命令为records数据库的people集合中的zipcode字段拆分包含值63109的块。

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

Note

splitAt()不一定将块分割成两个大小相等的块。拆分发生在与查询匹配的文档的位置,而不管该文档在块中的位置。