Optimizing Sharded Collections in MongoDB with Defragmentation-翻译
碎片整理优化MongoDB分片集合
原文地址:
https://www.mongodb.com/developer/products/mongodb/sharding-optimization-defragmentation/
介绍
如果您的分片集群中有大量块,并且希望减少块迁移对CRUD延迟的影响,该怎么办?您可以使用集合碎片整理!
在这篇文章中,我们将介绍何时应该考虑对集合进行碎片整理,碎片整理对您的碎片集群的好处,并介绍执行、监视和停止碎片整理所需的所有命令。如果您是分片新手,或者想了解MongoDB如何提供水平可伸缩性,请查看使用手册。
使用场景:分区集合中包含大量的块(chunk),对这样的集合进行碎片整理可以提高CRUD效率。
背景
一个分片的集合被存储为“块”,平衡器四处移动数据,以保持数据在分片之间的均匀分布。在MongoDB 6.0中,当两个碎片之间的数据量差异是配置的块大小的两倍时,MongoDB平衡器会自动在碎片之间迁移块。对于块大小为128MB的集合,如果数据大小的差异超过256MB,我们将在碎片之间迁移数据。
每次迁移一个区块时,MongoDB都需要更新这个区块在其路由表中的新位置。路由表存储集合中包含的所有块的位置。集合中的块越多,路由表中的“位置”就越多,并且路由表就越大。路由表越大,每次迁移后更新它所需的时间就越长。当更新路由表时,MongoDB会阻止对集合的写入。因此,将集合的块数保持在最低限度是很重要的。
通过碎片整理合并尽可能多的区块,可以通过减少集合中的区块数量来减少路由表的大小。路由表越小,用于块迁移、合并和拆分的集合上的写阻塞持续时间就越短。
什么是分片集合碎片?
块数过多的集合被视为碎片。
如下例:
其中,Customer集合的每个分片上含有615K左右个块(绿色线条)。
什么是分片集合碎片整理?
碎片整理是为了减少集合中块的数量而合并连续块的概念。
上例中,在12月5日进行碎片整理后,每个碎片上的块数已降至650个块。该客户已设法将其集群中的块的数量减少了1000倍(12.6数据)。
应该什么时候进行分片整理?
在以下情况下,应考虑对集合进行碎片整理:
一个分片集合包含20000多个块。
在添加和删除碎片之后,一旦块迁移完成。
碎片整理操作流程:
这个过程由三个不同的阶段组成,所有这些阶段都有助于减少所选集合中的块的数量。
- 第一阶段自动合并同一碎片上的可合并块。
- 第二阶段将较小的块迁移到其他碎片,以便可以合并它们。
- 第三阶段最后一次扫描集群,并合并位于同一碎片上的任何剩余的可合并块。
碎片整理操作会考虑到您的平衡窗口(balancing window)以及任何配置过的区域(zone)。
注意:在执行碎片整理时,不要修改chunkSize值,因为这可能会导致不正确的行为。
1)第一阶段:合并和测量
在碎片整理过程的第一阶段,MongoDB扫描集群中的每个碎片,并合并位于同一碎片上的任何可合并块。为碎片整理过程的下一阶段存储结果块的数据大小。
2)第二阶段:移动与合并
在第一阶段完成后,可能会有一些小块剩余。小于最大块大小集的25%的块被标识为小块。例如,MongoDB的默认块大小为128MB,所有32MB或更小的块都会被认为很小。然后,均衡器尝试在每个碎片中找到其他块,以确定它们是否可以合并。如果可以合并两个块,则移动两个块中较小的一个块以与第二个块合并。也意味着,配置的块大小越大,可以移动的“小”块就越多,可以进行的碎片整理也就越多。
3)第三阶段:最终合并
在这个阶段,平衡器扫描整个集群,以找到位于同一碎片上的任何其他可合并块,并合并它们。碎片整理过程现已完成。
使用
- 如何执行碎片管理
如果您有一个高度碎片化的集合,您可以通过配置集合平衡选项发出启动碎片整理的命令。
db.adminCommand(
{
configureCollectionBalancing: "<database>.<collection>",
defragmentCollection: true
}
)
- 如何监控碎片管理过程
在整个过程中,您可以通过执行平衡器收集状态(balancerCollectionStatus)监控碎片管理过程。请参阅我们的手册查看balancerCollectionStatus命令输出的详细示例。
- 停止碎片管理
db.adminCommand(
{
configureCollectionBalancing: "<database>.<collection>",
defragmentCollection: false
}
)
碎片管理实例
对vehicles数据库中的airplanes集合进行碎片管理,当前默认块的大小为128MB。
db.adminCommand(
{
configureCollectionBalancing: "vehicles.airplanes",
defragmentCollection: true
})
该命令会打开碎片管理,可以通过balancerCollectionStatus监控管理过程。
FAQs
见原文