一、什么是canal
canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。可以简单地把canal理解为一个用来同步增量数据的一个工具。
官网地址: alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件

canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。
二、canal能做什么
canal的数据同步不是全量的,而是增量。基于binary log增量订阅和消费,canal可以做:
数据库镜像
数据库实时备份
索引构建和实时维护(拆分异构索引、倒排索引等)
业务cache(缓存)刷新
带业务逻辑的增量数据处理
三、canal部署
3.1 MySQL的准备
3.1.1 创建数据库
CREATE DATABASE db01;
use db01;
3.1.2 创建表
CREATE TABLE user_info(
`id` VARCHAR(255),
`name` VARCHAR(255),
`sex` VARCHAR(255)
);
3.1.2 修改配置文件开启Binlog
vi /etc/my.cnf
log-bin=binlog
binlog-format=row

3.1.4 重启MySQL使配置生效
systemctl restart mysqld
3.1.5 赋权限(注意!!!是在mysql主库中进行创建)
在MySQL中执行
# canal和mysql的端口不一致
-- 登录 MySQL
mysql -hxx.xx.xx.xxuroot -pxxxxxx
-- 创建用户并授权
CREATE USER 'canal'@'xx.xx.xx.xx' IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'xx.xx.xx.xx';
FLUSH PRIVILEGES;
# canal和mysql的端口一致
-- set global validate_password_length=4;
-- set global validate_password_policy=0;
-- GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal' ;
-- flush privileges;
3.2 下载并解压Jar包
下载地址: Releases · alibaba/canal

将下载的压缩包上传至虚拟机,解压到/opt/module/canal包下
!!!注意:canal解压后是分散的,我们在指定解压目录的时候需要将canal指定上
sudo mkdir /opt/module/canal
sudo tar -zxvf canal.deployer-1.1.8.tar.gz -C /opt/module/canal
3.3 修改canal.properties的配置
cd /opt/module/canal/conf
vi canal.properties
修改以下配置


说明:这个文件是canal的基本通用配置,canal端口号默认就是11111,修改canal的输出model,默认tcp,改为输出到kafka
3.4 修改instance.properties
我们这里只读取一个MySQL数据,所以只有一个实例,这个实例的配置文件在conf/example目录下
cd /opt/module/canal/example
vi instance.properties
配置MySQL服务器地址

配置连接MySQL的用户名和密码,默认就是我们前面授权的canal

修改instance.properties输出到Kafka的主题以及分区数

启动Canal
cd /opt/module/canal/
./bin/startup.sh
#相应停止的命名如下:
# 停止Canal
./bin/stop.sh
# 清理可能存在的残留进程
pkill -f canal
# 启动Canal
./bin/startup.sh
3.5如果没有安装jdk:
3.5.1. 检查是否安装了 Java
首先,检查你的系统中是否已经安装了 Java。运行以下命令:
java -version
如果系统中没有安装 Java,你会看到类似以下的输出:
-bash: java: command not found
3.5.2. 安装 Java
如果系统中没有安装 Java,你需要安装它。你可以使用 YUM 安装 OpenJDK(Java Development Kit)。运行以下命令:
sudo yum install java-1.8.0-openjdk-devel
安装完成后,再次运行 java -version 检查是否安装成功:
java -version
你应该看到类似以下的输出:
openjdk version “1.8.0_XXX”
OpenJDK Runtime Environment (build 1.8.0_XXX-bXX)
OpenJDK 64-Bit Server VM (build 25.XXX-bXX, mixed mode)
3.5.3. 设置 JAVA_HOME 环境变量
即使 Java 已经安装, startup.sh 脚本可能仍然需要 JAVA_HOME 环境变量。你需要设置 JAVA_HOME 并将其添加到 PATH 中。
首先,找到 Java 的安装路径。通常,OpenJDK 安装在 /usr/lib/jvm/java-1.8.0-openjdk 。你可以通过以下命令确认:
ls -d /usr/lib/jvm/java-1.8.0-openjdk
然后,设置 JAVA_HOME 环境变量。你可以将以下内容添加到你的 ~/.bashrc 或 ~/.bash_profile 文件中:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
运行以下命令使更改生效:
source ~/.bashrc
3.5.4. 验证 Java 环境变量
运行以下命令验证 JAVA_HOME 和 PATH 是否设置正确:
echo $JAVA_HOME
echo $PATH
java -version
你应该看到 JAVA_HOME 指向正确的 Java 安装路径,并且 java -version 命令能够正常运行。
3.5.5. 重新运行 startup.sh
现在,重新运行 startup.sh 脚本:
./bin/startup.sh

看到CanalLauncher你表示启动成功,同时会创建canal_test主题
启动Kafka消费客户端测试,查看消费情况
./bin/kafka-console-consumer.sh --bootstrap-server xx.xx.xx.xx:9092 --topic canal_test
#若kafka没有监测到数据,查看canal日志报错
2025-07-17 15:56:18.797 [main] ERROR c.a.o.c.common.zookeeper.running.ServerRunningMonitor - start failed
com.alibaba.otter.canal.meta.exception.CanalMetaManagerException: dir[../conf] can not read/write
2025-07-17 15:56:18.803 [main] ERROR c.a.o.c.common.zookeeper.running.ServerRunningMonitor - processActiveExit failed
java.lang.NullPointerException: null
at com.alibaba.otter.canal.meta.FileMixedMetaManager.stop(FileMixedMetaManager.java:120)
at com.alibaba.otter.canal.instance.core.AbstractCanalInstance.stop(AbstractCanalInstance.java:122)
at com.alibaba.otter.canal.server.embedded.CanalServerWithEmbedded.stop(CanalServerWithEmbedded.java:151)
at com.alibaba.otter.canal.deployer.CanalController$1.processActiveExit(CanalController.java:181)
at com.alibaba.otter.canal.common.zookeeper.running.ServerRunningMonitor.processActiveExit(ServerRunningMonitor.java:254)
at com.alibaba.otter.canal.common.zookeeper.running.ServerRunningMonitor.stop(ServerRunningMonitor.java:133)
at com.alibaba.otter.canal.common.zookeeper.running.ServerRunningMonitor.start(ServerRunningMonitor.java:105)
at com.alibaba.otter.canal.deployer.CanalController.start(CanalController.java:545)
at com.alibaba.otter.canal.deployer.CanalStarter.start(CanalStarter.java:88)
at com.alibaba.otter.canal.deployer.CanalLauncher.main(CanalLauncher.java:128)
2025-07-17 15:56:18.805 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
#执行下述命令
sudo chown -R bigdata:bigdata .
sudo chmod -R 755 conf
ls -ld conf
#drwxr-xr-x. 5 bigdata bigdata 123 7月 17 15:53 conf
./bin/stop.sh
rm -f conf/example/meta.dat
rm -f conf/example/*.tmp
./bin/startup.sh
向MySQL中插入数据后查看消费者控制台
这里是在Navicat中插入的数据进行测试
INSERT INTO user_info VALUES('1001','zhangsan','male'),('1002','lisi','female');
插入成功之后,kafka的消费者控制台有如下的输出打印


1807

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



