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. 实战练习#
- 连接耗尽演练
- 压测:并发 300 连接访问 ProxySQL
- 观察stats_mysql_connection_pool的ConnUsed是否接近上限 - 路由偏载演练
- 将规则只路由到一个 hostgroup
- 检查连接分布不均衡现象 - 事务粘滞演练
- 关闭transaction_persistent
- 观察事务内查询是否跨节点导致不一致