升级 mongodb 集群后 mongos 连接异常,主因是客户端驱动仍用旧版逻辑或过时配置(如 useunifiedtopology: false),导致连接池紊乱、超时触发或空闲连接不释放;须统一更新为新版参数并彻底重启应用清理残留连接。

升级 MongoDB 集群(尤其是从 4.x 到 5.0+ 或 6.0)后,mongos 连接异常、频繁断连、MongoWaitQueueFullException 或 Socket recv() errno:54 Connection reset by peer 等问题,大概率不是 mongos 本身故障,而是客户端驱动仍沿用旧版连接逻辑或残留过时配置——这些配置在新版中已被弃用、行为变更,甚至引发连接池紊乱。
为什么升级后 mongos 连接突然变脆?
新版 mongos(5.0+)对连接生命周期、超时策略和拓扑发现更严格;而老版本驱动(如 Java Driver 3.12、Node.js Driver v3.x、PyMongo useUnifiedTopology=false、maxPoolSize 语义模糊、或隐式依赖已移除的 socketKeepAlive 行为,会导致连接无法复用、空闲连接不回收、重连风暴等问题。尤其当驱动未显式关闭旧连接时,升级后 mongos 会拒绝或快速中断这些“不合规”的长连接。
Node.js 驱动:必须清理 useUnifiedTopology 和 legacy connect() 调用
Node.js Driver v4+ 已完全移除回调式 connect(),且 useUnifiedTopology 不再是可选项(默认 true),但大量遗留代码仍保留该参数或错误调用方式:
- ❌ 错误写法(v3 风格残留):
client.connect((err, client) => {...})—— 会静默失败或抛TypeError: Cannot read property 'then' of undefined - ❌ 多余配置:
useUnifiedTopology: false或useNewUrlParser: true(v4+ 已强制启用)—— 可能触发拓扑发现异常,导致serverSelectionTimeoutMS频繁触发 - ✅ 正确做法:只保留必要参数,显式控制连接生命周期:
const client = new MongoClient(uri, { serverSelectionTimeoutMS: 5000, maxIdleTimeMS: 60000, minPoolSize: 5, maxPoolSize: 20 });
Java Driver:connectionsPerHost 和 multiplier 必须重设
Java Driver 4.x+ 彻底重构连接池模型,connectionsPerHost 和 threadsAllowedToBlockForConnectionMultiplier 已被 maxConnectionPoolSize 和 minConnectionPoolSize 替代。若沿用旧配置,驱动会忽略或降级处理,导致实际连接数失控:
- ❌ 升级后仍写:
connectionsPerHost=100+multiplier=5—— 驱动不再识别,退回到默认maxConnectionPoolSize=100,但无空闲回收,极易压满mongos - ✅ 正确做法:显式设置新参数,并启用空闲回收:
ConnectionString connectionString = new ConnectionString("mongodb://mongos1:27017"); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .applyToConnectionPoolSettings(builder -> builder.maxConnectionPoolSize(30) .minConnectionPoolSize(5) .maxConnectionLifeTime(0, TimeUnit.MILLISECONDS) // 永不过期 .maxConnectionIdleTime(60, TimeUnit.SECONDS)) // 关键:60秒空闲即释放 .build();
PyMongo:避免 poolSize 与 maxPoolSize 混用
PyMongo 3.x 中 poolSize 是全局连接池大小,而 4.0+ 改为 maxPoolSize(per-host),且默认值从 100 降到 100。若升级后未调整,高并发下容易出现 WaitQueueFullException:
- ❌ 错误迁移:
MongoClient(host, port, poolSize=100)—— 在 PyMongo 4.x 中该参数被忽略,实际使用默认maxPoolSize=100,但未配minPoolSize和maxIdleTimeMS,连接无法及时复用 - ✅ 正确做法:统一用新参数,显式控制空闲行为:
client = MongoClient( "mongodb://mongos1:27017", maxPoolSize=20, minPoolSize=5, maxIdleTimeMS=60000, serverSelectionTimeoutMS=5000 )
最易被忽略的一点:驱动升级后,旧连接不会自动失效,它们可能还在后台维持着“半死”状态,持续占用 mongos 连接槽位。务必在应用重启时,确保旧进程彻底退出(检查 ps aux | grep node/java/python),否则新驱动实例一上来就撞上残留连接,问题照旧。











