一 增加索引导致的性能问题
1 问题描述
1 并发增加大表index 2 从库异常重启构建索引到一半崩溃
增加索引具体流程
1 主节点查询对应表数据,然后build构建索引。
2 索引数据构建执行完成后,返回客户端OK。(注意:主构建完成后就通知OK给客户端,实际上这时候从节点还没有开始构建索引)
3 生成createIndex对应oplog数据到oplog表
4 从节点获取到createIndex对应oplog操作,然后重放createIndex构建索引。
2 问题解决
1去掉副本集参数 以单实例+noindexbuidlretry启动 增加索引,增加完再以副本集的成员加入集群()
1 noindexbuildretry不能和副本集一起启动
2 noindexbuildretry在4.2X以后的版本已废弃
2 重新构建从库
二 global-lock突然上升-读写TICKET剩余量减少
1 值获取
db.serverStatus().globalLock
2 获取顺序
globalLock ==> DBLock ==> CollecitonLock 在globallock层次加的是意向锁,如果是读就是(MODE_IS) 如果是写就是(mode_IX) IS和IX是无需竞争的,所以读写请求可以在没有竞争的情况下,同时传到wiredtiger引擎去处理 ,获取不到ticket,global lock值就会升高
3 如果globalLock.currentQueue.readers/writers个值长时间都不为0(此时globalLock.activeClients.readers/writers肯定是持续接近或等于128的),说明你的系统并发太高(或者有长时间占用互斥锁的请求比如前台建索引),可以通过优化单个请求的处理时间(比如建索引来减少COLLSCAN或SORT),或升级后端资源(内存、磁盘IO能力、CPU)来优化。
三 MONGO聚合内存不足
内存限制大小是16M db.collection.aggregate([{$group:{_id:"$_id"}}], {allowDiskUse: true}) 添加allowDiskUse解决
四 mongo-config异常-版本3.2X版本
1 问题描述
config servers mongo1 and mong3 differ
3.2.X版本mongo-config还是独立节点启动,所以某个config服务异常会导致config整体异常导致分配不可用
2 问题解决
1 如何进行确认呢
use config db.runCommand({dbHash:1}) 对比3个节点的hash值 取2个正确的
2 数据导出导入
停止服务异常的config服务 mongodump --config-server -d config -o /home/config
将正确的数据导入 mongorestore --config-server -d config /home/config
再启动config服务 service mongo-config start
3 问题避免
1 升级mongodb版本避免此问题
2 尽量安全启动停止整体集群服务
五 mongo无法写入 几种情况
1 mongos层挂掉
2 3.2版本的config服务出现问题
1 service 不可达
2 mongos层配置了新的config镜像导致底层无法识别
3 mongodb 某个副本集分片完全挂掉导致无法访问
4 mongodb的连接数被打满
测试集群是否正常
time mongo -u -p --authenticationDatabase admin host:port --eval "db.hxf.insert({"uid":1});"
六 too many open files导致的mongodb服务异常
解决方式
1 减少collections集合数量 2 加大mongodb的文件打开数限制
七 mongos所在的服务器高负债
mongos本身需要做聚合计算,所以会出现高负载的情况
解决方式
扩展mongos节点 并将节点提供给研发即可,减少单个mongs的资源消耗