已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
3 年运维,负责一套 MySQL 8.0.36 订单库(主 16C64G + 2 台从,binlog=row,已开 LOGICAL_CLOCK 并行复制 worker=8,GTID 全开)。最近在给故障切换(MHA 自托管脚本)写「该不该切」的判定逻辑,卡在一个很具体的问题上:用哪个指标判定「从库真的追不上了」,而不是「从库此刻恰好有个大事务在重放」。
gtid_executed 差值估算落后事务数(主 exec 12,431,208 条 / 从 12,431,196 条 = 落后 12 条),但事务数 ≠ 时间:这 12 条里如果有一条 200 万行 UPDATE,落后时间是分钟级;如果都是点更新,落后时间是毫秒级。纯 GTID 差值给了个「假安心」。if lag > 5 在 NULL 上是 False——断连场景反而不触发切换,这正好是最该切的场景。lag_time = 主库该 gtid 的 binlog 写入时间戳 − 从库重放完成时间,问题是主库 binlog 里没有逐事务时间戳(只有 binlog 文件级时间),退化成了「文件时间差」,精度不够。replication_applier_status_by_worker 拿每个 worker 的 LAST_APPLIED 时间戳做 max,方向对,但没想清楚怎么和「主库产生速率」配合成速率模型。开放问题:如果从库延迟指标本身都不可信,那「延迟 > X 秒触发切主」这个业界惯例到底建立在什么假设上?想听听不同规模(单从 / 多从 / 异地多活)下的真实做法。