目前canal的一个instance客户端是一 一对应的关系,那么想要保证程序的高可用就要实现集群模式,如下图
两个canal(server),只会有一个工作,另一个处于阻塞状态
两个canal(client),只会有一个工作,另一个处于阻塞状态
如果工作中的canal(server) 或canal(client),那么就绪状态的canal(server) 或canal(client)就会进入工作状态,从而达到高可用。
如何搭建高可用集群?
1.下载
https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
解压 canal.deployer-1.1.5.tar.gz
2.修改canal.properties配置文件
#canal服务id,目前没有实际意义
canal.id = 11
#canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
canal.port = 11111
canal.metrics.pull.port = 11112
#zookeeper服务地址端口
canal.zkServers =127.0.0.1:2181
#表示实例的配置文件instance.properties地址
canal.destinations = example
# 所有的组件(parser , sink , store)都选择了持久化模式,
# 目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
3.修改canal里面的instance的配置
修改instance的instance.properties,配置需要读取binlog的数据源的参数
canal.instance.mysql.slaveId = 1234 唯一标识
canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.defaultDatabaseName =
canal.instance.filter.regex=.*\\..*
4.配置集群的其他canal(server)
复制一份 canal (server),修改canale.properties文件
#canal服务id,目前没有实际意义
canal.id = 22
#canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
canal.port = 12111
canal.metrics.pull.port = 12112
# 所有的组件(parser , sink , store)都选择了持久化模式,
# 目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
5.分别启动两个server
6.canal客户端集群
将相同的代码部署多份,通过zookeeper保证同一时刻只有一个客户端在工作,其中一个down掉,另一个会在一定时间内进入工作状态
说明:
1.当在一台服务器上同时启动这两个canal服务时,第一个正常启动,另一个的canal.log报错如下
如果非要在一台服务器上部署canal(server)集群,那么要修改canal.properties的canal.admin.port 的值,这是连接canal-admin(canal的管理门户)的参数配置,避免端口被占用
2.集群模式下如果保证一个server挂了,另一个server的instance可以接着挂掉的server读取binlog的位移接着向下读取binglog呢?
是因为instance的读取binlog的信息都保存在了zookeeper中,可以如图方式查看位移信息
3.集群模式的canal.properties中配置
# 所有的组件(parser , sink , store)都选择了持久化模式,
# 目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
也可以改成下面的配置,标识instance读取binlog的位移信息持久化到文件中,一般都是存在meta.data中,看介绍说这个配置是不支持集群模式的,但是经测试试验也是可以的实现集群高可用的,但是不推荐使用,会丢失数据例如下面的场景:
先启动canal(server 1 ),消费的位移到了1000,停掉这个canal(server 1 )
启动canal(server 2 ),那么canal(server 2 )读取本地的文件的位移是990,那么
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
4.canal是如何利用zookeeper进行储存数据的?