更新时间:2023-08-31 GMT+08:00
排查DDS实例连接数耗尽的问题
数据库连接数表示应用程序可以同时连接数据库的数量,与您应用程序或者网站能够支持的最大用户数没有关系。
- 对于集群实例,一般指客户端同mongos之间的连接数。
- 对于副本集实例,一般指客户端同Primary节点和Secondary节点之间的连接数。
问题现象
当DDS实例的连接数已满时,新发起的连接请求将无法被响应,从而导致实例连接失败。
- 使用Mongo Shell连接实例时,出现如下提示,表示当前连接池的连接数已满。
- 使用Python连接实例时,出现以下提示,表示当前连接池的连接数已满。
pymongo.errors.ServerSelectionTimeoutError: connection closed, connection closed
- 查看实例监控,发现实例连接数确实被耗尽。
解决方法
经过上述步骤确认为连接数耗尽问题后,需要根据突发流量与长期业务两种情况分别处理。
- 突发流量造成的连接数满,考虑重启实例或节点释放当前连接。并同时排查客户端连接,是否存在大量重试请求,如果是大量重试请求引起的连接数耗尽,考虑修改客户端参数(修改重试逻辑,增大超时重试时长),从而避免连接数积压。
重启实例的操作会将实例的节点进行轮转重启,每个节点会有30秒左右的闪断,如果集合的数量较多(超过1万),闪断时间也会随之变长,重启前请做好业务安排并确保应用有重连机制。
- 针对长期业务导致的连接数耗尽,可以适当上调最大连接数(修改“net.maxIncomingConnections”的值,该参数修改后实时生效),保证每次调整幅度在20%以内,调整后观察负载变化。如果发现上调连接数后负载较高,说明实例负载已经达到瓶颈,请及时进行规格扩容。