1.canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议 2.MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) 3.canal 解析 binary log 对象(原始为 byte 流)
配置MySQL需要让canal伪装成salve并正确获取mysql中的binary log,首先要开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式
修改MySQL配置文件,如下操作:
# 执行修改命令 vi /mnt/mysql/conf/mysql.cnf #自己的mysql配置文件路径 # 配置文件 mysql.cnf 内容如下 [mysqld] # 设置关闭二进制日志 #skip-log-bin # 开启二进制日志 log-bin=mysql-bin #开启binlog 选择ROW模式 binlog-format=ROW #server_id不要和canal的slaveId重复 server_id=1
配置文件修改完成后重启MySQL
docker restart mysql
在MySQL中执行以下sql,查询数据库状态
show variables like 'log_bin'; show variables like 'binlog_format'; show master status;
创建连接MySQL的账号canal并授予作为 MySQL slave 的权限,执行以下sql:
# 创建账号 CREATE USER canal IDENTIFIED BY 'canal'; # 授予权限 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; # 修改数据库加密算法,如果数据库是5.7及以下版本,这句话不需要执行 ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal'; # 刷新并应用 FLUSH PRIVILEGES;创建并配置Cancal
创建canal-server容器
# 创建docker网络环境,指定子网网段 一般情况docker下载后就会创建 docker network create --subnet=172.36.0.0/16 seckill_network #创建canal-server容器 docker run -d --name canal-server --net seckill_network --ip 172.36.0.8 --restart=always -p 11111:11111 canal/canal-server:v1.1.4
配置Canal
# 进入Canal容器 docker exec -it canal-server /bin/bash # 修改配置文件 vi /home/admin/canal-server/conf/example/instance.properties # instance.properties需要修改以下三个部分 # 修改Canal的slaveId,不能和MySQL的server_id重复 canal.instance.mysql.slaveId=101 # 修改需要进行同步操作的MySQL的连接地址 canal.instance.master.address=172.36.0.3:3306 # 修改需要进行监听的数据库表 库名点表名 canal.instance.filter.regex=seckill_goods.tb_sku # 修改完成后重启Canal服务 docker restart canal-serverjava项目中使用
1)pom.xml
在seckill-canal中确保有Canal依赖:
top.javatool canal-spring-boot-autoconfigure1.2.1-RELEASE
在seckill-canal的bootstrap.yml配置文件中添加以下依赖
#Canal配置 canal: server: 服务器地址:11111 destination: example #默认example
2)创建一个类实现EntryHandler接口,代码如下:
@Component public class SkuHandler implements EntryHandler
修改数据库就可以看到效果,同步其他数据库自己写代码。



