首页/数据/数据库速查/复制心跳与仲裁检测
主从复制与高可用53 条

复制心跳与仲裁检测

故障检测要独立于复制本身:pt-heartbeat 写心跳表量测真实延迟;仲裁侧用「多数派探测」避免单点误判(监控节点视角交叉验证)。

数据库速查数据更新于 2026-10-13

复制心跳与仲裁检测是什么

SHOW REPLICA STATUS 里的延迟值有两类失真:主库没有写入时延迟显示为零,大事务执行期间延迟又被算成事务长度。解决办法是在源端周期性写一条时间戳心跳记录,从库读取该时间戳与服务端时间相减,得到真实延迟;监控节点侧则用多路探测交叉验证,避免单点网络抖动触发误切换。

基本信息

常用工具Percona Toolkit 的 pt-heartbeat
心跳写入源端以 --update 模式常驻,按秒写入心跳表
延迟测量从库以 --monitor 模式读取心跳表时间戳
心跳表位置独立小库(如 percona.heartbeat),不与业务表混用
仲裁思路切换判定至少两路探测一致,防单点网络抖动误切
权限要求监控账号只需 USAGE 级或对该心跳库的最小权限

典型使用场景

  • 无写入时段仍要监控延迟:定时任务间隙用 SHOW 看不出真实落后程度
  • 大事务频繁的业务:用时间戳心跳替代事务长度导致的虚假延迟
  • 自动切换的判定输入:以真实延迟而非表面状态作为切换依据
  • 压测与容量评估:观察高写入下心跳延迟曲线的拐点
  • 跨机房复制:判断网络抖动与重放能力各自的影响占比

pt-heartbeat 双端用法

pt-heartbeat 双端用法
# 源端:每秒写一次心跳时间戳(后台常驻)
pt-heartbeat --host=10.0.0.10 --user=monitor --password='***' \
  --update --database=percona --interval=1 --daemonize

# 从库:量测真实延迟(持续输出)
pt-heartbeat --host=10.0.0.11 --user=monitor --password='***' \
  --monitor --database=percona --interval=1

# 单次取值,便于接入监控系统
pt-heartbeat --host=10.0.0.11 --user=monitor --password='***' \
  --check --database=percona

检测手段对照

手段优点盲区
SHOW REPLICA STATUS 延迟零成本、随时可看无写入时显示 0,大事务期间虚高
位点差反映字节落差不反映时间维度,无法判断业务是否可用
时间戳心跳任何写入量下都真实需额外部署与维护心跳表
多路探测仲裁避免单点网络抖动误判节点成本增加,阈值需按环境调
心跳表放在独立小库(如 percona.heartbeat)并单独授权:既避免影响业务表,也便于把监控账号权限压到最小;心跳表本身数据量极小,不会带来容量负担。
心跳断流要单独告警,并且能区分「源端写入停止」与「链路故障」两种情形:只用一个阈值判断,会在源端没有业务写入时产生误报,或反过来掩盖真实的复制中断。

易错点

  • 只用一台监控节点判定故障:该节点自身网络抖动会引发误切换
  • 监控账号权限过大:监控组件被攻破等于数据库失守,应使用只读最小权限
  • 心跳表与业务表混用:业务维护或清理时误删心跳表,监控静默失效
  • 用表面延迟作为切换唯一依据:无写入与长事务场景下判断失准
  • 部署了心跳但未纳入告警:断流了也没人知道,等于装了个没人看的面板

数据来源与参考

  • Percona Toolkit: pt-heartbeat
  • MySQL 8.0 Reference Manual: High Availability

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌