对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

对分片集合进行碎片整理

碎片是指分片的集合的数据被分解为不必要的大量小数据段。 这会增加在该集合上运行的CRUD操作的操作时间。 碎片整理通过将较小的数据段合并为较大的数据段来减少数据段的数量,从而缩短CRUD操作时间。

如果CRUD操作时间可以接受,则无需对集合进行碎片整理。

下表汇总了各种MongoDB版本的碎片整理信息。

MongoDB 版本
说明

MongoDB 7.0及更高版本

数据段会自动合并。 与MongoDB 6.0相比,在MongoDB 7.0中对集合进行碎片整理所带来的性能提升较低。 通常,您不需要对从MongoDB 7.0开始的集合进行碎片整理。

MongoDB 6.0及7.0之前的版本

仅当负载均衡器迁移数据块或节点启动之际出现 CRUD 操作延迟时,才对集合进行碎片整理。

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

早于 MongoDB 6.0

仅当在元数据更新期间遇到较长的 CRUD 操作时间时,才对集合进行碎片整理。适用于 6.0 之前的 MongoDB 版本,当集合大小由于许多插入或更新操作而显著增长时,分片集合会变得碎片化。

要对分片collection进行碎片整理,请使用configureCollectionBalancing命令的defragmentCollection选项。该选项从 MongoDB 6.0 开始可用。

在对collection进行碎片整理之前,请考虑以下问题:

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

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

  • 合并的数据块会丢失其放置历史记录。

    • 这意味着,运行碎片整理时,快照读取以及间接的事务可能会失败,并出现过时数据块历史记录错误。

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

  • 碎片整理通过在分片之间移动数据来影响collection中文档的局部性。如果collection具有经常访问的数据范围,则对collection进行碎片整理后,经常访问的数据可能会位于一个分片上。由于将工作负载放在一个分片而不是多个分片上,这可能会降低 CRUD 操作的性能。

注意

通常,您应使用分片均衡窗口来指定负载均衡器的运行时间,而不是手动启动和停止碎片整理。

本节介绍与对分片collection进行碎片整理相关的其他详细信息。

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

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

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

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

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

在两个分片之间共享的集合数据差异为配置的 chunkSize 设置三倍或更多倍时,负载均衡器在分片之间迁移数据段。

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

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

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

对集合进行碎片整理可以减少数据段数量以及更新数据段元数据的时间。

要减少系统工作负载,请使用分片负载均衡窗口将负载均衡器配置为仅在特定时间运行。碎片整理在负载均衡窗口时间段内运行。

您可以使用 chunkDefragmentationThrottlingMS 参数限制负载均衡器运行的拆分和合并命令的速率。

您可以随时启动和停止碎片整理。

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

集群仅在必须迁移数据块时才分割数据块。这意味着数据块大小可能超过 chunkSize。较大的数据块会减少分片上的数据块数量并提高性能,因为更新分片元数据的时间会减少。示例,即使您已将 chunkSize设立为 256 MB,您也可能会在分片上看到 1 TB数据块。

chunkSize 影响以下内容:

  • 在单个数据段迁移操作中,负载均衡器尝试在两个分片之间迁移的最大数据量。

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