首页/数据/数据工程与 ETL 速查/位点滞后监控设计
CDC 与同步53 条

位点滞后监控设计

位点滞后比“延迟秒数”更可靠:定期采集源端当前位点与工具消费位点,换算成落后字节数与时间,并记录源写入速率与消费速率两条曲线;位点长时间不推进或 binlog 保留余量不足时提前告警。

位点滞后怎么监控

很多团队只看下游 Kafka 的消费 lag,但同步链路的哪一段掉了都可能导致数据停更。更可靠的做法是同时采集两端位点:源端当前 binlog 位点(文件序号与偏移)与工具已确认的消费位点,两者相减换算出落后字节数与估算时间,再记录源写入速率与消费速率两条曲线。两个专门的判据最有用——位点长时间不推进,说明消费停滞;binlog 保留余量不足,说明一旦消费中断就可能永久丢失可回溯范围。

基本信息

源端位点binlog 文件名与偏移(MySQL 用 SHOW MASTER STATUS,8.4 起改用 SHOW BINARY LOG STATUS)
消费位点工具位点表或连接器 offset(Canal、Debezium、Flink CDC 各不同)
换算指标落后字节数、估算落后时间、保留余量
观测频率通常 1 到 5 分钟一次,与告警时限匹配
常见告警位点 15 分钟未推进、保留余量不足 2 个文件

典型使用场景

  • 大促或批量写入高峰前确认同步链路余量,评估是否会被追上
  • 故障后确认位点已恢复到正常推进速度,而不是只看进程是否存活
  • 排查报表停更:判断是源端没数据还是消费端停滞
  • 容量评估:根据写入速率与消费速率差决定是否扩容消费线程
  • 变更窗口前检查 binlog 保留策略与备份策略是否满足回溯要求

采集与换算

采集与换算
-- 源端:当前写入位点与所有 binlog 文件(含最早的,用于算保留余量)
SHOW MASTER STATUS;   -- MySQL 8.4 起为 SHOW BINARY LOG STATUS
SHOW BINARY LOGS;

-- 消费端:以工具位点表为例,取已确认位点
SELECT source_name, binlog_file, binlog_pos, update_time
FROM cdc_position_table WHERE source_name = 'order_db';

# 换算(脚本侧完成)
# 落后字节 ≈ (源文件序号 - 消费文件序号) × 平均文件大小 + 偏移差
# 保留余量 = 最早 binlog 文件序号 - 消费位点文件序号(单位:个文件)
# 告警:位点 15 分钟未推进;保留余量 < 2 个文件

监控项与判据

监控项数据来源异常判据含义
位点推进消费位点表按时间对比15 分钟内无变化消费停滞或任务挂了
落后字节源位点减消费位点持续增长且无回落消费跟不上写入
保留余量SHOW BINARY LOGS 最早文件小于 2 个文件中断后可能无法续读
消费速率消费条数按分钟统计显著低于源写入速率解析或写入成为瓶颈
源端位点与消费位点要同时留存历史:复盘时才能区分是写入突增(源曲线陡升)还是消费停滞(消费曲线走平),两者的处置完全不同。
被监控机器的时钟与数据库服务器不同步时,换算出的滞后时间会失真;采集脚本里的时间统一取数据库时间或做时钟校正。
只监控 Kafka lag 会漏掉链路其他段的问题:文件未上传、连接器未提交位点、目标端写入变慢,都可能表现为下游 lag 正常但数据不完整。

易错点

  • 只监控下游 Kafka lag,链路其他段的问题被漏掉,故障恢复时才发现数据缺口
  • 采集时间用监控机本地时钟,与数据库时钟不同步导致滞后时间失真
  • 只看位点是否推进而不算保留余量,中断时间一长 binlog 被清理,只能全量重导
  • 把落后字节数当唯一指标,文件大小不均时换算出的时间误差很大

数据来源与参考

  • MySQL 官方文档(SHOW BINARY LOGS 与位点)
  • 行业 CDC 运维监控实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌