canal 高可用介绍(4)

简介: 概述    这篇文章的目的是为了讲清楚canal的HA机制,至于什么是HA机制直接套用canal官网原话,因为我自认为没法描述的更好。而我直接从代码的角度去分析如何实现HA的,其实也就是zookeeper的分布式锁的使用方法。

概述

    这篇文章的目的是为了讲清楚canal的HA机制,至于什么是HA机制直接套用canal官网原话,因为我自认为没法描述的更好。而我直接从代码的角度去分析如何实现HA的,其实也就是zookeeper的分布式锁的使用方法。

    摘录自官网的一段原话:

    canal的HA分为两部分,canal server和canal client分别有对应的ha实现:

    canal server: 为了减少对mysql dump的请求,不同server上的instance要求同一时间只能有一个处于running,其他的处于standby状态。

    canal client: 为了保证有序性,一份instance同一时间只能由一个canal client进行get/ack/rollback操作,否则客户端接收无法保证有序。


canal HA 架构图

img_aab423c9f6fcd8f0362e4ac32b52d026.png
canal-ha说明图

说明

    图片来自官网的剪切,讲述的很清楚,就不再多说什么了,后面会基于这个图从代码角度展开讲解。


canal server HA

    canal server的HA是其实我觉得从我自己的理解应该分为两个角度去讲解,一个是在启动的时候抢占并负责启动提供服务,另外一个是在发生fail-over后抢占并负责启动提供服务。

    能把这两个过程讲解清楚我觉得就够了,就能理解server的HA机制了,也基本了解了如何通过zookeeper去实现互斥锁。

    最后我们需要问自己的一个问题,就是发生HA切换的时候状态数据同步在两个切换的server之间进行同步呢,很简单,因为我们的数据都是记录在zookeeper上的。


server 启动HA

    server在启动过程中,通过以下几步来实现抢占服务启动,入口类在CanalController。

    1、对临时节点(/otter/canal/destinations/xxxx/running)进行监听。

    2、通过创建临时节点来抢占锁,成功就提供服务。

    3、抢占锁成功后启动embededCanalServer开始提供服务。

    4、创建的临时节点内部将自己的ip+port暴露出去给client使用。


img_93e6c0dd0909aaee3140c1dac92e42a8.png
start-ha-1

说明

    启动服务的入口函数,别看是runningMonitor,其实是内部负责启动canal instance实例的。


img_269b2b86b934a162e8773783397d0caf.png
start-ha-2

说明

    这里最重要的一个点就是对canal的临时节点监控用于在fail-over的时候能够感知到并及时启动stand-by的canal server提供服务。


img_e3405e61ab4eb9287bcb3f77cad93e6e.png
start-ha-3

说明

    负责创建临时节点来确认自己是否能够提供服务,这其实通过zookeeper的特性来实现的。


img_98f44e67f5096b7d05f553caa846ae1a.png
start-ha-4

说明

    真正启动canal instance的过程,负责同步mysql的数据到canal instance。


server fail-over ha

    server 在fail-over过程能够及时发现并完成切换的原因是通过zookeeper的watch机制来实现,如果watch的节点消失了那么其他监听的canal server都能感知到并发起新一轮的抢占并提供服务。

    需要区分两个zookeeper事件,分别是节点内容变更事件、节点删除事件,下面有具体说明。

    关键字:zookeeper的watch机制,通知,重新抢占。

img_01de747073a42c6fc169a31d187c00a1.png
fail-over-1

说明

    这里区分了两种情况,节点内容变更事件、节点本身消失事件。对于这两种情况区分简单区分一下进行说明。我估计很多人跟我的疑惑一样,为啥要区分这两个事件呢,其实我的猜测是如果节点删除了说明这个服务停止了跟mysql的同步也就结束了,但是如果节点内容变更了,可能因为其他一些原因,譬如我们手动修改zk节点内容之类的,这个时候我们需要处理连接释放的过程。

    节点本身消失处理是handleDataDeleted函数内部的操作,可以看出来其实就做一件事情,重新开始新一轮的抢占,initRunning就是我们刚刚讲的抢占逻辑,可以翻看start-ha-3这个图片。唯一的区别是节点消失事件前提供服务的如果是自身就具有优先抢占的权利,否则就随机进行个delay操作避免同时大面积并发抢占。

    我们重点关注下节点内容变更的事件吧,之所以需要额外关注这个事件是因为中间涉及到如果是如果变更前是自身就需要释放连接资源。


资源释放过程

img_f55366398e6b93b5e75f433b00e1d6f3.png
canal server release - 1

说明

    在收到节点内容变更事件后就开始进入资源释放过程

img_311d8f9c1156cb1874f4119dcf8f5378.png
canal server release - 2

说明

    停止canal的embededCanalserver的服务,结束从mysql的数据同步。


canal client HA

    整体来说,canal client的HA和canal server的HA机制是一模一样的,它的实现逻辑其实在创建cluster client的时候用的封装zookeeper的客户端,然后zookeeper的客户端去检测canal server节点内容的变化并重新初始化连接而已。


img_203884e8e5f7f14d34458d8e452133ce.png
client cluster -1

说明

    这个地方很明显看出来,我们首先连接的zookeeper,原因应该很清楚,因为我们需要从zookeeper获取提供服务的canal server的地址,在/otter/canal/destinations/destination/running节点去获取。


img_5638c1203646caa45d02b50dac0ddc12.png
client cluster-2
img_ea77bfdd65af857faa492fd3e70bccc4.png
client cluster-3

说明

    这部分其实就是client和zookeeper交互的部分,负责实时感知节点变化并重新初始化连接,保证client端的HA。

目录
相关文章
|
开发工具 git
从 github 执行 git clone 一个大的项目时提示 error: RPC failed
目前克隆一个比较大的项目,出现RPC failed的错误 Cloning into 'bigfiles'... remote: Counting objects: 190, done. remote: Compressing objects: 100% (157/157), done.
4875 0
|
存储 负载均衡 架构师
Nginx极简入门(七)Nginx的日志管理及配置
前面讲了如何配置Nginx虚拟主机和Nginx负载均衡。我们知道日志对于Nginx非常重要。今天要说的是如何配置Nginx的日志。
Nginx极简入门(七)Nginx的日志管理及配置
|
4月前
|
Arthas Java 测试技术
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
线上 CPU 飙高却不知道瓶颈在哪?一张 Arthas Profiler 火焰图采样定位,横宽即热点,一眼锁定最该优化的函数
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
|
10月前
|
运维 安全 Linux
【运维实战】企业级 NFS 文件共享服务 · 一键自动化部署方案 (龙蜥/银河麒麟 V10 /openEuler /CentOS)
面向国产化替代需求,阜阳云动科技推出企业级NFS一键部署脚本,支持银河麒麟V10、openEuler、CentOS、龙蜥等主流系统。实现多部门隔离、权限可控、跨平台兼容的文件共享服务,自动化创建用户、目录与客户端挂载脚本,显著提升部署效率与安全性。开箱即用,助力政企高效构建安全稳定的NFS共享环境。
1082 1
【运维实战】企业级 NFS 文件共享服务 · 一键自动化部署方案 (龙蜥/银河麒麟 V10 /openEuler /CentOS)
|
人工智能 文字识别 自然语言处理
阿里云百炼产品月刊【2025年6月】
阿里云百炼平台6月推出多项更新与活动,涵盖Agent市场、多模态交互开发套件、新模型上线及商业化调整。新增100+开箱即用Agent模板,支持多行业多场景应用;推出通义多模态交互开发套件,提升全场景适配能力;联合支付宝推出Agent赞赏功能,助力创意变现;新上架text-embedding-v4、deepseek-r1-0528、qvq系列视觉推理模型等,并对qwen-plus、qwen-turbo等模型进行迭代升级。同时,部分历史模型将于7月下线,建议用户及时调整应用。更多详情请查看官网公告。
1517 0
|
Linux Windows
远程桌面复制粘贴用不了?3个简单操作,立即恢复
远程桌面复制粘贴失灵?别急!本文三步教你快速修复:检查本地粘贴板共享设置、重启服务器rdpclip.exe进程,并重新启动该进程恢复功能。附常见问题与注意事项,轻松解决传输中断、大文件卡顿等问题,提升远程操作效率。
3982 8
|
存储 网络安全 数据安全/隐私保护
docker 安装gitlab,配置邮件,备份全流程
docker 安装gitlab,配置邮件,备份全流程
945 0
|
运维 Serverless 云计算
Serverless,云计算3.0阶段
Serverless是一种云计算服务模式,让开发者只需专注于编写业务逻辑代码,无需管理底层基础设施如服务器、存储和网络。相比传统Serverful架构,Serverless降低了运维成本,提高了开发效率,并通过弹性伸缩应对流量峰谷,按实际资源消耗付费,显著降低资源浪费和费用开销。
861 5
Serverless,云计算3.0阶段
深入浅出阿里数据同步神器:Canal原理+配置+实战全网最全解析!
canal 翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
|
SQL 算法 Java
(二十六)MySQL分库篇:Sharding-Sphere分库分表框架的保姆级教学!
前面《MySQL主从原理篇》、《MySQL主从实践篇》两章中聊明白了MySQL主备读写分离、多主多写热备等方案,但如果这些高可用架构依旧无法满足业务规模,或业务增长的需要,此时就需要考虑选用分库分表架构。
8313 4

热门文章

最新文章