14.4.7 连接管理常见问题与排查

连接管理常见问题与排查#

原理草图:前端连接、后端连接与连接池#

文章图片

1. 连接数异常与耗尽#

  • 现象:客户端频繁报“Too many connections”、连接建立缓慢、ProxySQL admin 端口卡顿。

安装/准备(用于排查连接数的客户端)

# Debian/Ubuntu
apt-get update && apt-get install -y mysql-client

# CentOS/RHEL
yum install -y mysql

关键命令与解释

-- 连接 ProxySQL 管理端
mysql -u admin -padmin -h 127.0.0.1 -P6032

-- 查看前端/后端连接池使用情况
SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnOK, ConnERR
FROM stats_mysql_connection_pool;

-- 查看前端用户连接限制
SELECT username, max_connections, default_hostgroup
FROM mysql_users;

-- 查看后端节点设置
SELECT hostgroup_id, hostname, max_connections, weight, status
FROM mysql_servers;
  • ConnUsed/ConnFree:正在使用/空闲连接数
  • max_connections:每节点允许的最大连接
  • weight:负载权重

排查流程
1. 对比 ConnUsed 是否接近 max_connections
2. 查找长时间不释放的连接(stats_mysql_processlist)。

处理建议
- 增大后端连接池,限制前端用户连接数,优化应用连接池。

示例:快速设置连接上限

UPDATE mysql_users SET max_connections=200 WHERE username='app_user';
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

预期效果:app_user 的前端并发连接被限制为 200。


2. 连接建立慢或握手失败#

  • 现象:连接耗时高、偶发“Lost connection at handshake”。

排查命令

# 检查 ProxySQL 到 MySQL 的连通性与延迟
ping -c 3 10.0.0.10

# 检查 MySQL 握手耗时
time mysql -u app_user -p -h 127.0.0.1 -P6033 -e "select 1"
-- 检查认证插件与用户配置
SELECT username, default_hostgroup, transaction_persistent, use_ssl
FROM mysql_users;

处理建议
- 关闭不必要 DNS 解析:mysql-interfaces 使用 IP。
- 统一认证插件(MySQL 用户与 ProxySQL 一致)。
- 优化路由规则匹配。

示例:检查规则是否全量匹配

SELECT rule_id, match_pattern, destination_hostgroup, active
FROM mysql_query_rules
ORDER BY rule_id;

3. 连接池不均衡与热点#

  • 现象:某后端连接数过高,其他节点空闲。

排查命令

SELECT hostgroup, srv_host, ConnUsed, ConnFree
FROM stats_mysql_connection_pool
ORDER BY ConnUsed DESC;

处理示例:调整权重

UPDATE mysql_servers SET weight=100 WHERE hostname='10.0.0.10';
UPDATE mysql_servers SET weight=50  WHERE hostname='10.0.0.11';
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

预期效果:权重高的节点承担更多连接。


4. 连接复用异常与事务问题#

  • 现象:报“Commands out of sync”、事务内查询不一致、会话变量丢失。

检查与说明

SELECT username, transaction_persistent
FROM mysql_users;
  • transaction_persistent=1:同一事务固定后端连接。

处理示例

UPDATE mysql_users SET transaction_persistent=1
WHERE username='app_user';
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

预期效果:事务内连接保持一致,避免会话状态丢失。


5. 用户权限与映射错误#

  • 现象:登录失败、访问特定库表被拒绝。

排查命令

SELECT username, password, default_hostgroup
FROM mysql_users;

-- 后端 MySQL 验证
mysql -u app_user -p -h 10.0.0.10 -e "SHOW GRANTS;"

处理建议
- 保证 ProxySQL 与后端用户/密码一致。
- 后端授权覆盖代理业务访问。

示例:后端授权

GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

6. 超时与断连#

  • 现象:空闲连接被断开,业务频繁重连。

排查命令

SHOW VARIABLES LIKE 'mysql-connection_timeout';
SHOW VARIABLES LIKE 'mysql-ping_timeout_server';
SHOW VARIABLES LIKE 'mysql-connpoll_reset_queue_length';

处理示例:调整超时

SET mysql-connection_timeout=10000;
SET mysql-ping_timeout_server=2000;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

预期效果:减少空闲连接被过早断开。


7. 排查工具与常用查询#

常用统计视图

SELECT * FROM stats_mysql_connection_pool LIMIT 10;
SELECT * FROM stats_mysql_processlist LIMIT 10;
SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 10;

诊断流程
1. 连接池状态与热点节点
2. 用户与路由规则
3. 网络与认证插件


8. 最佳实践#

  • 业务连接池与 ProxySQL 连接池联动调优,避免双重放大。
  • 对会话状态依赖强的业务开启事务持久化或禁用连接复用。
  • 定期审计用户权限与路由规则,避免不必要的全量匹配。

9. 实战练习#

  1. 连接耗尽演练
    - 压测:并发 300 连接访问 ProxySQL
    - 观察 stats_mysql_connection_poolConnUsed 是否接近上限
  2. 路由偏载演练
    - 将规则只路由到一个 hostgroup
    - 检查连接分布不均衡现象
  3. 事务粘滞演练
    - 关闭 transaction_persistent
    - 观察事务内查询是否跨节点导致不一致