一、Canal概述
1. Canal 是什么?
Canal 是阿里巴巴开源的一个分布式消息中间件,主要用于监听 MySQL 的 binlog(日志),实现数据的实时同步和订阅。它的核心目标是模拟 MySQL slave 的交互协议,伪装成一个 slave,获取 binlog,实现数据订阅和消费。
2. 工作原理
2.1 Binlog 解析
- MySQL 主库开启 binlog(需要配置为 ROW 格式,推荐)。
- Canal 作为一个伪装的 slave 连接到主库,订阅 binlog。
- 解析 binlog,转换为统一的数据结构(Entry)。
- 推送给下游(如 Kafka、RocketMQ、Elasticsearch 等)。
2.2 伪装 Slave
Canal 通过实现 MySQL 的 slave 协议,向主库注册为一个 slave(从库),这样就能实时获取 binlog。
2.3 数据结构
- Entry:Canal 解析后的数据结构,包含表名、操作类型(insert/update/delete)、变更前后数据等。
3. 架构详解
Canal 架构主要分为三个部分:
- Canal Server:核心服务,负责 binlog 的采集和解析。
- Canal Client:客户端,负责消费 Canal 解析后的数据。
- MQ Adapter:适配器,将数据推送到 Kafka、RocketMQ、RabbitMQ 等消息队列。
4. 典型应用场景
- 数据库异构同步:如 MySQL → Elasticsearch,实现搜索引擎实时同步。
- 缓存刷新:如 MySQL → Redis,当数据库发生变更时,实时刷新缓存。
- 消息驱动:如 MySQL → Kafka,业务系统监听并处理数据库变更事件。
- 数据中台:数据汇聚,实时 ETL。
5. 与其他同步工具对比
| 工具 | 主要用途 | 优势 | 劣势 |
|---|---|---|---|
| Canal | MySQL binlog订阅 | 实时、开源、社区活跃 | 仅支持MySQL |
| Debezium | 多数据库binlog订阅 | 支持多种数据库 | 依赖Kafka |
| Maxwell | MySQL binlog订阅 | 简单易用 | 功能相对单一 |
6. 关键配置与注意事项
- MySQL 必须开启 binlog 且为 ROW 格式。
- Canal 需要有 REPLICATION 权限。
- 配置 Canal 的实例(instance)与数据源信息。
- 关注 Canal 的高可用、断点续传、数据一致性问题。
二、Canal安装部署
1、前置条件
-
MySQL 已开启 binlog 且为 ROW 格式
修改 my.cnf 配置:[mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW重启 MySQL。
-
创建 Canal 用户并授权
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
2、下载 Canal
- 访问 Canal Releases 或 Canal 官网。
- 下载最新的 canal.deployer-xxx.tar.gz。
3、解压与目录结构
tar -zxvf canal.deployer-xxx.tar.gz
cd canal.deployer
目录结构如下:
canal.deployer/
├── bin/
├── conf/
│ ├── canal.properties
│ └── example/
│ └── instance.properties
├── lib/
├── logs/
4、配置 Canal
1. 修改 canal.properties
路径:conf/canal.properties
常用配置:
canal.serverMode = tcp
canal.port = 11111
canal.instance.global.mode = spring
2. 修改 instance.properties
路径:conf/example/instance.properties
主要配置 MySQL 连接信息:
canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.filter.regex=.*\\..*
canal.instance.binlog.format=ROW
canal.instance.binlog.image=FULL
filter.regex:同步哪些表,默认是全部。
5、启动 Canal
sh bin/startup.sh
查看日志:
tail -f logs/canal/canal.log
tail -f logs/example/example.log
看到 Start successful. 即可。
6、客户端连接测试(Java 示例)
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress("127.0.0.1", 11111),
"example",
"",
""
);
connector.connect();
connector.subscribe(".*\\..*");
Message message = connector.get(100);
for (Entry entry : message.getEntries()) {
// 处理数据
}
connector.disconnect();
7、分布式/集群部署(简述)
- Canal 支持集群部署(基于 ZooKeeper)。
- 需要配置 canal.properties 中的
canal.zkServers和多实例。 - 具体可参考 官方集群部署文档。
8、常见问题
- 连接不上 MySQL:检查防火墙、权限、binlog 是否开启。
- 日志无数据:确认有 DML 操作(insert/update/delete),且表被 filter.regex 匹配。
- 内存占用高:可调节 canal.instance.memory.buffer.size。
9、Canal 集群架构原理
Canal 集群采用 ZooKeeper 作为协调者,实现多节点的高可用和负载均衡。整体架构如下:
- Canal Server:多个实例组成集群,每个实例可以负责不同的 MySQL 实例或分担同一实例的负载。
- ZooKeeper:负责节点选主、实例分配、状态同步。
- Client:通过 ZooKeeper 获取可用的 Canal Server 节点进行连接和消费。
工作流程:
- Canal Server 启动后注册到 ZooKeeper。
- ZooKeeper 负责分配实例的主节点(Active),其他为备节点(Standby)。
- 当主节点故障时,Standby 自动切换为主节点,保障服务连续性。
10、集群部署准备
(1). 环境要求
- 至少两台 Canal Server 机器(推荐 2~3 台,生产建议 3 台以上)
- 一套 ZooKeeper 集群(至少 3 台)
(2). MySQL 配置
与单机版一致,需开启 binlog(ROW 格式),并有 canal 用户授权。
11、ZooKeeper 部署
如果已有 ZooKeeper 集群可直接使用,否则可参考以下部署方法:
# 以单节点为例,生产建议 3 节点
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
cd apache-zookeeper-3.7.0-bin
cp conf/zoo_sample.cfg conf/zoo.cfg
bin/zkServer.sh start
注意:
- ZooKeeper 集群建议部署在独立服务器上,保证高可用。
- 生产环境需配置 myid、dataDir、server.x 相关参数。
12、Canal 集群部署步骤
(1). 下载 Canal 集群包
去 Canal Releases 下载 canal.deployer-x.x.x.tar.gz,拷贝到多台服务器上并解压。
(2). 配置 canal.properties
编辑 conf/canal.properties,关键配置如下:
# 启用集群模式
canal.serverMode = tcp
# ZooKeeper 集群地址(逗号分隔)
canal.zkServers = 192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
# 其他参数可按需调整
canal.port = 11111
(3). 配置实例
每个实例目录(如 conf/example/)下的 instance.properties 配置与单机类似。
canal.instance.master.address=192.168.1.201:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.filter.regex=.*\\..*
canal.instance.binlog.format=ROW
canal.instance.binlog.image=FULL
注意事项:
- 多台 Canal Server 的配置文件内容建议保持一致,便于故障切换。
(4). 启动 Canal Server
在每台服务器上执行:
sh bin/startup.sh
(5). 检查集群状态
查看日志:
tail -f logs/canal/canal.log
tail -f logs/example/example.log
日志中出现
process active 表示当前节点为主节点
process standby 表示当前节点为备用节点
14、客户端连接方式
客户端(如 Java 程序)不再直接连接 Canal Server,而是通过 ZooKeeper 地址连接:
CanalConnector connector = CanalConnectors.newClusterConnector(
"192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181",
"example",
"",
""
);
connector.connect();
connector.subscribe(".*\\..*");
...
15、常见问题与注意事项
- ZooKeeper 配置错误:检查 zkServers 地址、端口,确保 Canal Server 能访问 ZooKeeper。
- 主备切换不生效:确认所有 Canal Server 配置一致,ZooKeeper 节点状态正常。
- 负载均衡:一个实例(如 example)同时只能有一个 Active 节点,其它为 Standby,适合高可用场景,不是多活负载均衡。
- 多实例高可用:可以在 conf 下配置多个实例,每个实例都可以实现主备切换。
总结
Canal 集群部署的核心是 ZooKeeper 协调多节点主备切换,实现高可用。
步骤简述:
- 部署 ZooKeeper 集群
- 配置 Canal Server 的 zkServers
- 多台服务器部署 Canal 并配置一致
- 启动 Canal Server
- 客户端通过 ZooKeeper 连接 Canal 集群
创作不易,帮点点关注!

97

被折叠的 条评论
为什么被折叠?



