4. 实时数据接入层监控:Canal/Debezium CDC监控、数据格式校验、Schema变更监控、接入吞吐量监控

实时数仓的第一道关卡,就是数据接入层。

说白了,数据从业务库流出来,经过 CDC(Change Data Capture)工具,进入消息队列。这个环节要是出了问题,下游的实时计算、OLAP 查询全得跟着遭殃。我在项目中见过太多次了——接入层崩了,整个链路的数据质量直接归零。

所以这一章,我们重点聊聊接入层的四个监控维度:CDC 工具本身的状态、数据格式对不对、Schema 变了没有、吞吐量扛不扛得住。

4.1 CDC 工具监控:Canal 与 Debezium

CDC 工具是实时数仓的“眼睛”。它盯着业务数据库的 binlog,一有变化就往外推。目前主流的两套方案,就是阿里开源的 Canal 和 Red Hat 开源的 Debezium。

核心监控指标

  • 延迟(Lag):从 binlog 产生到被 Canal/Debezium 消费的时间差。单位毫秒。
  • 心跳检测:每隔 N 秒发一条心跳记录,确保连接没断。
  • 连接状态:与 MySQL/PostgreSQL 的 TCP 连接是否正常。
  • 解析错误率:binlog 解析失败的次数 / 总事件数。

我个人习惯,在 Canal 的 metrics 里重点盯 canal.instance.delay 这个指标。如果延迟超过 5 秒,基本可以判定是网络抖动或者数据库压力过大。Debezium 的话,我建议关注 kafka.connect.mirror.connector.running 和 source.task.delay.ms。

避坑指南

我曾经遇到过一个坑:Canal 的 HA 模式切换时,ZooKeeper 的 session 超时导致两个节点同时认为自己是 master,结果数据重复推送。后来我在监控里加了一条规则——当 Canal 的 running 状态在 30 秒内切换超过 3 次,立刻告警。

4.2 数据格式校验:JSON / Avro / Protobuf

CDC 工具把 binlog 事件转成统一格式。常见的有 JSON、Avro、Protobuf。格式不对,下游解析直接报错。

你想想看,一个订单表有 50 个字段,突然某天 DBA 加了一个 decimal(20,4) 类型的字段,但 CDC 配置里没更新序列化器,结果这个字段被转成了字符串。下游的聚合计算全乱套了。

所以,格式校验必须做。我一般分三层:

  1. 语法校验:JSON 是否合法、Avro schema 是否匹配。
  2. 字段类型校验:比如 price 字段必须是数字,不能是字符串。
  3. 值域校验:比如 order_status 只能是 0、1、2,不能出现 3。

注意

不要只依赖 CDC 工具自带的格式校验。我建议在接入层单独部署一个校验服务,消费 Kafka 消息,逐条校验。校验失败的消息,打入死信队列(DLQ),并触发告警。

下面是一个简单的 JSON 校验示例(伪代码):

// 伪代码:JSON 格式校验
function validateCDCJson(event) {
    // 1. 语法校验
    if (!isValidJSON(event)) {
        sendToDLQ(event, "INVALID_JSON");
        return false;
    }
    // 2. 字段类型校验
    if (typeof event.payload.price !== "number") {
        sendToDLQ(event, "TYPE_MISMATCH");
        return false;
    }
    // 3. 值域校验
    if (![0, 1, 2].includes(event.payload.order_status)) {
        sendToDLQ(event, "VALUE_OUT_OF_RANGE");
        return false;
    }
    return true;
}

4.3 Schema 变更监控:兼容性检查

这是接入层最容易被忽视的监控点。

业务库的 Schema 不是一成不变的。加字段、删字段、改类型,都是家常便饭。但实时数仓的 Schema 是提前定义好的。两边不一致,数据要么丢失,要么解析失败。

我建议做两件事:

  • 自动检测 Schema 变更:Canal 和 Debezium 都支持监听 DDL 语句。一旦检测到 ALTER TABLE,立刻触发告警。
  • 兼容性检查:新 Schema 是否向后兼容?比如,删了一个下游正在使用的字段,这就是不兼容变更。

兼容性规则(参考)

变更类型 是否兼容 处理建议
新增字段(nullable) 兼容 下游自动填充 null
新增字段(not null) 不兼容 需下游同步更新 Schema
删除字段 不兼容 立即告警,暂停消费
修改字段类型 视情况 检查类型转换是否安全

嗯,这里要注意。Schema 变更监控不能只靠人工。我曾经在一个项目里,DBA 凌晨两点改了表结构,第二天早上才发现实时报表全挂了。后来我写了一个自动化脚本,检测到 DDL 后自动比对 Schema Registry 里的版本,不兼容就直接阻断数据流。

4.4 接入吞吐量监控:流量与压力

吞吐量监控,说白了就是看你的管道能扛多大流量。

核心指标有三个:

  • 每秒事件数(EPS):Canal/Debezium 每秒推送的消息条数。
  • 每秒字节数(BPS):原始数据量大小。
  • Kafka 分区水位:每个分区的消息积压量。

我一般会设置两个阈值:

  1. 软阈值:EPS 达到峰值的 70%,触发预警,提醒扩容。
  2. 硬阈值:EPS 达到峰值的 90%,触发告警,自动扩容 Kafka 分区或增加 Canal 实例。

实战经验

我记得有一次双十一大促,订单表的 EPS 从平时的 2000 飙到了 15000。Canal 的客户端直接 OOM 了。后来我做了两件事:一是给 Canal 配置了限流(canal.instance.flowControl),二是把 Kafka 的分区数从 6 扩到了 24。从那以后,我再也没遇到过接入层因为流量暴涨而崩溃的情况。

4.5 知识体系总览

下面这张图,把接入层监控的四个维度串起来了。你可以把它当作一个检查清单。

实时数据接入层监控体系 接入层监控 CDC 工具监控 数据格式校验 Schema 变更监控 吞吐量监控 关键指标 • 延迟 (Lag) • 心跳检测 • 连接状态 • 解析错误率 校验层级 • 语法校验 • 字段类型校验 • 值域校验 • 死信队列 (DLQ) 变更类型 • 新增字段 • 删除字段 • 修改类型 • 兼容性检查 核心指标 • EPS (事件/秒) • BPS (字节/秒) • Kafka 分区水位 • 软/硬阈值告警 四个维度缺一不可,任何一个出问题都会影响下游数据质量 建议:每个维度都配置独立的告警规则和自动化处理流程

4.6 小结

接入层监控,是实时数仓数据质量的第一道防线。CDC 工具的状态、数据格式的正确性、Schema 的兼容性、吞吐量的稳定性,这四个点盯住了,下游的实时计算和 OLAP 查询才能放心。

我个人习惯,把这四个维度的监控指标统一上报到 Prometheus,然后在 Grafana 上建一个“接入层健康大盘”。每天上班第一件事,就是扫一眼这个大盘。如果全是绿的,今天大概率是个好日子。