mongo连接数暴增问题
故障现象
- 使用到mongodb的服务一律无法正确使用,提示链接过多
- 相关使用到mongodb的服务器有大量mongodb的链接
排查思路
- 由于公司mongodb使用的是阿里服务,所以可以使用阿里云的运维面板查看那台机器链接mongodb是异常的
- 使用
netstat -na | grep 27017 | wc -l
命令统计当前机器持久化多少个mongodb链接
- 查阅相关技术文档
故障分析
- ❌ 可能是业务代码编写逻辑错误导致(检查相关使用mongodb代码块未发现明显问题)
- ❌ 可能是PHP结束的时候未释放mongodb链接导致的(查阅相关文档发现,很早就舍弃mongodb链接释放的函数 已经被官方标注为过时了)
- ❌ 可能是底层 php 的mongodb驱动拓展异常 (看了大半天源码也未发现明显问题,检查驱动版本也未较大型bug)
- ✔️ 可能是初始化mongodb链接的写法是错的(查阅官方文档,确实是有问题。并且之前的写法还不支持故障转移,一旦发生主从切换将会导致一直使用已经切换成从库的链接
后续
导致mongodb链接飙高是因为之前的写法是验证授权的数据库填写成链接库。例如这样:
这样的写法将会导致生成了两个不一样的DSN链接
- mongodb://1.15.150.202:27017/test1
- mongodb://1.15.150.202:27017/test2
而php mongodb驱动持久化链接是根据 hash mongodb dsn链接来确定唯一性,不唯一则进行创建一个新的链接。所以就会一个请求处理进程就产生了两个链接,正确来说只需要产生一个即可。
正确操作方法是将验证身份库统一填写成一个,这样生成的链接就只会有一条
mongodb://1.15.150.202:27017/admin
参考文献