Canal同步订阅mysql的binglog数据并对接rabbitmq

发布时间 2023-10-12 14:47:44作者: 丝絮

      canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议,mysql master收到dump请求,开始推送binary log给slave(也就是canal),canal解析binary log对象(原始为byte流)。本文介绍如何在docker中安装canal,canal订阅mysql的binglog日志,并将日志以json格式投递到rabbitmq中。

对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format ROW 模式,my.cnf 中配置如下:

[mysqld]

log-bin=mysql-bin # 开启 binlog

binlog-format=ROW # 选择 ROW 模式

server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步

授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant

CREATE USER 'canal'@'%' identified by 'abcd@1234';

 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;

1、安装canal-admin 通过webui界面管理canal功能。

1)自带canal-admin数据库

方法一:通过脚本安装

wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh

sudo bash  run_admin.sh -e server.port=8089 \

         -e canal.adminUser=admin \

         -e canal.adminPasswd=admin

方法二:通过docker命令安装

sudo docker run -d --privileged=true -it -h 0 -e server.port=8089 -e canal.adminUser=admin -e canal.adminPasswd=admin --name=canal-admin --net=host -m 1024m canal/canal-admin

2)对接外部数据库irentals-canal

利用订阅mysql binglog账号canal,赋予操作数据库irentals-canal的所有权限。

 grant all privileges on `irentals-canal`.* to 'canal'@'%' identified by 'abcd@1234'; (赋予数据库`irentals-canal`所有操作权限,注意符号``

方法一:通过脚本安装

wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh

sudo bash  run_admin.sh -e server.port=8089 \

         -e spring.datasource.address=192.168.0.1:3306\

         -e spring.datasource.database=irentals-canal \

         -e spring.datasource.username=canal \

         -e spring.datasource.password=abcd@1234

方法二:通过docker命令安装

sudo docker run -d -p 8089:8089 --privileged=true -u root -it -h 0 -e server.port=8089 -e spring.datasource.address=192.168.0.1:3306 -e spring.datasource.database=irentals-canal -e spring.datasource.username=canal -e spring.datasource.password=abcd@1234 --name=canal-admin  -m 1024m canal/canal-admin 

启动后访问:http://172.16.0.16:8089/  默认用户名admin,密码123456

2、安装canal-server 

方法一:通过脚本安装

bash  run.sh -e canal.admin.manager=127.0.0.1:8089 \

         -e canal.admin.port=11110 \

         -e canal.admin.user=admin \

         -e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441

方法二:通过docker命令安装

docker run -d --privileged=true -it -h 0 -e canal.admin.manager=127.0.0.1:8089 -e canal.admin.port=11110 -e canal.admin.user=admin -e canal.admin.passwd=4ACFE3202A5FF5CF467898FC58AAB1D615029441 --name=canal-server --net=host -m 4096m canal/canal-server

1) 配置canal server

 Canal server启动成功后,会在canal-admin下增加一个server节点(可自行修改server名称)

操作”=》“配置”界面,选择“载入模板”,在模板中进行参数配置。

canal.serverMode = rabbitMQ

RabbitMQ参数配置:

Host:127.0.0.1(无需端口)

Queue:队列名称

RoutingKey:需与instance的topic一致

需先配置好exchange,username和password,其中deliveryMode为exchange的mode,一般有topic,direct,fanout,headers.

 2) 配置canal instance

新建instance,输入名称,选择server主机,载入默认模板。

模板配置:

canal.instance.master.address=127.0.0.1:3306    配置数据库

canal.instance.dbUsername=canal               canal.instance.dbPassword=abcd@1234

canal.instance.defaultDatabaseName =dbtest     设置订阅的数据库名称(可省略)

canal.instance.filter.regex=dbtest.test1,dbtest.test2   过滤订阅的数据库表

canal.mq.topic=check.logs  (此为rabbitmq的routing key)

注意:订阅的mysql binglog不要带原生sql,会导致过滤数据库表时效,以至于收到全部数据库表的变更消息。设置方法:

binlog-format=ROW

binglog rows query log events=1

验证:

对订阅的表插入数据,mq收到如下消息:

参考:

https://github.com/alibaba/canal

https://snailgary.org/c6a2841486ec9af0c38d2c07a60020f6