在同样的写压力(3000次写/秒,100读/秒)的情况下,mongodb的queued write指标会慢慢升高,但是实际insert并不高(几千,有时甚至只有几百),最终影响到了实际的写入,每次得通过重启才能暂时缓解。
mongodb版本:v3.0.2
引擎:wiredTiger
mongostat截屏如下:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,MongoDB实例在写压力为3000次写/秒、100读/秒的情况下,queued write
指标逐渐升高,但实际的insert
操作并不高(几千甚至几百),最终导致写入性能下降,需要通过重启才能暂时缓解。以下是针对该问题的详细分析和解决方案:
queued write
指标升高表明写入请求在等待处理时发生了堆积。这通常与以下因素有关:
Write Concern
设置而阻塞写入操作。RECOVERING
),进一步加剧主节点的压力。Write Concern
为{w:1}
,即写入操作只需确认主节点成功即可返回。但在高写入负载下,建议调整为"majority"
,以确保数据持久性和一致性,同时避免因从节点延迟导致的写入阻塞。db.collection.insert({ key: "value" }, { writeConcern: { w: "majority" } })
rs.printReplicationInfo()
查看当前oplog窗口。use local
db.temp.drop()
db.temp.save(db.oplog.rs.find().sort({ $natural: -1 }).limit(1).next())
db.oplog.rs.drop()
db.runCommand({ create: "oplog.rs", capped: true, size: <new_size_in_bytes> })
db.oplog.rs.save(db.temp.findOne())
db.collection.getIndexes()
查看现有索引。wiredTigerCacheSizeGB
参数来增加缓存大小。storage:
wiredTiger:
engineConfig:
cacheSizeGB: <new_cache_size>
queued write
:观察写入队列的变化趋势。oplog window
:确保oplog窗口足够长。replication lag
:监控从节点的复制延迟。disk I/O
:检查磁盘吞吐量是否达到瓶颈。queued write
和replication lag
的告警阈值,及时发现潜在问题。通过优化Write Concern
设置、调整oplog大小、优化索引设计、增加硬件资源、减少短连接以及升级MongoDB版本,可以有效缓解写入队列堆积的问题。同时,建议加强监控和告警配置,以便及时发现并处理类似问题。