Docker 运行 Canal

本贴最后更新于 563 天前,其中的信息可能已经斗转星移

前言

开发业务过程中遇到一个需求,我们给第三方提供了接口,当业务数据变化的时候需要通知到第三方业务系统。本来常规的想法是接上一个 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.propertiesinstance.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
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖
  • Canal
    3 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...