(五)、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秒后自动连接
在这里插入图片描述

要在Docker中实现Canal高可用部署,需要使用Docker Compose来定义和管理多个容器。下面是一个简单的Docker Compose文件示例: ``` version: '3.7' services: canal-server: image: canal/canal-server:v1.1.4 container_name: canal-server restart: always environment: - canal.instance.mysql.slaveId=1 - canal.instance.master.address=mysql:3306 - canal.instance.dbUsername=<username> - canal.instance.dbPassword=<password> - canal.instance.connectionCharset=UTF-8 ports: - "11111:11111" depends_on: - zookeeper zookeeper: image: zookeeper:3.6.2 container_name: zookeeper restart: always environment: - ZOO_MY_ID=1 - ZOO_SERVERS=server.1=zookeeper:2888:3888 ports: - "2181:2181" - "2888:2888" - "3888:3888" ``` 在这个Docker Compose文件中,我们定义了两个服务:canal-server和zookeeper。canal-server是Canal服务的主要组件,它从MySQL数据库中读取数据,并将其写入到Kafka或其他消息队列中。zookeeper是Canal的依赖项之一,用于协调Canal集群中各个节点之间的通信。 在canal-server服务中,我们指定了一些环境变量来配置Canal实例。这些变量包括MySQL主库地址、用户名、密码以及连接字符集等信息。我们还将容器端口映射到主机的11111端口,以便我们可以通过该端口访问Canal服务。 在zookeeper服务中,我们使用zookeeper:3.6.2镜像来运行一个ZooKeeper节点,并指定了一些环境变量来配置ZooKeeper实例。我们将容器端口映射到主机的2181、2888和3888端口,以便我们可以通过这些端口访问ZooKeeper服务。 要运行这个Docker Compose文件,只需在包含该文件的目录中运行以下命令: ``` docker-compose up -d ``` 这会启动Canal服务和ZooKeeper服务,并将它们放入后台运行。要停止这些服务,可以运行以下命令: ``` docker-compose down ``` 这将停止并删除所有Docker容器和相关的网络和卷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值