Canal详解及安装部署

该文章已生成可运行项目,

一、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 架构主要分为三个部分:

  1. Canal Server:核心服务,负责 binlog 的采集和解析。
  2. Canal Client:客户端,负责消费 Canal 解析后的数据。
  3. MQ Adapter:适配器,将数据推送到 Kafka、RocketMQ、RabbitMQ 等消息队列。

4. 典型应用场景

  1. 数据库异构同步:如 MySQL → Elasticsearch,实现搜索引擎实时同步。
  2. 缓存刷新:如 MySQL → Redis,当数据库发生变更时,实时刷新缓存。
  3. 消息驱动:如 MySQL → Kafka,业务系统监听并处理数据库变更事件。
  4. 数据中台:数据汇聚,实时 ETL。

5. 与其他同步工具对比

工具主要用途优势劣势
CanalMySQL binlog订阅实时、开源、社区活跃仅支持MySQL
Debezium多数据库binlog订阅支持多种数据库依赖Kafka
MaxwellMySQL binlog订阅简单易用功能相对单一

6. 关键配置与注意事项

  • MySQL 必须开启 binlog 且为 ROW 格式
  • Canal 需要有 REPLICATION 权限。
  • 配置 Canal 的实例(instance)与数据源信息。
  • 关注 Canal 的高可用、断点续传、数据一致性问题。

二、Canal安装部署

1、前置条件

  1. MySQL 已开启 binlog 且为 ROW 格式
    修改 my.cnf 配置:

    [mysqld]
    server-id=1
    log-bin=mysql-bin
    binlog_format=ROW
    

    重启 MySQL。

  2. 创建 Canal 用户并授权

    CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
    FLUSH PRIVILEGES;
    

2、下载 Canal


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、常见问题

  1. 连接不上 MySQL:检查防火墙、权限、binlog 是否开启。
  2. 日志无数据:确认有 DML 操作(insert/update/delete),且表被 filter.regex 匹配。
  3. 内存占用高:可调节 canal.instance.memory.buffer.size。

9、Canal 集群架构原理

Canal 集群采用 ZooKeeper 作为协调者,实现多节点的高可用和负载均衡。整体架构如下:

  • Canal Server:多个实例组成集群,每个实例可以负责不同的 MySQL 实例或分担同一实例的负载。
  • ZooKeeper:负责节点选主、实例分配、状态同步。
  • Client:通过 ZooKeeper 获取可用的 Canal Server 节点进行连接和消费。

工作流程:

  1. Canal Server 启动后注册到 ZooKeeper。
  2. ZooKeeper 负责分配实例的主节点(Active),其他为备节点(Standby)。
  3. 当主节点故障时,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、常见问题与注意事项

  1. ZooKeeper 配置错误:检查 zkServers 地址、端口,确保 Canal Server 能访问 ZooKeeper。
  2. 主备切换不生效:确认所有 Canal Server 配置一致,ZooKeeper 节点状态正常。
  3. 负载均衡:一个实例(如 example)同时只能有一个 Active 节点,其它为 Standby,适合高可用场景,不是多活负载均衡。
  4. 多实例高可用:可以在 conf 下配置多个实例,每个实例都可以实现主备切换。

总结

Canal 集群部署的核心是 ZooKeeper 协调多节点主备切换,实现高可用。
步骤简述:

  1. 部署 ZooKeeper 集群
  2. 配置 Canal Server 的 zkServers
  3. 多台服务器部署 Canal 并配置一致
  4. 启动 Canal Server
  5. 客户端通过 ZooKeeper 连接 Canal 集群

创作不易,帮点点关注!

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值