1. Debezium是什么?
Debezium is a change data capture (CDC) platform that can stream database changes onto Kafka topics. CDC is a popular technique with multiple use cases, including replicating data to other databases, feeding analytics systems, extracting microservices from monoliths and invalidating caches.
Debezium是一个可以把变化数据从数据库传输到KafkaTopic的一个CDC(变化数据捕捉)平台。
它使用了数据库的特性实现了基于日志的变化数据捕捉,具有以下特性:
- 确保所有数据变化被捕捉。
- 以非常低的延时产生产生变化时间,同时又避免了过于频繁的轮询数据库造成CPU占用增长。例如在MySQL或者PostgreSQL,延迟在毫米级别。
- 不需要任何对已有数据结构的修改,例如:增加"最近更新时间(LastUpdated)"字段。
- 可以捕捉到删除事件。
- 可以捕捉到历史数据和一些额外的元数据。例如事务ID。具体额外有哪些信息,取决于数据库的功能和配置。
CDC是一种非常流行的技术,具有丰富应用场景,例如:
- 数据库主从复制
- 实时分析
- 单体应用拆分微服务时双写
- 刷新缓存
- so on…
2. Debezium做了什么事?
简单来说,Debezium是一种数据传输介质,它把数据的变化从数据源抽取出来,序列化成网络消息,通过网络传输到输出的系统,再反序列化成数据。
在这个过程中Debezium做的事情有:
- 变化数据的抽取
- 变化的数据的格式化、序列化
- 把序列化后的标准数据传输到目标系统
- 在目标系统把标准数据反序列化成对应的数据格式
2.1. MySQL中如何实现变化数据的抽取和监听?
2.1.1. SnapshotReader
- 列出当前账号可以访问的所有数据库
- 列出步骤一中取得数据库中的所有普通表
- 为数据库获取生成DDL语句
- 为表生成DDL语句
- 读取表的数据生成Record发送到队列中
2.1.2. BinlogReader
- 在BinlogReader.doStart()中注册了各种Binlog事件处理。
- 在BinlogReader 构造函数中,初始化BinlogClient,并注册Binlog事件分发器
- 在BinlogReader.handleEvent()中接收订阅到的Binlog事件并进行分发。最后交由BinlogReader.doStart()中各种注册的BinlogEventHandler进行处理。
2.2. 除此之外Debezium还做了什么事情?
- 过滤: 通过配置要捕获变化数据的数据库、表、字段的黑白名单,实现数据的过滤。
- 脱敏: 可以通过配置指定字段,掩盖其内容,避免敏感信息泄露。
- 监控: 通过Java的JMX机制监控Connectors的运行时指标,更好地观测运行时状态。
- 自定义清洗 (基于Kafka Connect SMT框架实现,支持自定义扩展)
- 基于消息元数据路由转发 适用于我们的SaaS场景或者分库分表合并的场景
- 基于消息内容路由转发
- 基于消息内容对消息进行过滤 区别较粗粒度的根据库名、表名、字段名进行过滤,这个可以针对具体的值进行过滤。(数据或者元数据的值)
3. Debezium在Kafka生态中的定位?
Kafka Connect中的Source Connector
4. Debezium的替代品是什么?
简言之就是还有哪些CDC工具。国内比较常用的当属Canal了。
5. Debezium与Canal优劣对比?
优势:
- 更好的融入了Kafka Connect生态
- SinkConnector(输出端)更加丰富。
- 依靠Kafka Connect Transformer,使得能更加容易的通过前置拦截器和后置拦截器来实现Filter、Transformer、Routing等更丰富的功能。
- 开放的Serializer和Deserializer,使得传输协议更加丰富,可以根据场景选择内容丰富的传输协议,或者高效的压缩传输协议。
- Debezium不仅仅只支持采集MySQL,还支持采集Mongo、SQLServer、Postgres等其他类型数据库.
劣势:
- Debezium是国外产品,中文文档较少。Canal是阿里产品,中文文档较多。
- Canal对国内RDS支持较好,支持从OSS中读取Binlog,结合阿里云RDS自动备份Binlog到OSS的机制,避免了Binlog被Rotate覆盖无法读取的问题。
- Canal提供了更加友好的运维界面(Canal admin),而Debezium暂时还没有,需要手动运维。