docker安装canal并推送mysql消息到rabbitmq

先了解https://github.com/alibaba/canal
一、准备工作
1.对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

修改的配置文件后,记得重启mysql
用命令行或用navicat然后使用mysql库执行show variables like '%log_bin%';验证一下

2.授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant

CREATE USER canal IDENTIFIED BY 'abc123456';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

3.创建好配置和日志相关目录
mkdir -p /root/canalserver/logs
下载镜像docker pull canal/canal-server:latest
暂时先运行容器docker run --name canalserver01 -d canal/canal-server:latest
进入容器docker exec -it canalserver01 bash
通过 ls和cd等命令找到配置文件,然后exit;退回到宿主机
从容器中拷贝出配置文件到刚才新建的/root/canalserver目录里:
docker cp canalserver01:/home/admin/canal-server/conf/canal.properties /root/canalserver
docker cp canalserver01:/home/admin/canal-server/conf/example/instance.properties /root/canalserver
输入cd /root/canalserver目录,通过ls就可以看到了
停止并删除刚才的容器docker stop canalserver01然后docker rm canalserver01

4.编辑instance.properties文件

#配置mysql的地址和端口
canal.instance.master.address=192.168.3.113:3306
#配置前面创建的专用于canal的mysql账号和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=abc123456
#配置消息队列路由key
canal.mq.topic=my_canal_routingkey

5.编辑canal.properties文件,目前1.1.5canal的RabbitMQ配置还不支持端口,只能使用默认端口 5672

canal.serverMode=rabbitMQ
rabbitmq.host=192.168.3.113
rabbitmq.virtual.host=my_rabbitmq_host
rabbitmq.exchange=my_canal_exchange
rabbitmq.username=admin
rabbitmq.password=abc123456

6.通过rabbitmq的web工具做相关配置
记得启动rabbitmq,最新版canal 1.1.5 也支持了 RabbitMQ
登录http://192.168.3.113:15672
在Exchanges里面新增一个my_canal_exchange(这个名字在上面的配置文件中的一致,否则会在logs/example.log中看到报错说没有my_canal_exchange这个交换机)
在Queues里面新增一个my_canal_queue队列,并绑定到my_canal_exchange这个交换机和my_canal_routingkey
添加完后一写记得重启rabbitmq服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、运行和验证canal-server容器
1.启动canal容器

docker run --name canalserver01 \
-p 11111:11111 \
-v /root/canalserver/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /root/canalserver/logs:/home/admin/canal-server/logs \
-v /root/canalserver/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-d canal/canal-server:latest

-p表示将宿主机端口左11111映射到容器内端口右11111
-v冒号左边是宿主机路径,右边是容器内路径
记得开放端口firewall-cmd --zone=public --add-port=11111/tcp --permanent

2.验证
打开navicat工具,把我UserDb库的UserInfo表的某个值修改一下,然后刷新rabbitmq Web管理页面就可以看到my_canal_queue有一条消息了。

3.也可通过docker-compose部署canal

version: '3'
services:
  canal:
    image: canal/canal-server:latest
    container_name: canalserver01
    restart: always
    ports:
      - 11111:11111
    volumes: 
      - /root/canalserver/canal.properties:/home/admin/canal-server/conf/canal.properties
      - /root/canalserver/logs:/home/admin/canal-server/logs
      - /root/canalserver/instance.properties:/home/admin/canal-server/conf/example/instance.properties

三、使用C#客户端CanalSharp访问canal服务端
新建一个.net core3.1的控制应用程序,然后通过Nuget安装CanalSharp依赖包
记得把配置改回tcp canal.serverMode = tcp 然后重启canalserver服务· 直接复制官方github上提供的示例代码,注意SimpleCanalOptions第三个参数虽是字符串,但只能填正整数`

class Program
    {
    
    
        static async System.Threading.Tasks.Task Main(string[] args)
        {
    
    
            // 初始化日志
            var loggerFactory = LoggerFactory.Create(builder =>
            {
    
    
                builder.AddFilter("Microsoft", LogLevel.Debug)
                    .AddFilter("System", LogLevel.Information)
                    .AddConsole();
            });
            var logger = loggerFactory.CreateLogger<SimpleCanalConnection>();

            // 创建连接
            var conn = new SimpleCanalConnection(new SimpleCanalOptions("192.168.3.149", 11111, "1"), logger);
            // 连接到 Canal Server
            await conn.ConnectAsync();
            // 订阅
            await conn.SubscribeAsync();
            // 获取数据
            var msg = await conn.GetAsync(1024);
            Console.Read();
        }
    }

然后断点调试一切OK。

猜你喜欢

转载自blog.csdn.net/junshangshui/article/details/114199235