目录
目录
一. 简介
canal是一种面向 数据库 的实时CDC(change data capture)技术。
1. CDC是什么
CDC是(change data capture),翻译过来就是 捕获数据变更。通常数据处理上,我们说的 CDC 技术主要面向 数据库的变更,是一种用于捕获数据库中数据变更的技术。
2. CDC的使用场景有哪些?
- 数据同步, 用于备份容灾
- 数据分发,一个数据源分发给多个下游存储( mysql, kafka, rabbitMQ, rocketMQ, ElasticSearch,Hbase等)
- 数据采集,面向数据仓库 / 数据湖 的ETL数据集成
3. 目前CDC的技术分类
根据实现机制可以分为两个方向,基于查询和基于日志。
- 基于查询是就是select进行全表扫描过滤出变更的数据。
- 基于日志就是连续实时读取数据库的操作log,例如msyql的binlog
-
基于查询的 CDC实现:
离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据
缺点:
- 无法保障数据一致性,查的过程中有可能数据已经发生了多次变更;
-
无法保障实时性,基于离线调度存在天然的延迟。
-
影响数据库性能
-
基于日志的 CDC:
实时消费日志,流处理。例如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源;
特点:
- 保障数据一致性,因为 binlog 文件包含了所有历史变更明细;
- 保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。
- 对数据库影响小。由于它是读取binlog,对数据库或者业务来说,都不是侵入式的。
FlinkCDC入门demo可以参考我的另一篇: FlinkCDC同步Mysql
4. Canal工作原理:
canal是基于日志的CDC,实时性高,对数据库性能影响小(canal官网介绍大概有1%的影响)
它是连续实时读取mysql数据库的操作log(binlog)并解析发送到下游。大概过程如下
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
目前支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x、
二 组件简介:
- canal-server,采集源数据库的binlog,并发送到配置的目的存储。或者发送到指定的tcp端口等待客户端消费。。
- canal-adapt,集成的canal-client端。可以实现数据同步和ETL功能。消费上游组件(包括canal-server,kafka,TCP)。同步到目的存储(包括关系型数据库(mysql,postgresql,oracle),ES,Hbase)。且可全量同步源数据库到目标存储系统(但不建议使用全量同步,我实践中全量同步Mysql到mysql时通常会发生锁获取失败)。
- canal-admin,提供webUI, 方便canal-server集群部署和日志查看
将上图的细化
1. 组件canal-server
架构:它负责采集数据库的binlog,并发送到配置的存储。那么它怎么采集多个数据库,发送到不同的存储地。它是由instance配置决定的。下图是canal-server的架构图,一个server可以有多个instance,每个instance对应着一个数据队列