记录一次现场com.mongodb.MongoSocketOpenException: Exception opening socket的问题排查与解决方案
问题发现
快下班时,现场运维同事发现日志有很多如下报错,并请求协助排查解决
日志部分截图如下:
问题排查
查看日志,发现部分DB连接超时
- 利用谷歌翻译,得到部分消息:连接池后台维护任务期间引发WARN异常
- 联系运维同事,让查看 MongoDB集群各分片的状态。因为VPN被其他同时占用,所以需要等待一段时间,同事告诉说DB应该是正常的。但是根据日志中有正常的业务日志判断,应该是有一个分片出问题了。
- 期间自行百度发现一些相似错误(大多数都是说bind_ip和配置连接的ip有问题,显然不是这个问题),其中有一个比较类似的说是因为连接数过多,导致time_wait超时。因为现场用户有300W,所以觉得这个比较合理。该文章链接为 https://www.jianshu.com/p/ece233d2c601。
- 联想到MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0/dbcp 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向c3p0/dbcp 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常。
- 当正准备测试time_wait时,前方同事告诉有一个分片的mongos服务挂掉了。(证明前面的判断是对的)
问题解决
1.让同事将挂掉的mongos服务重启,报错消失。