原生 mysqld_exporter 无法有效监控主从延迟和备份成败,因其仅依赖 MySQL 内部状态;Seconds_Behind_Master 常不准或为 NULL,受网络中断、线程卡顿、并行复制冲突等影响;云 RDS 可能屏蔽 SHOW SLAVE STATUS,需用布尔指标组合判断;备份监控不应依赖 mtime,而应通过原子标记文件和自定义 collector 暴露 exit code 与时间戳;告警须双条件组合(如状态+时效),避免漏报误报。

原生 mysqld_exporter 无法直接监控主从同步延迟是否真实有效,更完全无法感知备份任务成败 —— 因为它只查 MySQL 内部状态,不读日志、不看退出码、不碰标记文件。
mysql_slave_status_seconds_behind_master 为什么经常不准或为 NULL
这个指标来自 SHOW SLAVE STATUS 的 Seconds_Behind_Master 字段,但它的值有严重局限性:
- 主从网络中断、IO线程卡住、SQL线程报错停顿时,该值可能仍显示为 0 或旧值,而非立即变为
NULL - MySQL 8.0.22+ 在启用了
replica_parallel_workers > 0且存在冲突回放时,该值会频繁抖动甚至归零,掩盖真实延迟 - 当复制已完全停止(如
SQL_THREAD=OFF),该字段返回NULL,但 Prometheus 默认的rate()或absent()表达式不会自动触发告警,需显式判断mysql_slave_status_seconds_behind_master == 0 or mysql_slave_status_seconds_behind_master < 0 or mysql_slave_status_seconds_behind_master > 600 - 云厂商 RDS(如阿里云 PolarDB)可能屏蔽
SHOW SLAVE STATUS,导致整个指标为空,此时必须 fallback 到mysql_slave_status_slave_io_running和mysql_slave_status_slave_sql_running两个布尔指标组合判断
备份任务状态不能靠 node_exporter 监控 mtime
用 node_exporter 抓取备份目录最后修改时间(node_filesystem_mtime_seconds{mountpoint=~".*/backup.*"})是常见但危险的做法:
- 备份脚本启动后立刻创建空文件,mtime 就已更新,但实际备份可能卡死或失败
- 增量备份覆盖全量文件时,mtime 不变,但内容已失效
- 无法区分“正在写入中”和“已成功校验完成”,容易误判为成功
- 正确做法是在备份脚本末尾写入原子化标记文件(如
/backup/latest/backup.done),并让自定义 collector 检查该文件的 mtime 与内容(含 exit code、timestamp、checksum) - 推荐复用
mysqld_exporter框架,在其上新增backup_statuscollector,暴露mysql_backup_last_success_seconds_ago和mysql_backup_last_exit_code两个指标
告警规则必须同时检查状态 + 时效性
只盯一个维度必然漏告。例如:
- 仅用
mysql_slave_status_seconds_behind_master > 300:主库没写入时该值恒为 0,但从库复制已停,却无告警 - 仅用
mysql_slave_status_slave_sql_running == 0:SQL 线程临时卡顿几秒就告警,噪音极大 - 正确写法是双条件组合:
mysql_slave_status_slave_sql_running == 0 and time() - mysql_slave_status_last_io_error_timestamp_seconds > 60,或更稳:absent(mysql_slave_status_seconds_behind_master[5m]) and mysql_slave_status_slave_io_running == 1 - 备份告警同理:
mysql_backup_last_success_seconds_ago > 86400 or mysql_backup_last_exit_code != 0,且必须加ALERT BackupFailed的for: 10m,避免瞬时失败抖动
真正难的不是采集指标,而是让 Prometheus “理解”备份和复制的语义 —— 它需要你把脚本退出码、文件原子性、SQL线程生命周期这些外部事实,翻译成可聚合、可比对、可持久化的数值指标。任何绕过这一步的方案,迟早会在凌晨三点给你发一条“一切正常”的假消息。


















