(五)、canal学习笔记之高可用部署

高可用

这里的高可用分为两类,客户端集群和服务端集群。都是采用冷备模式,因为对于 binlog 数据消费来说,并行处理将会带来数据顺序错乱的问题,当然你可以通过一些复杂的机制去实现,这里不做说明。集群部署需要 Zookeeper。

服务端集群

  1. 机器准备,本地准备两台虚拟机
ip服务器说明
192.168.220.1(本地ip)mysql实例,zookeeper
192.168.220.130canal服务
192.168.220.133canal服务
  1. 按照部署和配置,各自完成配置,演示时instance name为example
    • 修改canal.properties,加上zookeeper配置
      a、192.168.220.133

      canal.ip=192.168.220.133
      canal.register.ip=192.168.220.133
      canal.zkServers=192.168.220.1:2181
      canal.instance.global.spring.xml = classpath:spring/file-instance.xml
      

      b、192.168.220.130

      canal.ip=192.168.220.130
      canal.register.ip=192.168.220.130
      canal.zkServers=192.168.220.1:2181
      canal.instance.global.spring.xml = classpath:spring/file-instance.xml
      
    • 使用默认的example目录,并修改instance.properties配置

      canal.instance.master.address = 192.168.220.1:3306
      
    注意: 两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name进行管理,同时必须都选择default-instance.xml配置
  2. 启动两个实例
    启动后,你可以查看logs/example/example.log,只会看到一台机器上出现了启动成功的日志。
    可以使用zookeeper客户端工具查看运行情况,我这里使用prettyZoo查看
    在这里插入图片描述
    关闭192.168.220.133canal服务,则running就为192.168.220.130

在这里插入图片描述

客户端集群

客户端集群和服务端集群采用相同的模式,每个实例去抢占锁,获得了锁那么这个实例就运行获取数据,其他实例做冷备。

若正在运行消费数据的实例由于网络波动,导致和 zookeeper 失去连接,那么其他客户端实例不会立即抢占,会等待 60s 后才执行抢占,给与这个实例恢复的机会。

客户端集群使用的连接对象跟之前的不同,之前使用的是单节点:ClusterCanalConnection,但使用方法基本相同。

示例:

//初始化日志
            var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder
                    .AddFilter("Microsoft", LogLevel.Debug)
                    .AddFilter("System", LogLevel.Information)
                    .AddConsole();
            });

            var logger = loggerFactory.CreateLogger<Program>();
            //设置zk地址和clientid,统一集群的client必须相同
            var conn = new ClusterCanalConnection(new ClusterCanalOptions("localhost:2181", "12350"), loggerFactory);
            //连接到Server                                      
            await conn.ConnectAsync();
            //订阅
            await conn.SubscribeAsync();
            await conn.RollbackAsync(0);
            while (true)
            {
                try
                {
                    //获取数据
                    var msg = await conn.GetAsync(1024);
                    if (msg.Entries != null && msg.Entries.Count > 0)
                    {

                    }
                    else
                    {
                        await Task.Delay(1000);
                    }
                }
                catch (Exception e)
                {
                    logger.LogError(e, "Error.");
                    //发生异常执行重连,此方法只有集群连接对象才有
                    await conn.ReConnectAsync();
                }

            }

启动客户端,在test数据库中的t1表中添加一条记录,客户端就会收到数据

在这里插入图片描述

启动多个客户端,只有最先抢到锁的客户端能连上,其他客户端则等待锁

在这里插入图片描述
关闭第一个客户端后,第二个客户端等待60秒后自动连接
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值