复制心跳与仲裁检测是什么
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)并单独授权:既避免影响业务表,也便于把监控账号权限压到最小;心跳表本身数据量极小,不会带来容量负担。
心跳断流要单独告警,并且能区分「源端写入停止」与「链路故障」两种情形:只用一个阈值判断,会在源端没有业务写入时产生误报,或反过来掩盖真实的复制中断。