作者:任坤

现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1 背景

6月5号22:30左右收到几条报警短信,线上某 mongo 集群的 shard2 出现了主从延迟,过了几分钟自动恢复。 本来想假装没看见,可是过了一会又报警主从延迟,虽然这次也是自动恢复,但是不上去看一下心里有点不踏实。 这套环境为3.4集群,3 * mongos + 4 * shard(1主2从),主节点 priority=2 ,其余节点 priority=1 ,当网络畅通时确保主库永远在1节点。

2 排查

登录grafana查看主库的监控信息,这一时间段cpu和内存使用率明显上升


qps 在22:30附近线性下降为 0

连接数却持续暴涨

由此可以大致推断是连接风暴导致主库压力过大进而引发主从复制延迟,具体信息需要查看 mongod.log 。mongo 日志文件的好处是记录信息非常详细,坏处是记录信息太多导致文件占用空间很大。为此 mongo 提供了专门的切换日志指令,但该指令只负责切换不负责清理历史日志文件,并且 mongo 自身不能设置 job 以实现定期自动切换,为此需要单独编写脚本。

创建1个具有 hostManager 角色的 mongo 账号 backup ,编写如下一个 shell 脚本,每小时执行1次。

[root@ mongod]# more logrotate_mongo.sh
#!/bin/shMONGO_CMD=/usr/local/mongodb/bin/mongo
KEEP_DAY=7#flush mongod log
datadir=/data/mongodb
port=27017
role=mongod
destdir=/data/backup/mongolog/${role}
if [ ! ‐d "${destdir}" ]; thenmkdir ‐p ${destdir}
fi
$MONGO_CMD ‐‐authenticationDatabase admin admin ‐ubackup ‐p"*****" ‐‐eval
"db.runCommand({logRotate:1})" ‐‐port $port
mv ${datadir}/mongod.log.????‐??‐??T??‐??‐?? ${destdir}/
find $destdir ‐name "mongod.log.*" ‐mtime +${KEEP_DAY} ‐exec rm ‐rf {} \;

归档的日志文件如下,22:00-23:00时间段生成的日志量比平时多出1个量级,由此也可以反向推断出 mongo 在这段时间压力有异常。

‐rw‐r‐‐r‐‐ 1 root root  11647760 Jun 5 18:00 mongod.log.2021‐06‐05T10‐00‐02
‐rw‐r‐‐r‐‐ 1 root root  12869316 Jun 5 19:00 mongod.log.2021‐06‐05T11‐00‐01
‐rw‐r‐‐r‐‐ 1 root root  15625361 Jun 5 20:00 mongod.log.2021‐06‐05T12‐00‐03
‐rw‐r‐‐r‐‐ 1 root root  10993819 Jun 5 21:00 mongod.log.2021‐06‐05T13‐00‐02
‐rw‐r‐‐r‐‐ 1 root root  71500070 Jun 5 22:00 mongod.log.2021‐06‐05T14‐00‐40
‐rw‐r‐‐r‐‐ 1 root root 215216326 Jun 5 23:00 mongod.log.2021‐06‐05T15‐00‐02

查询对应时间点的日志,出现大量创建工作线程失败的信息

2021‐06‐05T22:28:00.821+0800 I ‐    [thread2] failed to create service entry worker
thread for 172.31.0.65:39890
2021‐06‐05T22:28:00.821+0800 I NETWORK [thread2] connection accepted from
172.31.0.66:45090 #4051839 (32622 connections now open)
2021‐06‐05T22:28:00.821+0800 I ‐    [thread2] pthread_create failed: Resource
temporarily unavailable
2021‐06‐05T22:28:00.821+0800 I ‐    [thread2] failed to create service entry worker
thread for 172.31.0.66:45090
2021‐06‐05T22:28:00.821+0800 I NETWORK [thread2] connection accepted from
172.31.0.65:39892 #4051840 (32622 connections now open)
2021‐06‐05T22:28:00.821+0800 I ‐    [thread2] pthread_create failed: Resource
temporarily unavailable

同一时间段从库的日志:

2021‐06‐05T22:30:07.325+0800 I REPL     [ReplicationExecutor] Error in heartbeat request
to 172.31.0.183:27017; ExceededTimeLimit: Couldn't get a connection within the time limit
2021‐06‐05T22:30:07.425+0800 I SHARDING [migrateThread] Waiting for replication to catch
up before entering critical section

主库几乎失去了响应能力,从库定时心跳发起的连接都无法创建,进而触发主从选举,当前从库临时被选为主库。 等老主库恢复响应并重新加入集群后,又重新夺回控制权。

采用mtools解析日志,输出结果也验证了这一点,正常情形下183为主库114为从库,

[root@vm172‐31‐0‐183 mongod]# mloginfo mongod.log.2021‐06‐05T15‐00‐02 ‐‐rsstate
.....
RSSTATE
date               host                  state/messageJun 05 22:28:05    172.31.0.114:27017    PRIMARY    #114被选举为主库
Jun 05 22:36:41    172.31.0.114:27017    SECONDARY  #114被降级为从库[root@vm172‐31‐0‐114 mongod]# mloginfo mongod.log.2021‐06‐05T14‐48‐24 ‐‐rsstate......
RSSTATE
date               host                  state/messageJun 05 22:31:50    172.31.0.183:27017    ROLLBACK   #183以从库身份加入集群,执行rollback和recover流程,
Jun 05 22:34:48    172.31.0.183:27017    RECOVERING
Jun 05 22:35:52    172.31.0.183:27017    SECONDARY  #183的状态变为secondary后,因为priority更高因此触发了新一轮选举
Jun 05 22:36:43    172.31.0.183:27017    PRIMARY    #183重新变成了主库

接下来的问题是确认是哪些应用服务器发起的连接风暴,shard节点的连接都是由mongos发起的,只能去查看mongos实例的日志。 还是采用mtools工具,输出如下: 这个是21:00-22:00时间段的连接创建信息

[root@ mongos]# mloginfo mongod.log.2021‐06‐05T14‐00‐01 ‐‐connections
......CONNECTIONStotal opened: 8904total closed: 5645no unique IPs: 6socket exceptions: 649127.0.0.1    opened: 2683 closed: 2683
172.31.0.21  opened: 1531 closed: 733
172.31.0.28  opened: 1525 closed: 676
172.31.0.81  opened: 1520 closed: 704
172.31.0.78  opened: 1495 closed: 699
172.31.0.134 opened: 150  closed: 150

这个是22:00-23:00时间段的连接创建信息,很明显这个时间段有问题

[root@ mongos]# mloginfo mongod.log.2021‐06‐05T15‐00‐01 ‐‐connections
......CONNECTIONStotal opened: 58261total closed: 58868no unique IPs: 7socket exceptions: 3708172.31.0.78  opened: 14041  closed: 14576
172.31.0.21  opened: 13898  closed: 14284
172.31.0.28  opened: 13835  closed: 13617
172.31.0.81  opened: 13633  closed: 13535
127.0.0.1    opened: 2681   closed: 2680
172.31.0.134 opened: 170    closed: 176
172.31.0.4   opened: 3      closed: 0

由此确认这次事件是由应用服务器连接异动造成,剩下的就是将这些信息交给开发人员进一步审核。

3 总结

这个案例总体比较好诊断,只是需要用到2个工具,1个是定期切换日志的shell脚本,1个是由 mongo 官方工程师编写的 mtools 。 它们可以帮助我们快速查看日志并从中提取出诊断所需的关键信息,极大的提升了工作效率。

技术分享 | mongo 集群连接数暴涨处理案例一则相关推荐

  1. 技术分享 | Redis 集群架构解析

    作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作.其他身份:柯基铲屎官. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.集群架构的 ...

  2. 技术分享 | 无人机集群——分布式控制算法

    上期我们讲解了四种集群分布式控制算法之后,那么,接下来向大家介绍一下分布式控制中的常用算法吧.但是为了帮助大家更好的理解raft算法,先从一个简单的例子入手吧! 假如某班(组成人员:follower) ...

  3. Java技术分享:集群环境下的定时任务

    定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz框架等. Timer+TimerTask是 ...

  4. 技术分享|探究群体智能—基于UWB定位技术的无人机集群协同

    随着无人机性能水平提高,无人机在民用类和军事类活动中的使用越来越广泛.由于无人机飞行环境和任务难度不同,单架无人机因为自身动力和负荷能力很难独自完成任务,无人机集群协同作业则是当前科技现代化的任务要求 ...

  5. 容器编排技术 -- 使用Minikube集群

    容器编排技术 --  使用Minikube集群 0.1 目标 0.2 Kubernetes集群 1 集群结构图 目标 了解Kubernetes集群是什么. 了解Minikube是什么. 使用在线终端启 ...

  6. 容器编排技术 -- 创建Kubernetes集群

    容器编排技术 -- 创建Kubernetes集群 Kubernetes可以在多种平台运行,从笔记本电脑,到云服务商的虚拟机,再到机架上的裸机服务器.要创建一个Kubernetes集群,根据不同场景需要 ...

  7. 搭建mongo集群,以及分片和副本

    (我这里是安装在3个节点上,分别为:node1,node2,node3) 1. 安装 mongodb到node1,2,3节点 https://blog.csdn.net/ZZPJackie/artic ...

  8. K8S排水错误汇总(忽略DaemonSet管理Pod、Mysql集群排水报错、Mongo集群排水报错)

    文章目录 [成功排水展示] 初始状态 排水命令 正确排水的输出 排水后结果 恢复节点 [FAQ] 1. 忽略DaemonSet管理的Pod 语法 报错示例 2. 删除本地数据 语法 报错示例(mysq ...

  9. Spark在集群上执行代码案例(中文切词)

    Spark在集群上执行代码案例 java的切词使用案例(Demo) Spark中文切词代码 需求:利用jieba进行中文分词,并打包上传到集群进行执行 java的切词使用案例(Demo) @Test ...

最新文章

  1. mysql中find_in_set_mysql中find_in_set()函数的使用详解
  2. linux的fork语句,Linux C/C++——fork()函数基础
  3. 行业人士谈悄然成功的《星际战甲》所带来的启示
  4. ArcGIS 10.x属性表乱码问题解决办法
  5. 探索 Word 2007 开发(四):上传图片
  6. lucene Collector 文档收集器
  7. 微信域名防封最全代码
  8. 机房搬迁实施规划方案
  9. 如何使android应用开机时自动启动,如何使APP开机自启动
  10. 计算机毕业设计Java校友闲置书籍管理平台(源码+系统+mysql数据库+Lw文档)
  11. 小米平板4刷recovery教程_小米平板2中文Recovery刷机教程
  12. 计算机的格式刷,“excle怎样取消格式刷“电脑上格式刷怎么用excel2000
  13. Git Tower 3.2 - 最好用的代码管理工具
  14. 【持续更新中······】 各种模板+神奇黑科技
  15. android照片涂抹功能,android照片涂画功能实现过程及原理
  16. 【DPDK】dpdk样例源码解析之二:dpdk-helloworld
  17. Linux——文件句柄数设置
  18. git push代码时自动化添加reviewer
  19. 关于word文档受保护的问题,不能编辑,转成能编辑的文档
  20. 青可儿——名副其实的“三好饼干”

热门文章

  1. LaTex公式(网页)编辑器
  2. 云南省铁路桥梁检测公司
  3. Excel表格文件解密:轻松解密密码
  4. rtx2060什么水平_RTX2060性能实测,最贵“甜品级”显卡到底香不香?
  5. [极客大挑战 2019]Upload(菜刀连接文件上传出现: HTTP/1.1 200 OK)
  6. 事务的四大特性及实现原理
  7. 电脑经常卡是怎么回事?
  8. MIT6.824 Primary-Backup Replication论文导读
  9. Vue3快速入门教程
  10. Horizon Client 配置设置和命令行选项