安装Canal

一、前言: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 数据源
  • 可复制 exampleorder_dbuser_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)

七、后续步骤建议

  1. 对接消息队列 :将 Canal 输出到 Kafka,实现解耦

    复制代码
    # conf/canal.properties
    canal.mq.topic=canal-topic
    canal.mq.servers=192.168.1.200:9092
  2. 使用 Canal Adapter:直接同步到 ES/HBase(无需写客户端)

  3. 监控告警 :监控 logs/example/meta.log 中的 Binlog 位点延迟


八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
Try,多训练21 小时前
软件设计师备考第一性原理分析
java·经验分享·学习方法
Seven9721 小时前
Tomcat Container容器之Engine:StandardEngine
java
jinanwuhuaguo21 小时前
(第三十六篇)OpenClaw 去中心化的秩序——从“中心调度”到“网格自治”的治理革命
java·大数据·开发语言·网络·docker·去中心化·github
AI进化营-智能译站1 天前
ROS2 C++开发系列17-多线程驱动多传感器|chrono高精度计时实现机器人同步控制
java·c++·ai·机器人
qq_589568101 天前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
JAVA面经实录9171 天前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦1 天前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
FYKJ_20101 天前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
书源丶1 天前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java