连接风暴通常表现为连接计数突然激增,并且经常被误诊为数据库性能问题。
本页介绍了连接风暴和"too many connections" 错误的常见原因和解决方法。如果在完成以下部分后需要其他支持,联系技术支持。
先决条件检查
要确认您的部署是否遇到连接风暴或连接限制问题,运行serverStatus 命令并检查是否有以下指示器:
突然增加
connections.current突然增加
connections.active
您还可以检查部署的日志消息是否有大量具有快速增加的 "Connection accepted"属性的connectionCount 消息,或者慢速查询日志条目是否增加。
在Atlas部署中,您可以导航到Atlas用户用户界面中的集群,然后选择 Metrics 和 Connections 以查看一段时间内的连接计数图表。
常见问题和解决方案
以下各节介绍连接风暴的常见原因以及解决方法。
连接池设置配置错误
如果将minPoolSize 设立为远低于maxPoolSize ,则驾驶员仅维护少量空闲连接。在繁重的工作负载下或重启后,驾驶员必须快速打开许多新连接才能达到工作池大小,这可能会导致新连接激增。
服务器或查询延迟较高
如果服务器或查询延迟增加,单个连接保持活动状态的时间会更长。这会迫使驾驶员打开额外的连接来处理传入的请求,从而增加总连接数。
如果您发现 connections.active 值较高且查询延迟增加,请在驾驶员连接字符串中将 minPoolSize设立为更接近 maxPoolSize 的值。这会预热连接池,并减少在负载下打开许多新连接的需要。
增加的操作负载
应用程序流量的突然增加可能会耗尽可用连接池,迫使驾驶员快速打开新连接。
如果您发现随着流量增加而出现连接峰值,请考虑在驾驶员连接字符串中将 minPoolSize 设置为更接近 maxPoolSize 的值。这可确保驾驶员保持足够的预建立连接来处理流量峰值,而无需快速打开新连接。
瞬态网络事件或应用程序重启
网络中断、滚动重启或突发的应用程序层级扩展事件都可能导致应用程序实例同时重新连接,从而使服务器因新的连接请求而不堪重负。
如果在部署事件或网络中断期间出现连接峰值,请考虑设置 maxPoolSize 以限制每个应用程序实例可以打开的连接总数。这限制了同时重新连接事件的影响。
按请求创建 MongoClient
MongoClient如果您在每次请求或函数调用时都创建一个新的 ,而不是重复使用单个共享实例,则每个客户端都可以打开自己独立的连接池,最多可达到配置的maxPoolSize 。在许多并发请求或短期执行环境中,这会使打开的连接总数成倍增加,并可能触发连接风暴。
如果您发现与请求量相关的连接计数稳定增加,请检查应用程序是否为每个请求实例化新的 MongoClient,并考虑将 MongoClient 实现为所有操作的单个共享实例。这可以稳定连接使用情况,并防止由池倍增引起的连接计数峰值。
分片集群上配置错误的路由器池
在分片的集群上,每个mongos 路由器在每个分片上维护连接池。如果这些池的大小不正确,当路由器同时打开大量内部连接时,应用程序层级上的连接风暴可能会传播到分片层级。
如果您发现源自mongos 进程的连接风暴,请考虑:
通过设置
taskExecutor参数来限制每个路由器上taskExecutorPoolSize连接池的数量。ShardingTaskExecutorPoolMinSize使用ShardingTaskExecutorPoolMaxSize和 参数控制每个路由器池中的最小和最大连接数。
预配不足的Atlas集群
每个Atlas 集群层级规定了每个节点的最大并发传入连接数。当应用程序打开的连接数超过层级允许的连接数时,集群可能会拒绝新的连接请求,并显示以下错误:
connection refused because too many open connections
connections.current如果您发现随着负载增加而出现连接拒绝,并且在调整池设置后情况没有改善,请检查 是否达到或接近集群层的限制。要按集群层查看连接限制,请参阅 Atlas Service 限制。
验证分辨率
要确认连接风暴已解决,请执行以下操作:
重新运行
serverStatus并验证connections.current是否返回到相对于connections.available的预期水平。在Atlas部署中,确认Atlas Metrics 视图中的连接计数图表已返回到基线。