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)。

练习#

  1. app_user 的最大连接数从 50 调整到 20,验证运行时生效。
  2. 设置 mysql-query_timeout=2000,并执行一个超过 2 秒的 SQL 验证超时。
  3. 观察 stats_mysql_connection_pool,判断哪个主机组连接最紧张,并提出调整策略。