MongoDB持续创建并终止连接问题原因排查求助
频繁创建并断开MongoDB连接的原因分析
问题背景
我们在DigitalOcean上运行MongoDB实例,通过Node.js配置了4个参数相同的客户端连接数据库,连接配置代码如下:
MongoClient.connect({ // maxPoolSize: 200, // default is 100 useNewUrlParser: true, useUnifiedTopology: true, },
数据库日志每秒多次出现两类日志:
连接断开日志
component: "NETWORK" message: "Connection ended" context: "conn4090969" attr: { remote: "127.0.0.1:41496", connectionId: 4090969, connectionCount: 289 }
认证成功日志
component : "ACCESS" message : "Authentication succeeded" context : "conn4090966" attr : { mechanism : "SCRAM-SHA-1" speculative : false principalName : "mms-automation" authenticationDatabase : "admin" remote : "127.0.0.1:41484" extraInfo : {} }
执行db.serverStatus().connections得到连接状态数据:
active: 60 available: 50911 awaitingTopologyChanges: 1336093 current: 289 exhaustHello: 28 exhaustMaster: 14 totalCreated: 4093263
核心原因
结合日志和连接状态数据,频繁创建断开连接的原因主要有以下几点:
- 连接池未被正确复用:4个Node.js客户端默认每个带100大小的连接池,理论总连接数应在400左右,但当前
current仅289,说明客户端未复用连接池,可能每次请求都初始化新的MongoClient实例,导致连接频繁创建后被销毁。 - MMS自动化工具的周期性短连接:日志中
mms-automation用户的认证记录,说明DigitalOcean或MongoDB的自动化管理工具在周期性发起短连接做监测/管理操作,完成后立即断开,直接导致频繁的连接结束日志。 - 拓扑变更触发连接重建:
awaitingTopologyChanges数值高达133万+,说明客户端在频繁等待拓扑结构变更(如副本集选举、节点心跳异常),每次拓扑变动后客户端会重建连接适配新结构,造成大量连接销毁重建。 - 闲置连接被超时回收:MongoDB默认会回收长时间闲置的连接,如果业务请求量波动大,闲置连接达到超时阈值就会被服务器断开,新请求到来时需重新创建并认证,进而产生频繁的连接日志。
解决方案建议
- 全局复用MongoClient实例:Node.js驱动要求全局复用一个MongoClient,避免为每个请求创建新实例,确保连接池被充分利用。
- 调整连接池参数:设置
minPoolSize保留一定数量的闲置连接,避免频繁销毁;调整maxIdleTimeMS延长闲置连接存活时间,减少因超时导致的断开。 - 排查拓扑稳定性:检查MongoDB实例的节点状态,查看是否存在频繁选举、心跳失败等情况,确保副本集(若使用)运行稳定,减少拓扑变更触发。
- 调整管理工具监测频率:若为MMS自动化任务导致,可查看DigitalOcean的MongoDB管理配置,适当降低监测频率,减少不必要的短连接。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

