Debezium 核心概念
Debezium 是一个 CDC(Change Data Capture)平台, 通过读取数据库的日志(而不是查询表),把数据库的变更转化为有序、可恢复的事件流。
数据库日志 -> 结构化事件 -> 流系统
| 方式 | 原理 | 问题 |
|---|---|---|
| 轮询表 | 定时查询 | 延迟高、压力大 |
| Trigger | 触发器写中间表 | 强侵入、难维护 |
| Log-based(Debezium) | 解析 binlog / WAL | ✅ 实时、低侵入 |
Debezium 属于 Log-based CDC。
- 日志 天然有序
- 不影响业务 SQL
- 不会漏数据
- 可回放(offset)
┌────────────┐
│ Database │
│ binlog/WAL │
└─────┬──────┘
↓
┌────────────┐
│ Debezium │ ← Kafka Connect Source
│ Connector │
└─────┬──────┘
↓
┌────────────┐
│ Kafka │ ← Topic(事件流)
└─────┬──────┘
↓
┌────────────┐
│ Consumers │
└────────────┘
关键点:
- Debezium 不是独立运行的
- 它运行在 Kafka Connect 之上
- 一种插件
- Debezium = Source Connector
- Connector 的执行单元
- 一个 Connector -> 多个 Task
⚠️ MySQL / PostgreSQL Debezium 实际通常只能 1 个 Task (因为 binlog / WAL 是顺序的)
- 记录读到数据库日志的哪个位置
- 存在 Kafka 的内部 Topic
connect-offsets
这是 Debezium 能恢复、不丢数据的核心
- CDC 只能捕获变化
- 启动时数据库里已有的数据怎么办?
👉 先全量 -> 再增量
- 在某个一致性点
- 扫描已有数据
- 每一行也会发成事件
{
"op": "r"
}
r = read
- Debezium 在 snapshot 前
- 先记录日志位置
- snapshot 完后
- 从该位置继续消费日志
➡️ 不会丢、不重复(语义级)
{
"before": {...},
"after": {...},
"source": {...},
"op": "c|u|d|r",
"ts_ms": 1730000000000
}
| 操作 | before | after |
|---|---|---|
| insert | null | 新数据 |
| update | 旧数据 | 新数据 |
| delete | 旧数据 | null |
- delete 后
- Debezium 可发送 tombstone
- 用于 Kafka compaction
key: {id: 1}
value: null
Debezium 的语义
At-least-once(至少一次)
可能:
- 因为重启
- 因为 rebalance
👉 下游必须具备幂等性
如何实现“逻辑上的 exactly-once”
- 使用 主键作为 Kafka key
- 下游 upsert
- 或 Flink state
- 新增字段
- 修改字段类型
- 删除字段
Debezium:
- 捕获 DDL
- 更新事件 schema
- Avro / Protobuf
- 避免 JSON 无 schema 漂移
MySQL
- 基于 binlog
- binlog_format = ROW
- Server ID 唯一
PostgreSQL
- 基于 WAL logical decoding
- 必须:
wal_level = logical
- 使用 Replication Slot
- 表必须有 Primary Key
Slot 的作用
- 告诉 PG: “这个消费者还没读完,日志别删”
风险
- Debezium 挂了
- Slot 没消费
- WAL 无限增长
👉 必须监控 slot
- 单表内顺序保证
- 事务内顺序保证
- 跨表顺序 ❌ 不保证
- ❌ 业务语义一致性
- ❌ 分布式事务
- ❌ exactly-once end-to-end
- ❌ 自动冲突解决
- 数据库是 事实源(Source of Truth)
- Kafka 是 事件总线
- Debezium 是 事实发布者
- 下游是 事件消费者
典型玩法:
- PostgreSQL -> Debezium -> Kafka
- FastAPI 消费 Kafka
- 用于:
- 权限变更实时同步
- 用户状态缓存刷新
- 搜索索引更新
- Debezium 是基于数据库日志的 CDC 平台
- Snapshot + Log 保证全量 + 增量一致
- At-least-once,需要下游幂等
- PG 使用 logical replication + slot