文档菜单
文档首页
/
MongoDB 手册
/ /

碎片化分片集合

本页内容

  • 开始之前
  • 任务
  • 详细信息
  • 了解更多

碎片化是指分片集合的数据被分割成大量不必要的小块。这可能会增加在该集合上运行的CRUD操作的操作时间。通过合并较小的块到较大的块来减少碎片化,可以降低CRUD操作时间。

如果CRUD操作时间可以接受,则不需要对集合进行碎片化。

以下表格总结了不同MongoDB版本的碎片化信息。

MongoDB 版本
描述
MongoDB 7.0 及以后版本
块会自动合并。在MongoDB 7.0中对集合进行碎片化带来的性能提升低于MongoDB 6.0。通常情况下,从MongoDB 7.0开始,您不需要对集合进行碎片化。
MongoDB 6.0 及之前版本

只有在平衡器迁移块或节点启动时,您在CRUD操作中遇到延迟时,才需要对集合进行碎片化。

从MongoDB 6.0开始,高写流量不应该导致碎片化。块迁移会导致碎片化。

MongoDB 6.0 之前版本
只有在元数据更新期间遇到较长的CRUD操作时间时,才需要对集合进行碎片化。对于MongoDB 6.0之前的版本,由于大量插入或更新操作,当集合大小显著增长时,分片集合会变得碎片化。

要碎片化分片集合,请使用configureCollectionBalancing 命令的 defragmentCollection 选项。该选项从MongoDB 6.0开始可用。

在您对集合进行碎片化之前,请考虑以下问题

  • 碎片整理可能会导致碎片上的许多元数据更新。如果在迁移过程中您的 CRUD 操作已经比平时花费了更多时间,您应该只在碎片平衡窗口期间运行碎片整理,以减少系统负载。

  • 如果碎片整理影响了集群的工作负载和 CRUD 延迟,您可以使用chunkDefragmentationThrottlingMS参数来减少影响。

  • 合并的碎片会丢失其放置历史。

    • 这意味着在碎片整理运行期间,快照读取以及间接的,事务可能会因过时的碎片历史错误而失败。

    • 放置历史记录了碎片存储碎片的碎片。碎片整理会擦除放置历史,某些操作可能会失败,但通常在约五分钟后会解决。

  • 碎片整理通过在碎片之间移动数据影响集合中文档的本地性。如果一个集合有频繁访问的数据范围,在碎片整理该集合后,频繁访问的数据可能位于一个碎片上。这可能会通过将工作负载放在单个碎片上而不是多个碎片上,降低 CRUD 操作的性能。

注意

通常,您应该使用碎片平衡窗口来指定平衡器运行的时间,而不是手动开始和停止碎片整理。

本节描述了与分片集合碎片整理相关的附加详细信息。

configureCollectionBalancing命令返回的defragmentCollection字段仅在碎片整理运行时为true

在碎片整理自动结束或您手动停止碎片整理后,从返回的文档中删除defragmentCollection字段。

在碎片整理期间允许从辅助节点读取,但可能需要更长时间才能完成,直到主节点的元数据更新复制到辅助节点。

有关MongoDB平衡器的详细信息,请参阅分片集群平衡器。

有关chunkSize的简介,请参阅在分片集群中修改范围大小。

以下表格描述了在不同版本的MongoDB中,chunkSize如何影响碎片整理和平衡器操作。

MongoDB 版本
描述
MongoDB 6.0及以后版本

当两个分片之间的集合数据与配置的chunkSize设置相差三倍或更多时,平衡器将在分片之间迁移数据块。

例如,如果chunkSize为128 MB,且集合数据相差384 MB或更多,平衡器将在分片之间迁移数据块。

MongoDB 6.0 之前版本
当数据块增长超过chunkSize时,数据块将被分割。

在移动、分割或合并数据块时,配置服务器会在数据块操作提交后更新分片元数据。未参与数据块操作的分片也会更新新的元数据。

分片元数据更新的时间与路由表的大小成正比。在更新分片元数据期间,对集合的CRUD操作会暂时被阻止,较小的路由表意味着CRUD操作延迟更短。

整理集合可以减少数据块的数量和更新数据块元数据所需的时间。

为了减少系统负载,可以使用分片平衡窗口来配置平衡器只在特定时间运行。碎片整理将在平衡窗口时间段内运行。

您可以使用chunkDefragmentationThrottlingMS参数来限制平衡器运行分割和合并命令的速率。

您可以在任何时间开始和停止碎片整理。

您还可以设置分片区域。分片区域基于分片键,您可以将每个区域与集群中的一个或多个分片关联。

从MongoDB 6.0开始,只有在必须迁移数据块时,分片集群才会分割数据块。这意味着数据块的大小可能会超过chunkSize。较大的数据块减少了分片上的数据块数量,并提高了性能,因为更新分片元数据所需的时间减少了。例如,您可能会在分片上看到1 TB的数据块,尽管您已将chunkSize设置为256 MB。

chunkSize影响以下内容

  • 平衡器在单个数据块迁移操作中尝试在两个分片之间迁移的最大数据量。

  • 碎片整理期间迁移的数据量。

  • 有关分片介绍,请参阅分片

  • 使用数据块分区数据,请参阅数据块分区

  • 配置收集平衡,请参阅 configureCollectionBalancing

  • 检查平衡器集合状态,请参阅 balancerCollectionStatus

  • 配置分片平衡窗口,请参阅 安排平衡窗口

  • 使用 MongoDB Atlas 监控分片,请参阅审查分片集群

返回

配置数据库