实现canal高可用

一 canal HA架构

 

canal server HA实现流程

  1. canal server 要启动某个 canal instance 时都先向 zookeeper 进行一次尝试启动判断 (实现:创建 EPHEMERAL 节点,谁创建成功就允许谁启动);
  2. 创建 zookeeper 节点成功后,对应的 canal server 就启动对应的 canal instance,没有创建成功的 canal instance 就会处于 standby 状态;
  3. 一旦 zookeeper 发现 canal server A 创建的节点消失后,立即通知其他的 canal server 再次进行步骤1的操作,重新选出一个 canal server 启动instance;
  4. canal client 每次进行connect时,会首先向 zookeeper 询问当前是谁启动了canal instance,然后和其建立链接,一旦链接不可用,会重新尝试connect。

 canal client HA实现流程

      当主canal client宕机后,备用canal client会识别到,并接管过来,开始订阅instance,向目标端进行同步。

 二 实验步骤

2.1 安装canal

需要先安装好一台canal admin,两台canal server,canal client,这里略过。

2.2 安装zookeeper

zookeeper单实例安装请参考:

https://blog.csdn.net/yabingshi_tech/article/details/109645577

zookeeper集群安装请参考:

https://blog.csdn.net/yabingshi_tech/article/details/110795927

生产环境建议安装集群。

2.3 配置canal server高可用

2.3.1 新建canal server集群

登录canal admin管理界面,点‘集群管理’-‘新建集群’,指定zookeeper地址:

--若是zookeeper集群的话,格式如下:192.168.144.246:2181,192.168.144.247:2181,192.168.144.248:2181

2.3.2 配置canal server集群

在‘集群管理‘界面上点‘操作’-‘主配置’

点‘载入模板’,注意修改:

canal.zkServers =192.168.144.249:2181

canal.instance.global.spring.xml = classpath:spring/default-instance.xml

2.3.3 新建canal server

#主canal server

#备canal server

--新建canal instance的时候,记得选择所属集群,示例:

#从zookeeper里可以看到集群信息:

#从zookeeper上查看cc-test这个instance当前运行在哪个canal server上:

2.3.4 验证canal server高可用

关掉主canal server:

[root@Centos7-Mode-V7 conf]# sh /opt/canal-server/bin/stop.sh

Centos7-Mode-V7: stopping canal 7268 ...

Oook! cost:2

可以看到现在cc-test所属server变为从canal server了:

2.4 配置canal client高可用

2.4.1 修改application.yml

修改application.yml,注释掉canal server的ip:端口,设置zookeeper的ip:端口:

#canal.tcp.server.host: 192.168.144.248:11111

canal.tcp.zookeeper.hosts: 192.168.144.249:2181 #如果是集群,则以类似这样的格式进行配置:canal.tcp.zookeeper.hosts: 192.168.144.246:2181,192.168.144.247:2181,192.168.144.248:2181

然后重启canal client:

sh /opt/canal-client/bin/stop.sh

sh /opt/canal-client/bin/startup.sh

 

已验证当canal server宕机后,canal client会自动重连备用canal server,日志输出如下:

INFO  c.alibaba.otter.canal.client.impl.ClusterCanalConnector - restart the connector for next round retry.

--自定义canal client如何修改:

可以直接指定zookeeper地址和instance name,canal client会自动从zookeeper中的running节点,获取当前服务的工作节点,然后与其建立链接:

CanalConnector connector = CanalConnectors.newClusterConnector("10.20.144.51:2181", "example", "", "");

2.4.2 验证canal client高可用

查看目前哪个canal client在运行:

get /otter/canal/destinations/cc-test/1001/running

[zk: 127.0.0.1:2181(CONNECTED) 110] get /otter/canal/destinations/cc-test/1001/running

{"active":true,"address":"192.168.144.248:60660","clientId":1001}

cZxid = 0xcb1

ctime = Mon Apr 26 23:43:30 CST 2021

mZxid = 0xcb2

mtime = Mon Apr 26 23:43:31 CST 2021

pZxid = 0xcb1

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x178ff5d6d5b01c5

dataLength = 65

numChildren = 0

停掉主canal client:

sh /opt/canal-client/bin/stop.sh

可看到备用canal client开始订阅canal instance:

2021-04-27 22:25:32.229 [Thread-5] INFO  c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - =============> Subscribe destination: cc-test succeed <=============

 

通过在application.yml里指定zookeeper地址可以实现canal client的高可用。但是运行的canal client的配置文件的内容修改不会自动同步到另外一台canal client,需要在两台服务器上都配置下。

实验发现,只关掉canal admin后,canal仍能正常同步。但是假如canal admin关机了,且canal server发生了故障切换,会影响canal 同步,即使后来启动了canal admin,也不能,还得重启下当前的canal server节点。所以canal admin和canal server不要部署在同一台服务器上。

已验证canal client和admin同时宕掉,不影响同步。

 

--本篇文章主要参考自:https://github.com/alibaba/canal/wiki/AdminGuide的‘HA模式配置’部分。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值