Canal详解
Canal 是阿里巴巴开源的分布式 MySQL binlog 增量订阅&消费 中间件,最初用于阿里巴巴集团数据库异地多活的同步场景,现在也广泛用于业务的数据同步、缓存更新、数据监控等领域。
从 Canal 的工作原理、核心组件、使用场景、优缺点、部署架构等方面进行全面讲解。
一、Canal 是什么?
Canal 模拟 MySQL 的 slave 协议,伪装自己为 MySQL 的一个从库,主动拉取主库的 binlog 日志,并解析出数据变更内容(Insert、Update、Delete 等),再以事件形式推送给下游。
二、核心原理
Canal 的本质是一个 MySQL binlog 解析工具,其核心机制为:
1. 模拟 MySQL Slave
Canal 内部使用了 mysql-binlog-connector-java
模拟从库的行为,通过 COM_BINLOG_DUMP
命令向主库拉取 binlog。
2. 解析 Binlog
拉到 binlog 后,Canal 会对其进行解析,将二进制格式转化为结构化的数据对象。
3. 发送事件
Canal 提供多种消费方式(如 TCP、Kafka、RocketMQ)将解析后的数据推送给客户端。
三、核心组件结构
Canal 的整体结构分为三层:
MySQL└─ Canal Server├─ Instance(实例,负责连接一个 MySQL)├─ Parser(binlog 解析器)└─ Sink(数据分发模块,支持 Kafka、RocketMQ、TCP)└─ Client(订阅端,如缓存更新、ES、消息系统等)
四、典型使用场景
场景 | 说明 |
---|---|
缓存同步 | 数据库更新后,自动刷新 Redis 缓存 |
全文检索同步 | 数据库更新后同步更新到 Elasticsearch |
多数据库同步(异地多活) | 多机房数据同步,做到容灾冗余 |
数据备份/审计 | binlog 实时解析,用于业务审计、操作记录等 |
异构数据库同步 | 如 MySQL -> HBase / Kafka / MongoDB 等 |
五、部署模式
1. 单机模式(开发测试使用)
- Canal Server + Instance 全部在一台机器上
- 配置简单,适合调试
2. 集群模式(生产推荐)
- 支持多 Instance,多 Canal Server 部署
- 与 ZooKeeper 搭配进行 HA(高可用)
- 每个 instance 负责监听一个 MySQL 实例
六、如何使用 Canal
1. MySQL 配置
确保 MySQL 开启 binlog,推荐使用 ROW
模式:
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server-id=1
并创建同步账户:
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
2. Canal Server 配置
- 编辑
instance
的配置文件instance/example/instance.properties
- 设置数据源、拉取起始位置、解析库表名等
3. 启动 Canal Server
sh bin/startup.sh
4. 客户端消费(举例)
- TCP 客户端使用
com.alibaba.otter.canal.client.CanalConnector
- Kafka 模式下监听指定 topic 消费 binlog 数据
七、输出的数据格式(简化)
Canal 会输出如下结构的 JSON:
{"data": [{"id": "1001","name": "张三"}],"database": "test","table": "user","type": "INSERT","es": 1629779298000,"ts": 1629779298000
}
八、Canal 与其他工具比较
工具 | 说明 | 特点 |
---|---|---|
Canal | 基于 binlog 的 MySQL 数据同步 | 支持高可用、灵活扩展 |
Debezium | 基于 Kafka 的 CDC 框架 | 支持多种数据库(MySQL/Postgres/Mongo) |
Maxwell | 轻量级 MySQL binlog 推送工具 | 简单易用,但功能较弱 |
DTS(阿里云) | 阿里云的数据传输服务 | SaaS 服务,配置简单但受限于云平台 |
九、优缺点总结
优点:
- 基于 binlog,不影响线上性能
- 支持事务、行级数据变更
- 支持 Kafka、RocketMQ 等异步消费方式
- 灵活可扩展,开源生态活跃
缺点:
- 仅支持 MySQL(PostgreSQL 支持需借助其他工具)
- 需要管理 Canal Server 高可用
- binlog 格式需设置为
ROW
,否则无法获取行级变更
十、实践建议
- Canal Server 和 Kafka/RocketMQ 组合使用,可靠性更高
- 配置多个 instance 实现多个库同步
- 使用 Spring Boot 整合 canal 客户端可实现缓存、ES等业务更新