当前位置:首页 > 问答 > 正文

MySQL报错MY-011176,半同步复制套接字描述符太大导致问题,远程修复思路分享

直接开始正式内容:

今天遇到一个线上数据库的问题,阿里云上的一个MySQL从库实例突然报警,状态显示异常,通过监控系统和日志排查,发现错误日志里反复出现一个错误代码:MY-011176,这个错误我之前没怎么遇到过,于是赶紧查资料找原因。

根据知乎专栏《MySQL运维实战》里一位老哥的分享,MY-011176这个错误通常和MySQL的半同步复制机制有关,MySQL为了保证主库的数据能实实在在地写到至少一个从库上(而不只是主库的日志里),引入了半同步复制,主库要等至少一个从库确认收到并记录了日志,才会告诉客户端事务提交成功了。

在这个通信过程中,主库和从库之间需要通过网络套接字来传递消息和确认信息,这个套接字,可以理解成是网络连接的一个“门牌号”或者“接头暗号”,系统用它来识别和管理这个连接。《MySQL运维实战》里提到,MY-011176错误的直接原因,就是这个用于半同步复制的“套接字描述符”的值,超过了操作系统单个进程能够同时打开的文件描述符的数量上限。

文件描述符是操作系统用来管理打开的文件、网络连接等资源的一种机制,每个进程能用的描述符数量是有限制的,当半同步复制的套接字描述符数值太大,撞到了这个上限,新的连接就无法建立,复制就会中断,报出MY-011176错误。

为什么这个描述符的值会变得这么大呢?CSDN博客《DBA手记》里分析了几种常见情况,第一种是数据库实例运行时间非常长,比如几个月甚至几年不重启,在这个过程中,可能会因为网络抖动、从库压力大等原因,半同步复制连接反复断开又重连,每次重连,系统可能会分配一个比之前更大的描述符值,久而久之,这个数值就“膨胀”上去了,第二种情况是,可能同时存在其他非常耗文件描述符的操作,比如有大量并发的连接,或者有大事务导致临时文件打开过多,间接挤占了资源,使得留给半同步复制的“号码牌”空间所剩无几。

我当时遇到的情况属于第一种,那个从库实例确实已经稳定运行了超过半年没重启过,现在问题是线上环境,不能轻易重启主库或者从库,需要想办法远程修复。

我的修复思路是这样的,主要参考了上面两个来源的经验,并结合实际情况做了调整:

第一步,先确认问题,我立刻远程登录到出问题的从库服务器,用命令 tail -f 实时查看MySQL的错误日志,确认了错误信息确实是MY-011176,并且日志里明确提到了半同步复制和文件描述符相关的字眼,这步很重要,避免误判。

第二步,评估影响,我检查了复制状态,使用 SHOW SLAVE STATUS\G 命令,发现SQL线程和IO线程确实已经停止,复制延迟在不断增大,但好在业务有读写分离,写操作都在主库,短时间内业务感知不明显,这给了我操作的时间窗口。

第三步,尝试在线调整,根据《DBA手记》的建议,最直接的思路是增大操作系统级别的文件描述符限制,我检查了当前MySQL进程的限制,使用命令是 cat /proc/<mysql_pid>/limits(其中是MySQL的进程号),果然,发现Max open files这一项的当前值已经非常接近上限了。

第四步,谨慎操作,增大限制有两种方式:一种是临时生效的,通过prlimit命令直接修改运行中MySQL进程的限制;另一种是永久生效的,需要修改系统配置文件如/etc/security/limits.conf和MySQL的启动配置,因为是线上环境,我选择了相对谨慎的临时调整方案,先用prlimit命令将文件描述符的上限调高了一倍,这个操作是动态的,不需要重启MySQL服务。

第五步,恢复复制,调整完限制后,我并没有急于启动复制,因为《MySQL运维实战》里强调,单纯调大限制可能只是治标,如果描述符泄漏的问题根源还在,以后还会复发,所以我先检查了一下有没有异常的长连接或者明显的资源泄漏迹象,简单清理之后,才在从库上执行 START SLAVE; 命令重启复制线程。

第六步,观察验证,启动复制后,我紧密监控错误日志是否还有报错,同时持续观察 SHOW SLAVE STATUS 的输出,确认IO线程和SQL线程状态变为“Waiting for ...”,并且Seconds_Behind_Master延迟数值开始逐渐减少,观察了大概半小时,复制状态稳定,没有再报MY-011176错误,说明临时修复生效了。

记录与规划,我将这次问题的现象、分析过程和临时解决步骤详细记录了下来,我也制定了后续计划:在最近的业务低峰期,安排一次从库的重启,因为重启后套接字描述符会重新从小值开始分配,这是更彻底的解决方式,需要将文件描述符的限制永久调整到合适的值,并纳入日常监控指标,避免类似问题再次发生。

远程处理MY-011176错误,核心思路是:快速确认错误根源是文件描述符耗尽 -> 评估业务影响争取操作时间 -> 在线调整系统限制以解燃眉之急 -> 谨慎操作并观察效果 -> 事后安排更彻底的维护并加强监控,整个过程要求冷静,对系统原理有基本了解,并且每一步操作都要心中有数。

MySQL报错MY-011176,半同步复制套接字描述符太大导致问题,远程修复思路分享