监控告警

MySQL 指标采集、Grafana Dashboard、告警规则与日志查询。

MYSQL 模块复用 Pigsty 的可观测性基座:指标经 mysqld_exporter 进入 VictoriaMetrics,错误日志经 Journald/Vector 进入 VictoriaLogs,Grafana 提供 5 个预置 Dashboard,vmalert 加载 68 条衍生规则与 27 条告警规则。


采集架构

每个 MySQL 节点运行一个 mysqld_exporter(端口 9104),以最小权限监控账号(dbuser_monitor@'127.0.0.1')采集服务器与 MGR 指标。部署时在 Infra 节点生成文件发现 Target:

/infra/targets/mysql/<实例名>.yml     # 如 my-test-1.yml

VictoriaMetrics 的 mysql 抓取任务消费该目录。mysql_exporter_enabled: false 会把 Target 收敛为空;只有 mysql-rm.yml 才删除 Target 文件。

Exporter 启用的采集器包括:全局状态/变量、Binlog 尺寸、InnoDB 指标、进程列表、性能模式语句摘要(Top 50 摘要)、表/索引 IO 等待,以及 MGR 成员与复制统计。


标签模型

所有 MySQL 指标携带统一标签:

标签含义示例
job抓取任务mysql
cls集群名my-test
ins实例名my-test-1
ip成员地址10.10.10.11
topology拓扑类型innodb_cluster / standalone

衍生规则以 mysql:ins:*(实例级)与 mysql:cls:*(集群级)命名,完整清单见指标定义


Grafana Dashboard

Dashboard用途
MySQL Overview舰队总览:集群清单、健康度、QPS/TPS、活跃告警与实例清单
MySQL Cluster单集群视角:成员状态、负载、节点资源与集群日志
MySQL Instance单实例细节:连接、语句、InnoDB、临时表、锁与实例日志
MySQL Group ReplicationMGR 专题:成员角色、认证/应用队列、流控、只读安全与 GR 日志
MySQL Alert告警汇总与关键平台日志

集群健康速读:mysql:cls:health 取值 2(健康)/ 1(降级仍可写)/ 0(危险或不可写),Overview 首屏的 Healthy Clusters 与 Cluster Health 时间线都基于它。

MySQL Group Replication Dashboard 仅对 innodb_cluster 拓扑有意义;选中单机集群时相关面板显示 No data 属预期现象。


告警规则

27 条告警规则按严重级分层(severity:CRIT / WARN / INFO),关键规则如下:

可用性与集群(响应优先)

告警级别触发条件
MySQLInstanceDownCRIT实例连接失败超 1 分钟
MySQLClusterNoPrimaryCRIT集群无 ONLINE 主库超 1 分钟
MySQLClusterQuorumLostCRITONLINE 成员不足多数派超 1 分钟
MySQLClusterMultiplePrimaryCRIT出现多主(30 秒即告,脑裂信号)
MySQLSecondaryWritableCRIT从库可写超 2 分钟(数据发散风险)
MySQLClusterMemberOfflineWARN声明成员离组超 5 分钟
MySQLPrimaryReadOnlyWARN主库只读超 5 分钟
MySQLExporterDownWARNExporter 抓取失败超 2 分钟

容量与性能(观察优先)

连接压力(MySQLConnectionsHigh WARN 80% / MySQLConnectionsCritical CRIT 95%)、复制队列(MySQLGRQueueHigh WARN / MySQLGRQueueCritical CRIT)、流控(MySQLGRFlowControlHigh)、InnoDB(MySQLBufferPoolWaitsMySQLInnoDBLogWaitsMySQLRedoCapacityHighMySQLDeadlocksHighMySQLHistoryListLarge),以及 INFO 级的慢查询、磁盘临时表、全表连接、缓冲池命中率与重启提示。

实测行为参考:主库崩溃切换(约 20 秒)只会产生 pending 不会误报;真正的完全停机会在 2 分钟内让 ClusterNoPrimaryQuorumLost 进入 firing。


日志查询

MySQL 错误日志双写:本地文件 /var/log/mysql/error.log + Syslog → Journald → Vector → VictoriaLogs。日志条目携带 app=mysqld-<实例名> 标识,Dashboard 的日志面板开箱可用,也可直接用 LogsQL 查询:

# 某实例最近的错误日志
curl -s http://<infra>:9428/select/logsql/query \
  -d 'query=app:mysqld-my-test-1 level:err _time:1h'

# 某集群全部 MySQL 相关日志(含备份任务)
curl -s http://<infra>:9428/select/logsql/query \
  -d 'query=job:syslog cls:my-test (app:~"mysqld-" OR unit:mysql-backup) _time:1h | limit 100'

注意日志的 cls 标签取自节点集群名(node_cluster)——像配置示例那样保持 node_clustermysql_cluster 一致,指标与日志的标签才能对齐。

已知边界:

  • 慢查询日志slow.log,阈值 1 秒)仅落本地文件,不进入 VictoriaLogs;分析慢查询请登录实例查看文件,或使用性能模式语句摘要指标(mysql:ins:statement_latency 等);
  • Router 运行日志写入 /var/log/mysqlrouter/,同样仅限本地文件。

验证监控链路

部署后可用以下命令自检全链路:

# Exporter 本体
curl -s http://<成员>:9104/metrics | grep -E '^mysql_up '

# VictoriaMetrics 抓取与衍生规则
curl -s 'http://<infra>:8428/api/v1/query?query=mysql_up'
curl -s 'http://<infra>:8428/api/v1/query?query=mysql:cls:health'

# vmalert 规则装载(应看到 mysql-rules 与 mysql-alerts 两组)
curl -s 'http://<infra>:8880/api/v1/rules' | grep -o '"name":"mysql-[a-z]*"'

# 日志入库
curl -s 'http://<infra>:9428/select/logsql/query' -d 'query=app:~"mysqld-" _time:1h | stats by (app) count()'