一、前言:Canal 是什么?
Canal 是阿里巴巴开源的 MySQL 数据库增量日志(Binlog)订阅 & 消费组件。它通过模拟 MySQL 的 Slave 节点,实时捕获数据库的 INSERT/UPDATE/DELETE 变更,并将结构化数据推送给下游系统(如 Kafka、Elasticsearch、Redis 等)。
✅ 典型应用场景:
- 缓存同步(MySQL → Redis)
- 实时数仓(MySQL → Kafka → Flink)
- 审计日志
- 异构数据库同步
本文将带你从零开始安装 Canal ,包含 MySQL 配置、Canal 部署、启动验证 全流程。
二、环境准备
2.1 基础依赖
- 操作系统:Linux(CentOS/Ubuntu)或 Windows(仅测试)
- JDK:8 或 11(Canal 是 Java 应用)
- MySQL:5.7+ 或 8.0(需开启 Binlog)
2.2 验证 JDK
bash
java -version
# 输出示例:
# openjdk version "11.0.19" 2023-04-18
💡 若未安装,请先执行:
bash# Ubuntu/Debian sudo apt update && sudo apt install openjdk-11-jdk # CentOS/RHEL sudo yum install java-11-openjdk-devel
三、关键前置:配置 MySQL
Canal 依赖 MySQL 的 Binlog 功能,必须先配置!
3.1 修改 MySQL 配置文件
编辑 my.cnf(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf):
bash
[mysqld]
# 开启 Binlog
log-bin=mysql-bin
# 设置 Binlog 格式为 ROW(必须!)
binlog-format=ROW
# 服务器唯一 ID(不能与 Canal 的 slaveId 重复)
server-id=1
# (可选)指定同步的数据库
# binlog-do-db=your_database_name
3.2 重启 MySQL 使配置生效
bash
sudo systemctl restart mysqld
# 或
sudo service mysql restart
3.3 创建 Canal 专用账号
sql
-- 登录 MySQL
mysql -u root -p
-- 创建用户(IP 根据 Canal 服务器填写,% 表示任意)
CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@123456';
-- 授予 REPLICATION 权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
3.4 验证 Binlog 是否开启
sql
SHOW VARIABLES LIKE 'log_bin'; -- 应返回 ON
SHOW VARIABLES LIKE 'binlog_format'; -- 应返回 ROW
SHOW MASTER STATUS; -- 查看当前 Binlog 文件和位置
四、安装 Canal Server(两种方式)
📌 推荐版本 :
canal.deployer-1.1.8(截至 2026 年最新稳定版)
方式 1:传统部署(适合生产)
步骤 1:下载 Canal
bash
# 创建安装目录
mkdir -p /opt/canal && cd /opt/canal
# 下载(替换为最新版链接)
wget https://github.com/alibaba/canal/releases/download/canal-1.1.8/canal.deployer-1.1.8.tar.gz
# 解压
tar -zxvf canal.deployer-1.1.8.tar.gz
步骤 2:配置 Canal
进入 conf 目录,修改两个核心文件:
(1) conf/canal.properties(全局配置)
# 监听端口(默认 11111)
canal.port=11111
# 注册的 instance 列表(对应 conf/ 下的目录名)
canal.destinations=example
# 关闭自动扫描(生产建议关闭)
canal.auto.scan=false
(2) conf/example/instance.properties(实例配置)
# MySQL 主库地址
canal.instance.master.address=192.168.1.100:3306
# MySQL 账号密码(上一步创建的)
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456
# 过滤表(可选,格式:schema.table)
canal.instance.filter.regex=.*\\..*
# 忽略表(可选)
# canal.instance.filter.black.regex=
💡 目录说明:
conf/example/:一个 instance 对应一个 MySQL 数据源- 可复制
example为order_db、user_db等支持多数据源
步骤 3:启动 Canal
bash
# 启动
sh bin/startup.sh
# 查看日志
tail -f logs/canal/canal.log
tail -f logs/example/example.log # instance 日志
成功标志:
INFO c.a.otter.canal.server.embedded.CanalServerWithEmbedded - start CanalInstances[example] successfully
方式 2:Docker 部署(适合快速测试)
步骤 1:拉取镜像
bash
docker pull canal/canal-server:v1.1.8
步骤 2:启动容器(挂载配置)
bash
docker run -d \
--name canal \
-p 11111:11111 \
-e canal.destinations=example \
-e canal.instance.master.address=192.168.1.100:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=Canal@123456 \
-e canal.instance.connectionCharset=UTF-8 \
canal/canal-server:v1.1.8
⚠️ 注意:确保 Docker 容器能访问 MySQL(网络打通)
五、验证 Canal 是否工作
5.1 使用官方客户端测试
Canal 提供了简单 Java 客户端,可快速验证:
java
// Maven 依赖
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.8</version>
</dependency>
java
// 示例代码
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress("127.0.0.1", 11111), "example", "", "");
connector.connect();
connector.subscribe(".*\\..*"); // 订阅所有表
while (true) {
Message message = connector.get(1000);
for (CanalEntry.Entry entry : message.getEntries()) {
// 打印变更事件
System.out.println(entry.toString());
}
}
5.2 手动触发 MySQL 变更
sql
-- 在 MySQL 中执行
INSERT INTO test_table (name) VALUES ('Canal Test');
观察客户端输出 :应看到包含 INSERT 操作的结构化事件!
六、常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Canal 启动失败 | JDK 版本不兼容 | 使用 JDK 8/11 |
| 连接 MySQL 失败 | 账号无权限 / 网络不通 | 检查 GRANT 和防火墙 |
| 收不到变更事件 | Binlog 格式非 ROW | 确认 binlog-format=ROW |
日志报错 Slave failed to initialize |
server-id 冲突 | 修改 MySQL 的 server-id ≠ Canal 的 slaveId(默认 1234) |
七、后续步骤建议
-
对接消息队列 :将 Canal 输出到 Kafka,实现解耦
# conf/canal.properties canal.mq.topic=canal-topic canal.mq.servers=192.168.1.200:9092 -
使用 Canal Adapter:直接同步到 ES/HBase(无需写客户端)
-
监控告警 :监控
logs/example/meta.log中的 Binlog 位点延迟
八、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!