CDC(Change Data Capture,变更数据捕获)是连接传统关系型数据库与实时数据流的关键桥梁。在银行核心系统中,Oracle、DB2、TDSQL 等存量数据库每天承载着数千万笔交易,如何在不侵入业务代码的前提下,将这些变更实时同步到数据湖仓,是每位数据工程师必须掌握的技术。

为什么金融系统需要 CDC?

传统ETL采用定时批量拉取(如Sqoop、DataX全量同步),在金融场景下有三大痛点:

  1. 时效性不足:定时任务通常是每小时或每日执行,T+1 模式无法满足实时风控和实时监控需求;
  2. 系统压力大:全量扫描对核心库造成 I/O 冲击,尤其在月末季末业务高峰期风险极高;
  3. 业务侵入性高:在核心库中写触发器(Trigger)会拖慢事务响应,且触发器故障可能阻塞核心交易。

CDC 通过监听数据库的物理日志(Redo Log / Binlog / WAL),在事务提交后立即捕获变更事件,实现了"无侵入、低延迟、高可靠"的数据同步。

Debezium 架构与工作原理

Debezium 是 Red Hat 开源的分布式 CDC 平台,基于 Kafka Connect 框架构建。其架构如下:

[Oracle RAC]                          [Kafka Cluster]
    |                                         |
    v                                         |
[Debezium] --读取Redo Log--> [Kafka Connect] --写入--> [Kafka Topic]
    |                                         |
    v                                         v
[Schema Registry]                     [Flink/Spark Streaming]
(Avro Schema版本管理)                   (实时消费与处理)

Debezium Connector 以消费者身份订阅数据库的日志流,将 INSERT/UPDATE/DELETE 事件序列化为标准格式写入 Kafka。每个源表对应一个 Kafka Topic,消息体包含变更前后的完整字段值。

金融系统落地要点

1. 日志权限与性能隔离

Oracle 的 LogMiner 或 MySQL 的 Binlog 读取需要特殊的 SELECT_CATALOG_ROLEREPLICATION SLAVE 权限。银行安全规范通常要求:

  • CDC 连接使用独立的数据库只读账号;
  • Oracle 场景下使用 Standby 库而非 Primary 库读取 Redo Log,避免 I/O 争用;
  • 监控数据库的 logMiner 读取并发,防止解析进程 CPU 占用过高。

2. Schema 变更同步(Schema Evolution)

银行核心系统的表结构变更(加字段、改类型)是常态。Debezium 配合 Confluent Schema Registry 的 Avro 格式,能在字段增删时自动向下兼容:

{
  "schema": {
    "type": "record",
    "name": "TxnRecord",
    "fields": [
      {"name": "txn_id", "type": "string"},
      {"name": "amount", "type": ["null", "double"], "default": null},
      {"name": "new_field", "type": ["null", "string"], "default": null}
    ]
  }
}

使用 BACKWARD 兼容策略时,新增字段的 default 值为 null,老消费者不受影响。

3. 事件去重与幂等写入

金融数据不允许重复。CDC 事件中的 source.ts_ms(源端事务时间戳)和 source.lsn(日志序列号)联合构成唯一键。下游 Flink 作业或 Spark Streaming 作业使用这两个字段做幂等性写入:

INSERT INTO target_table (txn_id, amount, lsn)
VALUES (?, ?, ?)
ON CONFLICT (txn_id) DO UPDATE SET
    amount = EXCLUDED.amount,
    lsn = EXCLUDED.lsn
WHERE EXCLUDED.lsn > target_table.lsn;

4. 异常处理:心跳与快照

Debezium 在启动初期需要对大表做初始快照(Snapshot),如果一张交易流水表有20亿行,快照可能耗时数小时。为此,可通过以下策略优化:

  • 并行快照snapshot.mode=parallel,按主键范围分片并发读取;
  • 增量快照:Debezium 2.x 支持 snapshot.mode=incremental,基于主键的水位线逐步完成快照,不影响实时日志消费;
  • 心跳机制heartbeat.interval.ms=10000,防止长时间无变更时 Kafka 认为 Consumer 失效。

对比:Debezium vs OGG vs Canal

特性 Debezium Oracle GoldenGate Alibaba Canal
开源 Apache 2.0 商业软件 Apache 2.0
支持源端 Oracle, MySQL, PostgreSQL, DB2... Oracle, MySQL, DB2... MySQL, MariaDB
消息格式 Debezium Envelope (JSON/Avro) 自定义 Trail 文件 Canal Protocol
Schema变更 原生支持 (Schema Registry) 需手动管理 需手动处理
与 Kafka 集成 原生 Kafka Connect 需 OGG for Big Data 适配器 需单独开发适配器
社区活跃度 全球活跃 Oracle 官方 中文社区活跃

对于以 MySQL/PostgreSQL 为源端、Kafka 为目标端的中小银行,Debezium 是性价比最高的 CDC 方案。

总结

CDC 将银行从"定时抽取"推向"实时感知"。Debezium 作为开源 CDC 的事实标准,已经在国内多家城商行、农商行的大数据平台中稳定运行。对于正规划从离线数仓向实时湖仓演进的数据团队,Debezium 是最值得优先评估的基础设施组件。