Canal同步订阅mysql的binglog数据并对接rabbitmq
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示