14.10.7 日志与诊断工具使用

7. 日志与诊断工具使用#

本节围绕 ProxySQL 的日志、管理接口与系统级诊断工具,给出可执行的排障流程与练习,帮助定位连接、路由、复制与性能问题。

原理草图:日志与诊断数据流

文章图片

1)日志路径与安装后检查
安装示例(以 Debian/Ubuntu 为例):

sudo apt-get update
sudo apt-get install -y proxysql
sudo systemctl enable --now proxysql
sudo systemctl status proxysql

关键路径与配置检查:

# 默认日志路径
ls -l /var/log/proxysql/proxysql.log

# 查看配置与数据目录
grep -E 'datadir|log' /etc/proxysql.cnf

说明:datadir 决定内部 SQLite DB、运行数据位置,日志通常在 /var/log/proxysql/

2)日志级别调整(可动态排障)
通过 Admin 接口临时提升日志级别:

# 连接 Admin 接口(默认 6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032

# 在 Admin 接口中执行
SET mysql-monitor_enabled=1;
SET admin-stats_credentials="admin:admin";
SET mysql-loglevel=3;     -- 1=ERROR, 2=WARNING, 3=INFO, 4=DEBUG(因版本而异)
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

预期效果:proxysql.log 中出现更详细的连接、路由、监控日志。排障完成后恢复较低级别。

3)日志轮转配置示例

sudo tee /etc/logrotate.d/proxysql <<'EOF'
/var/log/proxysql/proxysql.log {
  daily
  rotate 7
  missingok
  notifempty
  compress
  delaycompress
  copytruncate
}
EOF

sudo logrotate -f /etc/logrotate.d/proxysql

说明:copytruncate 避免重启服务,适合在线日志轮转。

4)Admin 诊断 SQL(可直接复现)

-- 连接池与连接使用情况
SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnOK, ConnERR
FROM stats_mysql_connection_pool;

-- 路由命中统计
SELECT rule_id, hits, matches, comment
FROM stats_mysql_query_rules
ORDER BY hits DESC;

-- 慢查询与高耗时语句
SELECT digest_text, count_star, sum_time, avg_time
FROM stats_mysql_query_digest
ORDER BY sum_time DESC
LIMIT 10;

-- 运行态配置核对
SELECT * FROM runtime_mysql_servers;
SELECT * FROM runtime_mysql_users;

预期效果:能够判断连接池是否耗尽、规则是否命中、慢查询来源。

5)日志关键词与典型故障定位
- 连接失败:Access deniedtimeoutmax connections
- 路由异常:rule_id 命中为 0,destination_hostgroup 非预期
- 复制/切换异常:monitor 相关日志出现 shunread_onlylag
- 性能异常:queueconcurrency 增大,连接池 ConnUsed 长期接近上限

快速过滤:

# 近 5 分钟错误
tail -n 200 /var/log/proxysql/proxysql.log | egrep -i "error|warning|timeout|denied|shun"

# 关联某规则ID
grep "rule_id=10" /var/log/proxysql/proxysql.log | tail -n 20

6)系统级诊断工具联动

# 端口与连接状态
ss -ntp | grep 6033

# 进程文件句柄
pid=$(pidof proxysql)
lsof -p "$pid" | head -n 20

# 资源占用
top -p "$pid"
iostat -x 1 3

解释:确认监听正常、文件句柄是否耗尽、CPU/IO 是否成为瓶颈。

7)排错流程示例(连接异常)
步骤与命令:

# 1) 客户端连接失败,先看错误日志
tail -n 50 /var/log/proxysql/proxysql.log

# 2) 查看连接池状态
mysql -u admin -padmin -h 127.0.0.1 -P 6032 -e \
"SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnERR FROM stats_mysql_connection_pool;"

# 3) 验证后端连通性
mysql -u app -p'AppPass' -h 10.0.0.10 -P 3306 -e "SELECT 1;"

预期效果:
- 若后端连通性失败,问题在网络或 MySQL 本身;
- 若后端正常但连接池 ConnERR 增加,需检查 ProxySQL 用户/规则配置。

8)排错流程示例(路由不生效)

-- 1) 检查规则命中
SELECT rule_id, matches, hits, active, match_pattern
FROM stats_mysql_query_rules;

-- 2) 查看配置是否已加载到运行态
SELECT * FROM runtime_mysql_query_rules WHERE rule_id=10;

-- 3) 若未生效,重新加载
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

9)练习题(含预期结果)
- 练习1:将日志级别提升到 DEBUG,复现一次认证失败,再恢复到 INFO。
- 预期:proxysql.log 中出现 Access denied 相关记录,恢复后日志变少。
- 练习2:写一条规则匹配 SELECT 路由到读库,验证 stats_mysql_query_rules 命中。
- 预期:hits 增加且 destination_hostgroup 为读库组。
- 练习3:模拟连接池耗尽(将 max_connections 调小),观察 ConnERR 增加。
- 预期:日志出现 max connections,连接池统计有错误计数。

10)小结
通过日志、Admin 统计视图与系统级工具的组合,可以快速锁定问题归属(ProxySQL 配置、后端 MySQL、网络/系统资源),并形成可复现的排障闭环。