代码改变世界

MongoDB 复制集节点间数据大小差异的处理

2024-09-04 21:39  abce  阅读(36)  评论(0编辑  收藏  举报

在使用 WiredTiger 存储引擎的MongoDB 复制集环境中,可能会遇到主节点和辅助节点之间数据大小不一致的情况。出现这种问题时,辅助节点使用的磁盘空间会大大超过主节点。这个问题的原因是有很高比例的脏页,加上需要在内存中保存大量文档的缓存来满足"majority concern",从而导致辅助节点的内存的压力和激进的驱除(eviction )操作,从而导致页分裂。默认的页面大小是 4 KB。

 

WiredTiger 的官方文档写道:

·大多数应用程序不需要调整页的大小。

·选择 4 KB 大小是为了与大多数平台上的虚拟内存页大小和直接 I/O 要求兼容(大多数常见服务器平台为 4 KB)。

·数值越小,溢出所需的文件空间就越小。例如,如果分配大小设置为 4 KB,一个 18,000 字节的溢出项需要 5 个分配单元,浪费约 2 KB 的空间。如果分配大小为 16 KB,同样的溢出将浪费 10 KB 以上的空间。

 

识别问题

在其中一个场景中,我们观察到辅助节点上出现了激进的驱逐行为,同时 WiredTiger 缓存中的脏页面数量稳定在 20%。使用 Percona Monitoring and Management 等监控工具分析 MongoDB 指标时可以看到这一点:

需要注意的是,eviction_dirty_trigger 参数的默认值是20% 。一旦达到该阈值,应用程序线程将被限制(throttled),这不仅会导致磁盘大小问题,还会造成性能问题。

 

解决问题

解决数据大小问题

为了解决这个问题,我建议做两个配置修改,通过测试来缓解这个问题:

 

1.降低 replBatchLimitOperations

该设置可控制复制过程中单个批次应用的最大操作数。我们可以通过设置较小的批次来降低该限制,从而减轻辅助节点的内存压力。

 

建议:

将 replBatchLimitOperations(默认值为 5000)设为 500-1000。此设置既可以动态修改,也可以在配置文件中修改。

在线修改:

mongo> db.adminCommand( { "setParameter": 1, "replBatchLimitOperations": 1000})

配置文件修改:

setParameter:      
     replBatchLimitOperations: 1000

 

2.降低 replWriterThreadCount 值

该参数控制辅助节点上用于复制写入的线程数(默认为 16)。减少线程数可以减少写入的无序应用,允许更多的写入合并和更少的页分裂,从而缓解臃肿问题。将其设置为 1 将同时消除并行性和无序问题。该参数不是动态的,因此有必要在配置文件中将 replWriterThreadCount 设为 1。

setParameter:
    replWriterThreadCount: 1

 

必须仔细测试这些修改,因为它们可能会对复制性能产生不同的影响。建议每次应用一项修改,以确定哪项调整能有效解决问题。

 

以上修改旨在防止出现进一步的数据差异。它们不会解决数据集中的任何现有的差异。要解决之前导致的磁盘大小差异,必须执行初始同步或压缩操作。