canal 高可用介绍(4) - 简书


本站和网页 https://www.jianshu.com/p/0f580647905c 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

canal 高可用介绍(4) - 简书登录注册写文章首页下载APP会员IT技术canal 高可用介绍(4)晴天哥_王志关注赞赏支持canal 高可用介绍(4)系列
canal 组件介绍(1)canal 启动介绍(2)canal 数据消费介绍(3)canal 高可用介绍(4)canal源码解析(2)—位点的实现概述    这篇文章的目的是为了讲清楚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 架构图
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使用。
start-ha-1
说明    启动服务的入口函数,别看是runningMonitor,其实是内部负责启动canal instance实例的。
start-ha-2
说明    这里最重要的一个点就是对canal的临时节点监控用于在fail-over的时候能够感知到并及时启动stand-by的canal server提供服务。
start-ha-3
说明    负责创建临时节点来确认自己是否能够提供服务,这其实通过zookeeper的特性来实现的。
start-ha-4
说明    真正启动canal instance的过程,负责同步mysql的数据到canal instance。server fail-over ha    server 在fail-over过程能够及时发现并完成切换的原因是通过zookeeper的watch机制来实现,如果watch的节点消失了那么其他监听的canal server都能感知到并发起新一轮的抢占并提供服务。    需要区分两个zookeeper事件,分别是节点内容变更事件、节点删除事件,下面有具体说明。    关键字:zookeeper的watch机制,通知,重新抢占。
fail-over-1
说明    这里区分了两种情况,节点内容变更事件、节点本身消失事件。对于这两种情况区分简单区分一下进行说明。我估计很多人跟我的疑惑一样,为啥要区分这两个事件呢,其实我的猜测是如果节点删除了说明这个服务停止了跟mysql的同步也就结束了,但是如果节点内容变更了,可能因为其他一些原因,譬如我们手动修改zk节点内容之类的,这个时候我们需要处理连接释放的过程。    节点本身消失处理是handleDataDeleted函数内部的操作,可以看出来其实就做一件事情,重新开始新一轮的抢占,initRunning就是我们刚刚讲的抢占逻辑,可以翻看start-ha-3这个图片。唯一的区别是节点消失事件前提供服务的如果是自身就具有优先抢占的权利,否则就随机进行个delay操作避免同时大面积并发抢占。    我们重点关注下节点内容变更的事件吧,之所以需要额外关注这个事件是因为中间涉及到如果是如果变更前是自身就需要释放连接资源。资源释放过程
canal server release - 1
说明    在收到节点内容变更事件后就开始进入资源释放过程
canal server release - 2
说明    停止canal的embededCanalserver的服务,结束从mysql的数据同步。canal client HA    整体来说,canal client的HA和canal server的HA机制是一模一样的,它的实现逻辑其实在创建cluster client的时候用的封装zookeeper的客户端,然后zookeeper的客户端去检测canal server节点内容的变化并重新初始化连接而已。
client cluster -1
说明    这个地方很明显看出来,我们首先连接的zookeeper,原因应该很清楚,因为我们需要从zookeeper获取提供服务的canal server的地址,在/otter/canal/destinations/destination/running节点去获取。
client cluster-2
client cluster-3
说明    这部分其实就是client和zookeeper交互的部分,负责实时感知节点变化并重新初始化连接,保证client端的HA。推荐阅读更多精彩内容Spring CloudSpring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...卡卡罗2017阅读 131,393评论 18赞 138canal(基于mysql数据库binlog的增量订阅&消费)一、背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务...献给记性不好的自己阅读 44,999评论 3赞 404-Zookeeper 原理介绍Zookeeper 原理 Zookeeper的基本概念 角色 Zookeeper中的角色主要有以下三类,如下表所示...史路比阅读 638评论 0赞 7[canal]基于mysql binlog的增量订阅&消费--阿里巴巴开源项目Spark实时统计订单量 - 简书http://www.jianshu.com/p/3ec093a9d584 注:...葡萄喃喃呓语阅读 5,041评论 0赞 1时间管理是门技术活我始终相信,每个人对于生命都是积极的。每一个人的诞生都是美好的,每一个人都始终在成长。 每一个人的心中都住着一个更...不屈的信念0_0阅读 377评论 0赞 0白马王爷静寂的天空 依旧有我记忆的翅膀 行将消失的那道彩虹 是我曾经的泪水折射出的光芒 当我不再相信白天属于太阳 当我不再...行人a阅读 126评论 0赞 3被谷歌苹果等巨头垄断真的不好吗? 如果一说到垄断,我们会不会一下想到几桶油对高油价的垄断,想起洛克菲勒笑称的我一睁眼,旁边都是求我的人。我们是否也...阿德尔布鲁斯阅读 462评论 1赞 1多少年后成了别人站在路口 回望时 满目荆棘 路在何方 早知道 那只是一场无缘的邂逅 那时就应该按住心中的悸动 只是过客 何须马蹄声...果果1986阅读 130评论 0赞 0随手拍其四 苏州园林,天下闻名,拙政园可谓其首,有幸一览风采,冬天去也别有一番风味。秦简notes阅读 190评论 0赞 2评论4赞77赞8赞1赞赏更多好文