前言
开发业务过程中遇到一个需求,我们给第三方提供了接口,当业务数据变化的时候需要通知到第三方业务系统。本来常规的想法是接上一个 MQ,在有数据变更的那些接口处写上逻辑进行判断,如果数据发生了变更,则发送消息给 MQ,然后在一个地方写监听事件,当监听到指定 MQ 消息的时候,进行消息推送处理,推给第三方。
如果觉得不够优雅,可以写一个切面,制定一个自定义的注解,在需要触发消息的方法中,挂上这个注解就可以了。
后来了解到有 Canal 这个东西,就打算研究一下,这个是阿里巴巴的产品,通过监听 mysql binlog 实现的。
配置 Mysq 主从
修改 my.cnf
server-id=1
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=test
配置解读:
① server-id :指定当前服务的 id,必须指定,否则会报错
② log-bin :设置 binlog 文件的存放地址和文件名,叫做 mysql-bin,此处指定的目录前缀是 mysql 容器的数据存放目录,所以可以在挂载目录中看到相关的文件,命名格式是 mysql-bin.000001 开始慢慢叠加
③ binlog-do-db :指定针对哪个数据库记录 binlog 的 events 事件,此处记录 test 库
创建 Canal 账号
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
创建 Docker 容器
docker run -p 11111:11111 --name canal \
-e canal.destinations=test \
-e canal.instance.master.address=127.0.0.1:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=test\\..* \
--restart=always \
-d canal/canal-server
注意:在 zsh 中-e canal.instance.filter.regex=test\..* \ 这个配置会引起报错,没关系,在终端中执行就可以。
配置解读:
① -p :指定端口
② -e :指定配置文件的配置信息。此处主要有两个配置文件在起作用,分别是 canal.properties 和 instance.properties 这两个配置文件,前缀是 canal. 的修改就是 canal.properties 这个配置文件的,前缀是 canal.instance 修改的就是 instance.properties 这个配置文件的
③ canal.destinations :指定了实例的名称,决定了 instance 实例的配置文件存放目录
④ canal.instance.master.address :指定了 mysql 的地址,正常需要 ip,此处由于会将 mysql 和 canal 放在一个网络中,所以可以直接使用 mysql 替代
⑤ canal.instance.filter.regex :此处指定只过滤 test 这个数据库的 binlog 数据
⑥ network mysql-test :指定网络是步骤 1 创建的网络
⑦ restart=always :将 canal 设置为 docker 启动时自启,可要可不要
⑧ -d :指定步骤 2 拉取的镜像名称以及版本
复制 Canal 配置
将容器中的配置文件复制出来,方便修改,这一步不是必须的
# canal.properties & instance.properties
# 注意,instance.properties文件是在canal.destinations这个配置指定的目录作为前缀下面
docker cp canal:/home/admin/canal-server/conf/canal.properties /mydata/canal/conf
docker cp canal:/home/admin/canal-server/conf/test/instance.properties /mydata/canal/conf
重启 Docker
# 停止并删除容器
docker stop canal
docker rm canal
#重新运行并指定
docker run -p 11111:11111 --name canal \
-e canal.destinations=test \
-e canal.instance.master.address=mysql:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=test\\..* \
-v /mydata/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /mydata/canal/conf/instance.properties:/home/admin/canal-server/conf/test/instance.properties \
--network mysql-test \
--restart=always \
-d canal/canal-server
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于