14.4.4 连接数限制与超时策略
连接数限制与超时策略#
原理与架构草图#
连接数限制策略(含可执行示例)#
- 全局连接上限:限制 ProxySQL 前端连接数与后端连接数,避免过载。
- 用户级连接限制:为业务用户设置并发上限。
- 主机组级连接限制:保护关键后端实例。
示例:设置全局与用户连接上限
-- 1) 进入管理端(安装后默认监听 6032)
-- shell: mysql -u admin -padmin -h 127.0.0.1 -P6032
-- 2) 设置全局连接上限(前端连接数)
SET mysql-max_connections=2000;
SET mysql-threads=8; -- 线程数,配合连接上限使用
-- 3) 设置用户级限制(max_connections=50)
UPDATE mysql_users
SET max_connections=50
WHERE username='app_user';
-- 4) 应用配置并持久化
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
示例:限制主机组连接数
-- 限制 hostgroup 10 的后端最大连接数
UPDATE mysql_servers
SET max_connections=300
WHERE hostgroup_id=10;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
超时策略配置(含可执行示例)#
- 连接建立超时:限制建立连接等待时间。
- 会话空闲超时:回收空闲连接。
- 查询执行超时:限制单条SQL执行时长。
示例:设置连接与查询超时
-- 连接建立超时(毫秒)
SET mysql-connect_timeout_server=3000; -- 连接后端MySQL超时
SET mysql-connect_timeout_server_max=10000;-- 最大重试上限
-- 会话空闲超时(秒)
SET mysql-connection_idle_timeout=60; -- 前端空闲连接回收
SET mysql-poll_timeout=2000; -- 后端轮询超时
-- 查询执行超时(毫秒)
SET mysql-query_timeout=5000;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
验证效果
-- 查看运行时变量
SELECT * FROM runtime_global_variables
WHERE variable_name IN (
'mysql-max_connections',
'mysql-connect_timeout_server',
'mysql-connection_idle_timeout',
'mysql-query_timeout'
);
-- 查看用户限制
SELECT username, max_connections FROM runtime_mysql_users;
配置文件示例(持久化基线)#
文件路径:/etc/proxysql.cnf
mysql_variables=
{
mysql-max_connections=2000
mysql-threads=8
mysql-connect_timeout_server=3000
mysql-connection_idle_timeout=60
mysql-query_timeout=5000
}
mysql_users=
(
{ username="app_user", password="xxx", default_hostgroup=10, max_connections=50, active=1 }
)
说明:保存后需重启或执行
LOAD ... TO RUNTIME使其生效。
运维排错与常见问题#
1)连接被拒绝 / Too many connections
-- 查看连接使用情况
SELECT * FROM stats_mysql_connection_pool;
SELECT * FROM stats_mysql_global;
- 处理思路:检查业务连接池是否泄露、提高用户
max_connections或全局mysql-max_connections,并确认后端max_connections足够。
2)大量超时 / 空闲连接未回收
-- 查看连接空闲与超时指标
SELECT * FROM stats_mysql_processlist WHERE time > 60;
- 处理思路:降低
mysql-connection_idle_timeout,优化应用连接池心跳或SQL执行时间。
3)连接建立慢
-- 查看后端连接失败原因
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree, ConnERR
FROM stats_mysql_connection_pool;
- 处理思路:提升后端可用连接、检查网络延迟与MySQL响应。
安装与命令解释(快速准备)#
# 安装(以Ubuntu为例)
sudo apt-get update
sudo apt-get install -y proxysql mysql-client
# 启动与状态
sudo systemctl enable proxysql
sudo systemctl start proxysql
sudo systemctl status proxysql
proxysql:数据库中间件服务。mysql-client:用于连接 ProxySQL 管理端口(6032)。
练习#
- 将
app_user的最大连接数从 50 调整到 20,验证运行时生效。 - 设置
mysql-query_timeout=2000,并执行一个超过 2 秒的 SQL 验证超时。 - 观察
stats_mysql_connection_pool,判断哪个主机组连接最紧张,并提出调整策略。