MySQL连接数爆满时,需分层限流:系统层用iptables限IP新建连接速率,代理层(如ProxySQL)做SQL级限流,MySQL调优wait_timeout至300–600秒并监控Threads_connected与Aborted_connects,同时配平net.core.somaxconn与back_log防队列溢出。
MySQL连接数爆满时,
不是万能解药
设再高的
也挡不住恶意短连接洪峰——连接刚建就断,反复重试,
还没触发,连接池已耗尽。真正要压住的是单位时间内的新建连接速率,而非总上限。
实操建议:
用
或
在系统层限速,例如每秒只允许同一IP新建3个TCP连接:
MySQL自身不提供连接速率限制,
只防暴力密码爆破,对DDOS无效
若用代理(如
或
),必须在代理层配置
或
,MySQL后端只负责处理“已放行”的连接
为什么
和
调太低反而更危险
把这两个值从默认28800秒(8小时)砍到60秒,看似能更快回收空闲连接,但实际会让应用层频繁遭遇
——尤其在长事务、批量导入或网络抖动时。连接被杀后,应用重连逻辑若没做幂等或退避,会瞬间制造更多新连接,加剧雪崩。
实操建议:
保持
在300–600秒之间,足够覆盖大多数慢查询,又不至于让空闲连接长期占位
应用侧必须实现连接健康检查(如执行
)和指数退避重连,不能一断就狂连
监控
和
指标,如果后者突增且伴随大量
,说明
被误触发,需调高或清空
ProxySQL是目前最可行的请求级限流方案
MySQL原生不支持SQL粒度的QPS限制,
只能按用户限并发数,无法区分正常查询和高频
探测。ProxySQL可基于规则对特定语句、用户、来源IP做精确限流。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
实操建议:
在
表中插入规则,例如限制某用户每秒最多执行5次
:
,再配合
中的
和
启用
视图实时观察命中率,避免规则写错导致全量请求被误限
注意ProxySQL自身也有连接数限制(
配置项),别让它成为新的瓶颈点
连接队列溢出:
和
必须配平
当瞬时连接请求超过内核TCP连接队列长度,Linux会直接丢包,客户端看到的是
;而MySQL的
值若小于
,MySQL无法及时从队列取连接,照样积压丢弃。
实操建议:
先调系统参数:
,并写入
再同步调MySQL的
(需重启生效):值应≥
,但不超过
的1.5倍,否则浪费内存
验证是否生效:用
看
是否长期非零,若持续>0,说明队列仍在堆积
真正难的不是配几个参数,而是得清楚每一层(网络栈→代理→MySQL内核→应用连接池)谁在控什么、谁在漏什么。漏掉任意一层,限流就形同虚设。
max_connectionsmax_connectionswait_timeoutiptablesfirewalldiptables -A INPUT -p tcp --dport 3306 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROPmax_connect_errorsProxySQLHAProxyrate_limitstick-tablewait_timeoutinteractive_timeoutLost connection to MySQL server during querywait_timeoutSELECT 1Threads_connectedAborted_connectsHost 'x.x.x.x' is blocked because of many connection errorsmax_connect_errorshost_cachemax_user_connectionsSELECT 1mysql_query_rulesSELECTINSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,servers_list,apply) VALUES (1,1,'^SELECT',1,'127.0.0.1:3306',1)mysql_usersmax_connectionsmax_connections_per_hourstats_mysql_query_rulesmysql-max_connectionsnet.core.somaxconnback_logConnection refusedback_lognet.core.somaxconnsysctl -w net.core.somaxconn=4096/etc/sysctl.confback_lognet.core.somaxconnnet.core.somaxconnss -lnt | grep :3306Recv-Q