高可用

优质
小牛编辑
127浏览
2023-12-01

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

服务端集群

conf/canal.properties 文件中修改 zookeeper 地址

canal.zkServers=127.0.0.1:2181

集群中每个实例需,配置相同的 zookeeper 地址。

参考官方文档:AdminGuide|QuickStart

客户端集群

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

若正在运行消费数据的实例由于网络波动,导致和 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")
//连接到Server                                      loggerFactory);
await conn.ConnectAsync();
//订阅
await conn.SubscribeAsync();
await conn.RollbackAsync(0);
while (true)
{
    try
    {
        //获取数据
        var msg = await conn.GetAsync(1024);
    }
    catch (Exception e)
    {
        _logger.LogError(e,"Error.");
        //发生异常执行重连,此方法只有集群连接对象才有
        await conn.ReConnectAsync();
    }

}