安装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 位点延迟


八、结语

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

相关推荐
是苏浙3 小时前
JDK17新增特性
java·开发语言
阿里加多6 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood6 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员6 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai
zs宝来了7 小时前
AQS详解
java·开发语言·jvm
lulu12165440789 小时前
Claude Code Harness架构技术深度解析:生产级AI Agent工程化实践
java·人工智能·python·ai编程
阿里加多9 小时前
第 1 章:Go 并发编程概述
java·开发语言·数据库·spring·golang
一 乐9 小时前
物流信息管理|基于springboot + vue物流信息管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·物流信息管理系统