You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:25:14