一 canal HA架构
canal server HA实现流程
- canal server 要启动某个 canal instance 时都先向 zookeeper 进行一次尝试启动判断 (实现:创建 EPHEMERAL 节点,谁创建成功就允许谁启动);
- 创建 zookeeper 节点成功后,对应的 canal server 就启动对应的 canal instance,没有创建成功的 canal instance 就会处于 standby 状态;
- 一旦 zookeeper 发现 canal server A 创建的节点消失后,立即通知其他的 canal server 再次进行步骤1的操作,重新选出一个 canal server 启动instance;
- 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模式配置’部分。