分片群集中的分割块
通常,如果块超过最大chunk size,则 MongoDB 在插入后拆分chunk。但是,在以下情况下,您可能需要手动拆分块:
-
您的集群中有大量数据,而chunks则很少,就像使用现有数据部署集群后的情况一样。
-
您希望添加大量最初驻留在单个块或碎片中的数据。例如,您计划在
300
和400
之间插入具有shard key值的大量数据,但是分片键的所有值在250
和500
之间都在一个块中。
Note
2.6 版中的新功能:MongoDB 提供了mergeChunks命令,可将连续的块范围合并为一个块。有关更多信息,请参见在分片群集中合并块。
如果此举有利于将来的插入,则balancer可立即将最近拆分的块迁移到新的分片。平衡器不区分手动拆分的块和系统自动拆分的块。
Warning
在分片集合中拆分数据以创建新块时,请务必小心。在分片具有现有数据的集合时,MongoDB 会自动创建块以均匀地分布该集合。为了在分片群集中有效地拆分数据,必须考虑一个块中的文档数和平均文档大小才能创建统一的块大小。当块的大小不规则时,碎片可能具有相同数量的块,但数据大小却大不相同。避免创建导致集合大小不同的集合的拆分。
使用sh.status()确定整个集群的当前块范围。
要手动拆分块,请对字段middle
或find
使用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()不一定将块分割成两个大小相等的块。拆分发生在与查询匹配的文档的位置,而不管该文档在块中的位置。