高可用
这里的高可用分为两类,客户端集群和服务端集群。都是采用冷备模式,因为对于 binlog 数据消费来说,并行处理将会带来数据顺序错乱的问题,当然你可以通过一些复杂的机制去实现,这里不做说明。集群部署需要 Zookeeper。
服务端集群
- 机器准备,本地准备两台虚拟机
ip | 服务器说明 |
---|---|
192.168.220.1(本地ip) | mysql实例,zookeeper |
192.168.220.130 | canal服务 |
192.168.220.133 | canal服务 |
- 按照部署和配置,各自完成配置,演示时instance name为example
-
修改canal.properties,加上zookeeper配置
a、192.168.220.133canal.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
-
- 启动两个实例
启动后,你可以查看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秒后自动连接