Mongodb系列~实践
2024-05-28 本文已影响0人
开心的蛋黄派
一、增加索引导致的性能问题
问题描述:
- 并发增加大表索引时出现问题。
- 从库在异常重启后,构建索引到一半时崩溃。
具体流程:
- 主节点查询对应表数据,并开始构建索引。
- 索引数据构建完成后,向客户端返回OK(注意:此时从节点可能尚未开始构建索引)。
- 生成
createIndex
对应的oplog数据。 - 从节点获取到
createIndex
的oplog操作,并开始构建索引。
问题解决:
- 去掉副本集参数,以单实例模式启动并增加索引,完成后再将其加入集群(注意:
noindexbuildretry
参数在4.2版本已被废弃)。 - 重新构建从库。
二、global-lock突然上升与读写TICKET剩余量减少
问题获取:
- 通过
db.serverStatus().globalLock
获取状态,默认读写ticket为128个。
问题描述:
读写请求在globalLock层级加的是意向锁。读为MODE_IS
,写为MODE_IX
。当无法获取ticket时,globalLock值会上升。
问题解决:
- 优化查询语句。
- 升级实例的内存/CPU。
三、MONGO聚合内存不足
问题描述:
进行聚合操作时内存不足,内存限制大小为16M。
问题解决:
使用{allowDiskUse: true}
选项来允许聚合操作使用磁盘空间。
四、mongo-config异常(3.2X版本)
问题描述:
在3.2.X版本中,mongo-config还是作为独立节点启动。某个config服务异常可能导致整体异常,从而使分配不可用。
问题解决与避免:
- 通过对比不同节点的hash值来确认问题,并同步正确数据。
- 升级MongoDB版本来避免此类问题。
五、mongo无法写入
可能的原因包括:
- mongos层崩溃。
- mongos层整体堆积。
- 某个分片会话堆积。
六、too many open files导致的服务异常
查看方法:
- 使用相关命令查看最大文件打开数和已使用的文件句柄。
解决方式:
- 减少collections数量。
- 增加Linux系统中MongoDB的文件打开数限制。
- 在服务启动参数中添加相关限制。
七、mongos高负载
问题描述:
mongos需要进行聚合计算,可能导致高负载。
解决方式:
- 扩展mongos节点,减少单个mongos的资源消耗。
八、secondary节点长期处于rollback状态
当rollback数据大于300MB时,需要手动干预。最简单的解决方法是重新同步数据。
九、mongokill会话问题
相关命令:
- 使用
db.currentOp
查询长时间运行的会话。 - 使用
db.killOp
终止长时间运行的会话。
注意事项:
被kill的会话可能进入killpending状态。如果堆积过多,释放会非常缓慢,建议进行主从切换并重启从节点来释放。但如果回滚数据过多,可能需要重新同步数据。