连接数满
场景描述
当数据库侧连接数打满时,会收到连接数满告警或客户端新建连接超时失败。
原因分析
| 原因 | 描述 | 影响 |
|---|---|---|
| 连接池未使用或配置不当 | 未使用连接池,直接创建和关闭数据库连接。 | 高并发下数据库连接数激增,资源耗尽,系统性能下降。 |
| 连接池最大连接数设置过高。 | 低负载时维持大量连接,浪费数据库资源,可能影响其他服务。 | |
| 连接池最小空闲连接数过大。 | 低负载时维持大量空闲连接,增加数据库资源消耗。 | |
| 未及时回收空闲连接(如未配置超时时间或回收策略)。 | 空闲连接累积,最终撑满数据库连接池,新请求无法获取连接。 | |
| 业务突发流量 | 秒杀、大促等活动导致并发请求瞬间飙升,连接创建速度远超释放速度。 | 数据库连接数迅速耗尽,系统响应延迟甚至崩溃。 |
| 慢SQL与长事务 | SQL执行时间过长,占用连接未及时释放。 | 连接池可用连接减少,迫使应用创建更多连接,加剧资源竞争。 |
| 事务未及时提交,长时间占用连接。 | 连接池可用连接减少,系统性能下降,可能引发死锁或超时。 | |
| 连接泄漏 | 未正确关闭数据库连接。 | 连接池可用连接持续减少,最终导致连接资源耗尽,系统无法处理新请求。 |
预防措施
- 合理设置如下参数:
- max_user_connection:限制单个数据库用户的最大并发连接数。
- max_connections:限制整个数据库实例允许建立的并发连接总数(包含所有用户)。
- wait_timeout:控制客户端连接最大空闲时长。当非交互式客户端连接(例如通过应用程序代码进行连接)处于空闲(没有任何活动查询)且超过指定秒数后,数据库侧会主动断开该连接。
- interactive_timeout:控制客户端连接最大空闲时长。当交互式客户端连接(例如通过MySQL 命令行工具(如 mysql -u root -p)进行连接)处于空闲(没有任何活动查询)且超过指定秒数后,数据库侧会主动断开该连接。
- 设置告警规则:为关键指标设置阈值告警。例如,当连接数超过最大连接数的80% 时触发告警,提醒及时介入。
- 定期终止空闲会话和长会话。
优化建议
- 业务侧开启并合理配置连接池。
- 临时扩容数据库连接数
突发流量或短时过载时,可以临时调大max_connections的值。例如当前最大连接数为6500,可以考虑扩大一倍,修改为max_connections=13000。仅作为临时缓解手段,且有触发OOM 的风险,因此业务恢复后需立即调回原值。调大之后也可能新建连接进来可能会继续打满,因此需同时对异常SQL进行限流。
- SQL限流与异常SQL治理
- 对异常SQL(如慢查询、长事务)实施限流,优先保障核心业务。使用TaurusDB的SQL限流功能设置阈值,限制高耗资源SQL的并发数。
- 通过慢查询日志定位并优化高频慢SQL,减少单个请求的连接占用时间。
- 若各类SQL数量过多,难以实现快速限流,可以选择如下方法恢复: