Canal 监听 MySQL Binlog 实现数据同步
1.1 Canal 简介
Canal(发音 [kə'næl],意为水道/管道),核心用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。早期阿里巴巴因杭州和美国双机房部署存在跨机房同步需求,最初基于业务 trigger 获取变更,后来逐步转向数据库日志解析。由此衍生出大量数据库增量订阅和消费场景。
典型应用场景包括:
- 数据库镜像与实时备份
- 索引构建与维护(如拆分异构索引、倒排索引)
- 业务缓存刷新
- 带业务逻辑的增量数据处理
Canal 的核心目标很明确:基于 binlog 实现增量同步,而非全量。
1.2 技术选型
基于 binlog 实现数据同步主要有两种方案:
- mysql-binlog-connector:通过引入依赖 jar 包实现,需自行解析,相对轻量。
- Alibaba Canal:独立部署的数据同步中间件,功能强大,支持数据库及 MQ 同步,但维护成本较高。
选择建议:若业务量小、逻辑简单且追求轻量,可选 mysql-binlog-connector;若业务量大、逻辑复杂且有专门运维团队,推荐 Canal。毕竟经过阿里高并发验证,稳定性更有保障。
1.3 原理分析
1.3.1 MySQL 主备复制原理
理解 Canal 前,先回顾一下 MySQL 的主从复制机制:
- MySQL Master 将数据变更写入二进制日志(binary log),记录为二进制日志事件(binlog events)。
- MySQL Slave 将 Master 的 binlog events 拷贝到本地中继日志(relay log)。
- MySQL Slave 重放 relay log 中的事件,将数据变更反映到自身。
1.3.2 Canal 工作原理
Canal 本质上模拟了 MySQL Slave 的行为:
- Canal 伪装成 MySQL Slave,向 Master 发送 dump 协议请求。
- Master 收到请求后,开始推送 binary log 给 Canal。
- Canal 解析 binary log 对象(原始 byte 流),提取变更数据供下游消费。
这种机制让 Canal 能够非侵入式地捕获数据库变更,非常适合做数据同步或审计。
2. Canal 安装配置
2.1 MySQL 环境准备
Canal 支持的源端 MySQL 版本较广,包括 5.1.x, 5.5.x, 5.6.x, 5.7.x, 8.0.x。
关键步骤是开启 binlog。确保 MySQL 配置文件(my.cnf)中包含以下设置:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
重启 MySQL 服务后,可通过 show variables like 'log_bin'; 验证是否开启。
2.2 Canal 组件说明
下载 Canal 后,主要涉及以下几个组件:
- canal-admin:提供 WebUI 进行配置管理和节点运维,方便操作。
- canal-adapter:客户端数据落地适配,支持 HBase 等存储。
- canal-deployer:服务端核心,启动它才能接收数据库变更信息。


