14.10.6 监控告警异常与指标缺失

本节聚焦 ProxySQL 监控告警异常与指标缺失的排查思路,覆盖采集链路、指标源、权限与性能等关键点,并提供可执行命令、配置、原理草图与练习。

原理草图:监控采集链路

文章图片

1. 采集链路自检(含安装/验证)#

1)安装与启动 exporter(示例)

# 下载并安装(以Linux amd64为例)
curl -L -o /usr/local/bin/proxysql_exporter \
  https://github.com/percona/proxysql_exporter/releases/download/v1.1.0/proxysql_exporter
chmod +x /usr/local/bin/proxysql_exporter

# 创建systemd服务
cat >/etc/systemd/system/proxysql_exporter.service <<'EOF'
[Unit]
Description=ProxySQL Exporter
After=network.target

[Service]
ExecStart=/usr/local/bin/proxysql_exporter \
  --proxysql-admin-username=stats \
  --proxysql-admin-password=Stats@123 \
  --proxysql-admin-address=127.0.0.1 \
  --proxysql-admin-port=6032 \
  --web.listen-address=:9104
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now proxysql_exporter

2)链路连通性与端口检查

# 检查端口监听
ss -lntp | grep -E '6032|9104'

# 本机抓取测试,预期返回metrics文本
curl -s http://127.0.0.1:9104/metrics | head

3)Prometheus 抓取配置示例

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'proxysql'
    scrape_interval: 15s
    scrape_timeout: 5s
    static_configs:
      - targets: ['10.0.0.11:9104']

2. 指标来源核验(admin统计表)#

关键表查询

-- 连接 admin 6032
mysql -u stats -pStats@123 -h 127.0.0.1 -P6032

-- 统计表是否更新
SELECT * FROM stats_mysql_connections LIMIT 5;
SELECT * FROM stats_mysql_global;
SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 5;

命令解释
- stats_mysql_connections:连接数变化,若长期为 0 可能无流量或被绕过。
- stats_mysql_global:全局计数器,判断是否在增长。
- stats_mysql_query_digest:慢查询和统计重表,频繁抓取可能带来压力。


3. 权限与账号问题(最小权限示例)#

创建统计账号

-- 在admin端执行
INSERT INTO admin_users(username,password,default_hostgroup,active) 
VALUES('stats','Stats@123',0,1);

-- 赋予访问stats表权限
UPDATE admin_users SET use_ssl=0 WHERE username='stats';

LOAD ADMIN USERS TO RUNTIME;
SAVE ADMIN USERS TO DISK;

校验凭据与变量

SHOW VARIABLES LIKE 'admin-%';
-- 重点:admin_credentials、stats_credentials、mysql_ifaces

4. 运行时与配置一致性(LOAD/SAVE)#

-- 修改配置后必须加载到 runtime
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

-- 保存到磁盘,防止重启丢失
SAVE MYSQL USERS TO DISK;
SAVE MYSQL VARIABLES TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

5. 指标缺失常见原因与修复示例#

原因 A:业务绕过 ProxySQL

# 应用侧检查连接目标(预期指向 ProxySQL)
ss -tnp | grep 3306 | head

原因 B:规则未生效或统计未开启

-- 查看规则是否启用统计
SELECT rule_id, active, apply, flagIN, flagOUT 
FROM mysql_query_rules;

-- 重新加载规则
LOAD MYSQL QUERY RULES TO RUNTIME;

原因 C:exporter 与 ProxySQL 版本不兼容

proxysql_exporter --version
proxysql --version
# 对比发行说明,必要时升降级并验证metrics

6. 告警异常与误报排查#

口径对齐示例(PromQL)

# 活跃连接 vs 总连接
proxysql_mysql_connections{state="ACTIVE"} > 200
proxysql_mysql_connections{state="TOTAL"} > 200

标签与聚合检查

# 检查实例标签是否完整
count by (instance) (proxysql_mysql_connections)

7. 性能与采集压力控制#

建议:降低重表抓取频率

# Prometheus分级抓取(示例)
scrape_configs:
  - job_name: 'proxysql_fast'
    scrape_interval: 15s
    static_configs:
      - targets: ['10.0.0.11:9104']
  - job_name: 'proxysql_slow'
    scrape_interval: 2m
    metrics_path: /metrics
    params:
      collect[]: [mysql_query_digest]   # 需配合exporter支持
    static_configs:
      - targets: ['10.0.0.11:9104']

8. 日志与诊断命令#

# exporter 日志(systemd)
journalctl -u proxysql_exporter -n 200 --no-pager

# ProxySQL 日志
tail -n 200 /var/lib/proxysql/proxysql.log

9. 快速修复清单(可操作步骤)#

  1. 放通 6032/9104 端口与安全组,ss -lntp 验证。
  2. 修正 admin/stats 账号,SHOW VARIABLES LIKE 'admin-%'; 检查。
  3. 确保 LOAD ... TO RUNTIME,并 SAVE ... TO DISK
  4. 流量确认走 ProxySQL,应用连接指向 6033。
  5. 版本对齐 exporter 与 ProxySQL,并验证 /metrics 输出。

10. 练习与自测#

练习1:故障注入与恢复

# 停掉 exporter,观察监控“无数据”告警
systemctl stop proxysql_exporter

# 恢复
systemctl start proxysql_exporter

练习2:制造权限问题

-- 修改密码导致抓取失败
UPDATE admin_users SET password='BadPwd' WHERE username='stats';
LOAD ADMIN USERS TO RUNTIME;

-- 预期:/metrics 报认证失败

练习3:验证指标增长

-- 在应用侧产生查询后检查统计
SELECT * FROM stats_mysql_global;
SELECT * FROM stats_mysql_connections;