写点什么

使用 Docker 部署 canal,并将消息推送到 RabbitMQ

用户头像
AlwaysBeta
关注
发布于: 2020 年 12 月 20 日

上一篇已经介绍了使用 Docker 部署 canal 服务,实现 MySQL 数据库 binlog 日志解析,并且用官方提供的客户端程序成功读到了消息。但在生产环境下还不能这么用,更好的做法是将消息发送到消息队列,然后再从消息队列消费。


这里我选择的是 RabbitMQ。


原来看官方文档发现只支持 Kafka 和 RocketMQ,但好在最新版 1.1.5 也支持了 RabbitMQ,而且镜像也已经打好了。


如果使用 Docker 部署的话,直接拉取最新的镜像即可。


配置 canal


第一步拉取镜像:


# docker pull canal/canal-server:latest
复制代码


然后启动容器,从容器中拷贝出配置文件:


# docker cp canal-server:/home/admin/canal-server/conf/canal.properties ./# docker cp canal-server:/home/admin/canal-server/conf/test/instance.properties ./
复制代码


修改 canal.properties 文件,配置输出到 RabbitMQ,有以下几处要改:


# 指定 RabbitMQcanal.serverMode = rabbitMQ
# RabbitMQ 配置rabbitmq.host = 127.0.0.1rabbitmq.virtual.host = /rabbitmq.exchange = exchange.canalrabbitmq.username = xxxxrabbitmq.password = xxxx
复制代码


这里有两点需要说明,一是我在网上找的很多文章,关于 RabbitMQ 的配置都是这样的:


canal.mq.servers = xxxcanal.mq.vhost = /canal.mq.exchange = exchange.canalcanal.mq.username = admincanal.mq.password = admin
复制代码


但是我这样配置并不成功,也可能是版本的问题,我没有更多去验证。


第二个是目前 RabbitMQ 的配置还不支持端口,只能使用默认端口 5672。


接下来修改 instance.properties 文件:


# MySQL 地址 + 端口canal.instance.master.address=host:portcanal.instance.dbUsername=xxxxcanal.instance.dbPassword=xxxx# 对应到 RabbitMQ 的话是 Routing keycanal.mq.topic=canal-routing-key
复制代码


docker-compose 文件:


version: '3'
services: canal-server: image: canal/canal-server container_name: canal-server restart: unless-stopped network_mode: host ports: - 11111:11111 volumes: - ./canal.properties:/home/admin/canal-server/conf/canal.properties - ./instance.properties:/home/admin/canal-server/conf/test/instance.properties - ./log/:/home/admin/canal-server/logs/
复制代码


一切就绪,启动服务:


# docker-compose up -d
复制代码


配置 RabbitMQ


首先新建 exchange:



然后新建队列:



最后绑定队列:



这里要注意,Routing key 一定要和之前配置的一致。


到这里,如果顺利的话队列里就应该有消息了。


参考文档:


https://www.siques.cn/doc/340


发布于: 2020 年 12 月 20 日阅读数: 36
用户头像

AlwaysBeta

关注

微信公众号:AlwaysBeta 2017.11.30 加入

后端开发,技术栈:Python,Django,Redis,RabbitMQ,Kafka,Elasticsearch,MySQL

评论

发布
暂无评论
使用 Docker 部署 canal,并将消息推送到 RabbitMQ