mysqld_exporter 是关键入口,因其主动查询 SHOW SLAVE STATUS 并暴露复制指标;需确保权限、采集参数、log_slave_updates 开启,并在 Prometheus 中正确配置 instance 标签与 Grafana 导入 ID 12587/7365 面板。

直接看复制拓扑,得靠 mysqld_exporter 暴露的指标 + Grafana 仪表盘组合,Prometheus 本身不生成拓扑图,它只存数据。
为什么 mysqld_exporter 是关键入口
MySQL 主从复制状态(如 Slave_IO_Running、Seconds_Behind_Master、Master_Host)必须由 mysqld_exporter 主动查询 SHOW SLAVE STATUS 并转换成 Prometheus 格式指标。如果 exporter 没权限或没启用复制采集,Grafana 就根本拿不到拓扑线索。
常见错误现象:mysqld_slave_status_seconds_behind_master 始终为 NAN 或 0;mysqld_slave_status_slave_io_running 指标缺失;Grafana 面板里“Replication Topology”区域空白。
- 确保 MySQL 账号有
REPLICATION CLIENT权限(不只是PROCESS和SELECT) - 检查
mysqld_exporter启动时是否加了--collect.global_status --collect.info_schema.replica_host(后者是获取主库地址的关键) - 确认 MySQL 实例开启了
log_slave_updates(级联复制场景下,否则从库无法暴露其下游)
在 Grafana 中还原拓扑要选对 Dashboard ID
官方推荐的复制拓扑面板不是默认自带的,必须手动导入。ID 12587(MySQL Replication)和 7365(MySQL Replication Overview)是目前最稳定的两个,它们会自动解析 mysqld_slave_status_master_host、mysqld_slave_status_master_port 等指标,拼出节点关系。
使用场景:主-从-从、主-多从、环形复制(需开启 log_slave_updates)都能识别,但不会自动发现跨网络或 DNS 解析失败的节点。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 导入前先确认所有 MySQL 实例的
mysqld_exporter都已加入 Prometheus 的scrape_configs,且 job 名称能区分实例(如mysql-prod-master、mysql-prod-slave-1) - 面板里 “Topology” tab 下的连线依赖
instance标签值匹配 —— 如果你用 IP+端口作为 instance,那主库的master_host值必须和某个被监控实例的instance完全一致(比如都是192.168.157.80:9104),否则连线断开 - 避免用主机名当
instance,除非所有节点 DNS 可互通且稳定
prometheus.yml 里必须暴露实例身份标签
拓扑识别靠的是指标携带的元信息,不是靠 IP 自动推断。如果所有 mysqld_exporter 目标都写成 targets: ['localhost:9104'],Prometheus 就没法区分谁是谁,Grafana 更无从连线。
正确做法是在 static_configs 或服务发现配置中,显式注入 labels:
scrape_configs:
- job_name: 'mysql-replica'
static_configs:
- targets: ['192.168.157.81:9104']
labels:
instance: 'mysql-slave-1'
role: 'slave'
- targets: ['192.168.157.82:9104']
labels:
instance: 'mysql-slave-2'
role: 'slave'
性能影响:添加标签不增加抓取开销,但若 label 值含高基数字段(如动态生成的 session_id),会导致 Prometheus 存储膨胀甚至 OOM。
真正容易被忽略的是:拓扑图只反映 SHOW SLAVE STATUS 当前快照,不记录历史变更。如果某从库临时断连又恢复,图上可能短暂消失再出现,但不会保留“曾连接过 A 主库、后切换到 B 主库”的轨迹 —— 这类链路漂移问题,得靠 Prometheus 查询 changes() 函数配合日志交叉验证。










