前言:由于我们公司需要数据库中的数据分别同步到ES、Mongodb及redis中,最初使用的是binlog而最近发现了一款性能更好的即阿里巴巴mysql数据库binlog的增量订阅&消费组件canal
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
从一张官网图中,我们可以看到canal的原理
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象,最后将解析的内容发送给mysql、kafka、es、rocketMQ等
配置
首先介绍我们这边的版本:canal.deployer-1.1.5(采用的是win10环境)
以下是目录结构:
以下配置都需要我们自行配置RocketMQ及MySQL的相关配置
canal.deployer-1.1.5/conf/canal.properties
# 配置模式tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = rocketMQ
...
# 指定实例目前包里自带example(可支持多个)
canal.destinations = example,example2
...
# 配置mq的accessKey、secretKey
canal.aliyun.accessKey =LTAIs4e56kBVE9
canal.aliyun.secretKey =pJPGAtvJKGWsS
...
# 配置mq的group地址、group、topic及tag
rocketmq.producer.group =CANCAL
rocketmq.customized.trace.topic =canal_test
rocketmq.namespace =MQ_INST_10142odK
rocketmq.namesrv.addr = http://MQ_INSTaccess.mq-internet.aliyuncs.com:80
rocketmq.tag = data_tag
实例example
canal.deployer-1.1.5/conf/example/instance.properties
# 数据库连接
canal.instance.master.address=test-public.mysql.com:3306
...
# 数据库用户密码
canal.instance.dbUsername=b2b
canal.instance.dbPassword=123456
...
# 匹配数据库的正则(库.表)
canal.instance.filter.regex=cr_debug.user
...
# mq的topic
canal.mq.topic=canal_test
实例example2
canal.deployer-1.1.5/conf/example2/instance.properties
# 数据库连接
canal.instance.master.address=test-public.mysql.com:3306
...
# 数据库用户密码
canal.instance.dbUsername=b2b
canal.instance.dbPassword=123456
...
# 匹配数据库的正则(库.表)
canal.instance.filter.regex=cr_debug.user_2
...
# mq的topic
canal.mq.topic=canal_test2
由于我们公司有多个项目,因此存在监控多个数据库及表因此我们需要配置多个实例
我们可以复制一个example的实例为example2,再对其里面的instance.properties进行对其他表及mq的配置就行了
# 指定实例目前包里自带example(可支持多个)
canal.destinations = example,example2
启动: canal.deployer-1.1.5/bin/startup.bat
MQ监测得到的信息
cr_debug.user表信息的变动以后发送的MQ消息
cr_debug.user_2表信息的变动以后发送的MQ消息
而收到的消息体:
{
"data":[
{
"id":"1",
"name":"Jone1",
"age":"18",
"email":"test1@baomidou.com"
}
],
"database":"cr_debug",
"es":1630552485000,
"id":7,
"isDdl":false,
"mysqlType":{
"id":"int(11)",
"name":"varchar(50)",
"age":"int(11)",
"email":"varchar(50)"
},
"old":[
{
"name":"Jone"
}
],
"pkNames":[
"id"
],
"sql":"",
"sqlType":{
"id":4,
"name":12,
"age":4,
"email":12
},
"table":"user",
"ts":1630552485953,
"type":"UPDATE"
}
通过代码监听到,可以看到data中就是我们更改后的内容,type为操作类型分别还有对应database以及table,拿到这些消息后我们可以进行自己的业务处理
参考资料
canal官方网站:Gitee 极速下载/canal
canal配置 rocketmq 做消息数据同步_canal.mq.servers = 192.168.30.219:9876-CSDN博客