Canal 1.1.8 介绍与选型指南
Canal 1.1.8 介绍与选型指南:阿里开源 MySQL binlog 增量订阅组件的版本基准、server-instance 架构、解析流水线、高可用与消息队列投递、官方 QuickStart 部署示例、适用场景限制,以及对比 Debezium、Maxwell、Flink CDC 的选型分析
Canal 1.1.8 介绍与选型指南
一、信息基准
查询日期:2026-10-18。 本文版本与功能描述均依据官方公开资料整理,未做本地安装实测。
1.1 版本信息
| 项目 | 内容 |
|---|---|
| 最新稳定版 | v1.1.8(GitHub Releases,发布时间 2025-01-17) |
| 版本线现状 | 1.1.x 为主线;截至查询日官方 Releases 页未见 2.x 正式版本 |
| 开源许可 | Apache-2.0 |
| 代码仓库 | https://github.com/alibaba/canal |
| 社区规模 | GitHub stars 约 30k(shields.io 徽标数据,2026-10-18 实查) |
1.2 官方来源清单
| 来源 | 地址 | 用途 |
|---|---|---|
| GitHub 仓库 | https://github.com/alibaba/canal | 源码、Releases、README 总览 |
| 官方 Wiki | https://github.com/alibaba/canal/wiki | QuickStart、Admin、Adapter 等全量指南 |
| Admin 指南 | https://github.com/alibaba/canal/wiki/Canal-Admin-Guide | 管理控制台的部署与运维说明 |
| Releases 页 | https://github.com/alibaba/canal/releases | 版本发布记录与发行包下载 |
二、软件概述
本文介绍的版本为 Canal v1.1.8,即 1.1.x 主线于 2025 年 1 月发布的最新稳定修复版本。
Canal 是阿里巴巴开源的 MySQL binlog 增量订阅与消费组件,以 Java 编写。名称取「水道、管道」之意:Canal 服务端把自己伪装成 MySQL 主库的一个从库(replica),通过 MySQL 复制协议拉取并解析 binlog,将行级数据变更(DML 与 DDL)转换为结构化事件,再交给下游客户端或消息队列消费。对业务方而言,它是一种不侵入业务代码、对主库影响可控的数据库变更捕获(CDC,Change Data Capture)手段,常用于缓存失效刷新、检索索引更新、异构数据库同步等场景。
从 1.1.4 版本起,项目引入了 canal-admin 工程,提供面向 WebUI 的 Canal 动态管理能力,支持配置、任务、日志的在线白屏运维;同时提供 canal-adapter 适配器,把增量数据投递到关系库、Elasticsearch、HBase 等下游存储。
三、核心架构
3.1 server 与 instance 模型
Canal 采用 server/instance 两级模型:一个 canal server 进程可承载多个 instance,每个 instance 对应一个逻辑上的数据订阅链路(通常对应一个 MySQL 主库加一组库表过滤规则)。instance 之间相互独立,可分属不同 server 节点,为水平扩展与隔离提供基础。
3.2 解析流水线:parser → sink → store
每个 instance 内部是一条三段式流水线:
- EventParser:伪装为 MySQL 从库,向主库发送 dump 请求,持续拉取 binlog,并完成位点推进与 binlog 事件解析;
- EventSink:对解析后的事件进行缓冲、过滤、路由与加工(例如按库表黑白名单过滤、多 instance 合并投递);
- EventStore:以内存环形缓冲存储事件,供客户端拉取;写入满时阻塞解析,形成背压。
3.3 位点管理与高可用
消费位点(position)支持 memory、file 等本地方式保存;引入 ZooKeeper 后,位点与 instance 的主备切换信息集中存储,多个 canal server 可组成主备集群,同一 instance 在某一时刻仅由一个节点消费,实现服务端高可用。客户端侧配合 get/ack/rollback 消费语义完成断点续传。
3.4 投递通道:client、adapter 与消息队列
- canal client:Java 原生客户端 API,通过 TCP 长连接拉取与确认数据,服务端数据格式基于 protobuf 定义的 Entry 协议;
- canal server 直投 MQ:通过 canal.properties 中的 canal.serverMode 配置为 tcp、kafka 或 rocketmq,把解析结果直接投递到消息队列;
- canal-adapter:面向落库场景的适配器,支持目标端关系数据库、Elasticsearch、HBase 等,并提供管理 REST 接口。
3.5 canal-admin 管理面
canal-admin 是独立部署的管理控制台,集中维护 server 与 instance 的配置、运行状态与日志,支持在线启停与配置下发,配合 server 侧的 admin 注册机制使用,是 1.1.x 线推荐的集群运维入口。
四、功能特性
4.1 binlog 解析与订阅能力
- 伪装成 MySQL 从库,实时解析 ROW 格式 binlog,覆盖 INSERT/UPDATE/DELETE 行事件与 DDL 事件;
- 支持按正则配置库表级订阅与黑名单过滤(canal.instance.filter.regex 等配置项);
- 支持全量加增量的数据迁移思路(先借助外部工具导出存量,再从指定位点接入增量);
- 兼容矩阵方面,官方 README 列明支持 MySQL 5.1.x、5.5.x、5.6.x、5.7.x、8.0.x。
4.2 高可用与集群
- 依赖 ZooKeeper 实现 server 主备切换与位点共享;
- 客户端可结合 ClientHA 实现消费端切换;
- canal-admin 支持多 server 的统一纳管。
4.3 多下游投递
- 原生支持投递 Kafka、RocketMQ,方便与流处理生态衔接;
- canal-adapter 覆盖关系库同步、Elasticsearch、HBase 等目标端;
- Java API 适合自研消费程序,Entry 协议字段包含库、表、操作类型、时间戳与行数据内容。
4.4 运维与监控
- canal-admin 提供配置管理、实例管理、日志查看;
- 服务端暴露监控指标与心跳配置,便于接入既有监控体系;
- 支持 TSDB 与位点持久化等进阶配置。
五、快速上手
以下步骤引自官方 Wiki QuickStart(https://github.com/alibaba/canal/wiki/QuickStart),本文未做本地实测。
5.1 前置条件
对作为源的 MySQL 开启 binlog 并使用 ROW 格式:
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
为 Canal 创建专用账号并授予复制权限:
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal';
5.2 部署与启动
从 GitHub Releases 下载 canal.deployer-1.1.8.tar.gz,解压后修改实例配置:
tar -zxvf canal.deployer-1.1.8.tar.gz -C ./canal
vi ./canal/conf/example/instance.properties
# 配置 canal.instance.mysql.slaveId、canal.instance.master.address、账号口令等
./canal/bin/startup.sh
默认监听 11111 端口,example 实例即开始拉取目标库 binlog。
5.3 客户端消费(Java)
以下为官方 Wiki QuickStart 中的简化客户端示例:
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress("127.0.0.1", 11111), "example", "", "");
int emptyCount = 0;
while (emptyCount < 5) {
connector.connect();
connector.subscribe(".*\\..*");
connector.rollback();
Message message = connector.getWithoutAck(1000);
long batchId = message.getId();
int size = message.getEntries().size();
if (batchId == -1 || size == 0) {
emptyCount++;
} else {
emptyCount = 0;
// 逐条处理 Entry 并按库表类型分发
}
connector.ack(batchId);
}
六、适用场景与限制
6.1 适用场景
- 缓存与检索同步:MySQL 行变更实时刷新 Redis 等缓存、驱动 Elasticsearch 索引更新;
- 异构库同步:向其他关系库或分析库单向同步增量数据;
- 消息管道:把数据库变更以消息形式接入 Kafka、RocketMQ,供下游多消费者使用;
- 审计与触发:基于 binlog 的行级变更记录与业务事件派生。
6.2 限制与注意
- 源端必须开启 binlog 且建议 ROW 格式;STATEMENT 格式下行数据无法还原;
- 官方主线聚焦 MySQL 及其复制协议生态,PostgreSQL、MongoDB 等其他数据源不在 1.1.x 支持范围内;
- 单 instance 串行解析,吞吐受单库 binlog 速率与解析性能约束,超大规模实时数仓场景需评估分库分表拆分多 instance;
- 服务端高可用依赖 ZooKeeper,引入了额外组件运维成本;
- 截至 2026-10-18,2.x 线没有正式发布版,生产规划仍应以 1.1.8 为基准。
七、同类选型对比
对比数据实查于 2026-10-18(GitHub Releases feed 与 shields.io 徽标)。
| 维度 | Canal 1.1.8 | Debezium 3.7.0.Final | Maxwell 1.46.0 | Flink CDC 3.7.0 |
|---|---|---|---|---|
| 开源许可 | Apache-2.0 | Apache-2.0 | Apache-2.0 | Apache-2.0 |
| GitHub stars + 最近发版 | 约 30k;2025-01-17 | 约 13k;2026-09-29 | 约 4.3k;2026-09-23 | 约 6.5k;2026-10-10 |
| 版本节奏 | 1.1.x 稳定维护,大版本更新缓慢 | 主线持续迭代,季度级小版本 | 维护节奏一般,年内有更新 | 跟随 Flink 生态,迭代活跃 |
| 兼容矩阵 | MySQL 5.1.x~8.0.x | MySQL、PostgreSQL、MongoDB、SQL Server 等多种连接器 | 仅 MySQL/MariaDB binlog | MySQL、PostgreSQL、MongoDB、Kafka、OceanBase 等多种源 |
| 下游形态 | Java API、Kafka/RocketMQ、adapter | Kafka 为主,配合 Connect 生态 | 直接输出 JSON 到 Kafka/Redis 等 | 集成 Flink 流处理,内置整库同步管道 |
选型建议:MySQL 单源、轻量接入且偏好自研消费程序的团队选 Canal;多源异构、面向 Kafka Connect 体系或需要数据库级快照一致性(snapshot)能力选 Debezium;需要把 CDC 与流计算、整库同步编排融合到同一引擎时选 Flink CDC。
八、参考链接
- 项目主页与源码:https://github.com/alibaba/canal
- 官方 Wiki(含 QuickStart):https://github.com/alibaba/canal/wiki/QuickStart
- Canal Admin 指南:https://github.com/alibaba/canal/wiki/Canal-Admin-Guide
- Canal Admin 部署(ServerGuide):https://github.com/alibaba/canal/wiki/Canal-Admin-ServerGuide
- Releases 发行包:https://github.com/alibaba/canal/releases
- Apache-2.0 许可文本:https://www.apache.org/licenses/LICENSE-2.0