摘要:协议是为分布式协调服务专门设计的一种支持崩溃恢复的一致性协议,这个机制保证了各个之间的同步。选主是协议中最为重要和复杂的过程。以实际效果而言,分区相当于对通信的时限要求。参考官方文档阿里巴巴为什么不用做服务发现定理的含义阮一峰
前言
同学们,在上一章中,我们主要讲了Zookeeper两种启动模式以及具体如何搭建。本章内容主要讲的是集群相关的原理内容,第一章可以当做是Zookeeper原理篇的基础部分,本章则是Zookeeper原理篇进阶部分,有关于Zookeeper集群的读写机制、ZAB协议的知识解析。
本篇的内容主要包含以下几点:
Zookeeper 集群架构
Zookeeper 读写机制
ZAB协议
关于Zookeeper 集群的一些其他讨论
Zookeeper(读性能)可伸缩性 和 Observer节点
Zookeeper 与 CAP 理论
Zookeeper 作为 服务注册中心的局限性
一、Zookeeper 集群架构接下来我们来说一说Zookeeper的集群架构。
Zookeeper 集群中的角色第一章提过,Zookeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。
Leader 领导者 :Leader 节点负责Zookeeper集群内部投票的发起和决议(一次事务操作),更新系统的状态;同时它也能接收并且响应Client端发送的请求。
Learner 学习者
Follower 跟随者 : Follower 节点用于接收并且响应Client端的请求,如果是事务操作,会将请求转发给Leader节点,发起投票,参与集群的内部投票,
Observer 观察者:Observer 节点功能和Follower相同,只是Observer 节点不参与投票过程,只会同步Leader节点的状态。
Client 客户端
Zookeeper 通过复制来实现高可用。在上一章提到的集群模式(replicated mode)下,以Leader节点为准,Zookeeper的ZNode树上面的每一个修改都会被同步(复制)到其他的Server 节点上面。
上面实际上只是一个概念性的简单叙述,在看完下文的读写机制和ZAB协议的两种模式之后,你就会对这几种角色有一个更加深刻的认识。二、Zookeeper 读写机制 读写流程
下图就是集群模式下一个Zookeeper Server节点提供读写服务的一个流程。
如上图所示,每个Zookeeper Server节点除了包含一个请求处理器来处理请求以外,都会有一个内存数据库(ReplicatedDatabase) 用于持久化数据。ReplicatedDatabase 包含了整个Data Tree。
来自于Client的读服务(Read Requst),是直接由对应Server的本地副本来进行服务的。
至于来自于Client的写服务(Write Requst),因为Zookeeper要保证每台Server的本地副本是一致的(单一系统映像),需要通过一致性协议(后文提到的ZAB协议)来处理,成功处理的写请求(数据更新)会先序列化到每个Server节点的本地磁盘(为了再次启动的数据恢复)再保存到内存数据库中。
集群模式下,Zookeeper使用简单的同步策略,通过以下三条基本保证来实现数据的一致性:
全局串行化所有的写操作
串行化可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据。
保证同一客户端的指令被FIFO执行(以及消息通知的FIFO)
FIFO -先入先出
自定义的原子性消息协议
简单来说,对数据的写请求,都会被转发到Leader节点来处理,Leader节点会对这次的更新发起投票,并且发送提议消息给集群中的其他节点,当半数以上的Follower节点将本次修改持久化之后,Leader 节点会认为这次写请求处理成功了,提交本次的事务。
乐观锁Zookeeper 的核心思想就是,提供一个非锁机制的Wait Free 的用于分布式系统同步的核心服务。其核心对于文件、数据的读写服务,并不提供加锁互斥的服务。
但是由于Zookeeper的每次更新操作都会更新ZNode的版本(详见第一章),也就是客户端可以自己基于版本的对比,来实现更新数据时的加锁逻辑。例如下图。
就像我们更新数据库时,会新增一个version字段,通过更新前后的版本对比来实现乐观锁。
三、ZAB协议终于到了ZAB协议,讲述完ZAB协议,大家对Zookeeper的一些特性会有更深的体会,对本文的其他内容也会有更透彻的理解。
ZAB 协议是为分布式协调服务ZooKeeper专门设计的一种支持崩溃恢复的一致性协议,这个机制保证了各个server之间的同步。全称 Zookeeper Atomic Broadcast Protocol - Zookeeper 原子广播协议。
两种模式Zab协议有两种模式,它们分别是恢复模式和广播模式。
广播模式广播模式类似于分布式事务中的 Two-phase commit (两阶段式提交),因为Zookeeper中一次写操作就是被当做一个事务,所以这实际上本质是相同的。
在广播模式,一次写请求要经历以下的步骤
ZooKeeper Server接受到Client的写请求
写请求都被转发给Leader节点
Leader节点先将更新持久化到本地
Leader节点将此次更新提议(propose)给Followers,进入收集选票的流程
Follower节点接收请求,成功将修改持久化到本地,发送一个ACK给Leader
Leader接收到半数以上的ACK时,Leader将广播commit消息并在本地deliver该消息。
当收到Leader发来的commit消息时,Follower也会deliver该消息。
广播协议在所有的通讯过程中使用TCP的FIFO信道,通过使用该信道,使保持有序性变得非常的容易。通过FIFO信道,消息被有序的deliver。只要收到的消息一被处理,其顺序就会被保存下来。
但是这种模式下,如果Leader自身发生了故障,Zookeeper的集群不就提供不了写服务了吗?这就引入了下面的恢复模式。
恢复模式简单点来说,当集群中的Leader故障或者服务启动的时候,ZAB就会进入恢复模式,其中包括Leader选举和完成其他Server和Leader之间的状态同步。
NOTE:选主是ZAB协议中最为重要和复杂的过程。这里面的概念知识较多,放在本章一起讲反而不利于理解本章的知识,所以我打算在下一章多带带介绍,同学们可以选择性地食用。关于Zookeeper 集群的一些其他讨论 1. Zookeeper(读性能)可伸缩性 和 Observer节点
一个集群的可伸缩性即可以引入更多的集群节点,来提升某种性能。Zookeeper实际上就是提供读服务和写服务。在最早的时候,Zookeeper是通过引入Follower节点来提升读服务的性能。但是根据我们之前学习过的读写机制和ZAB协议的内容,引入新的Follower节点,会造成Zookeeper 写服务的下降,因为Leader发起的投票是要半数以上的Follower节点响应才会成功,你Follower多了,就增加了协议中投票过程的压力,可能会拖慢整个投票响应的速度。结果就是,Follower节点增加,集群的写操作吞吐会下降。
在这种情况下,Zookeeper 在3.3.3版本之后,在集群架构中引入了Observer角色,和Follower唯一的区别的就是不参与投票不参与选主。这样既提升了读性能,又不会影响写性能。
另外提一句,Zookeeper的写性能是不能被扩展的,这也是他不适合当做服务注册发现中心的一个原因之一,在服务发现和健康监测场景下,随着服务规模的增大,无论是应用频繁发布时的服务注册带来的写请求,还是刷毫秒级的服务健康状态带来的写请求,都会Zookeeper带来很大的写压力,因为它本身的写性能是无法扩展的。后文引的文章会详细介绍。
2. Zookeeper 与 CAP 理论分布式领域中存在CAP理论:
C:Consistency,一致性,数据一致更新,所有数据变动都是同步的。
A:Availability,可用性,系统具有好的响应性能。
P:Partition tolerance,分区容错性。以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择,也就是说无论任何消息丢失,系统都可用。
CAP 定理的含义 -- 阮一峰
该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾。 因此,将精力浪费在思考如何设计能满足三者的完美系统上是愚钝的,应该根据应用场景进行适当取舍。
根据我们前面学习过的读写机制和ZAB协议的内容,Zookeeper本质应该是一个偏向CP的分布式系统。因为广播协议本质上是牺牲了系统的响应性能的。另外从它的以下几个特点也可以看出。也就是在第一章最后提出的几个特点。
① 顺序一致性3. Zookeeper 作为 服务注册中心的局限性
从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到ZooKeeper中。② 原子性
所有事务请求的结果在集群中所有机器上的应用情况是一致的,也就是说要么整个集群所有集群都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。③ 单一视图
无论客户端连接的是哪个ZooKeeper服务器,其看到的服务端数据模型都是一致的。④ 可靠性
一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更。
直接引一篇阿里中间件的文章吧,讲的比我好。实际在生产情况下,大多数公司没有达到像大公司那样的微服务量级,Zookeeper是完全能满足服务注册中心的需求的。
阿里巴巴为什么不用 ZooKeeper 做服务发现?总结
本章主要介绍了Zookeeper的集群架构,详述了ZK的几种角色和组件,还介绍了Zookeeper的读写机制和最核心的ZAB协议,最后对其他一些比较杂的知识点统一归在一起讨论了一下。
本章的知识我本人认为信息量还是蛮大的,整理完之后我自己对Zookeeper集群服务的机制原理有了更深的体会。阅读时最好能够结合第一章的一些基础概念,这样更有助于理解,让知识点前后呼应。希望能对你理解Zookeeper起到帮助。
下一章我会详细介绍本章未介绍的Zookeeper选主过程(Leader Election)。
参考[1] [2] 阿里巴巴为什么不用 ZooKeeper 做服务发现? [3] https://www.cnblogs.com/sundd... [4] CAP 定理的含义 -- 阮一峰
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77644.html
摘要:之后服务器等待其他服务器的反馈,一旦超过半数的服务器进行了正确的反馈,那么就会再次向所有的服务器分发消息,要求其将前一个进行提交。协议包括两种基本的模式,分别是崩溃恢复和消息广播。 前言 zookeeper本质上就是一个分布式协调服务,用来解决分布式一致性的问题。 本文适合有一定分布式基础的读者阅读。什么叫相关的基础呢?起码你得知道系统架构为何从集中式演变成了分布式,分布式有哪些优点...
摘要:的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。具有不可分割性即原语的执行必须是连续的,在执行过程中不允许被中断。 该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识)。地址:https://github.com/Snailclimb... showImg(https:...
摘要:本章内容主要讲的是集群搭建相关的知识。在集群模式下,最少需要三个节点。并且官方推荐你使用奇数数量的节点来组成集群。这个值必须是集群中唯一的。在确认每台服务器上的和文件修改创建之后,在三个节点上分别执行命令,启动。 前言 同道们,好久不见,上一章中,我主要讲了Zookeeper的一些基础的知识点。数据模型 + 原语集 + Watches机制。本章内容主要讲的是集群搭建相关的知识。 本篇的...
摘要:只允许有一个主进程接受客户事务请求并处理,收到请求后,将其转化为事务。并开启新一轮选举,新的会和过半的进行同步数据。同步结束时,切换为消息广播模式。若非节点收到客户请求,则该节点会将该请求发送到服务器上。 zookeeper 它为分布式应用提供了高效可靠的分布式协调服务。 实现依赖于 ZAB协议,实现了主备模式架构用来保持集群中数据的一致性 Zookeeper 将所有数据存放在 内存...
摘要:当已经超过个心跳的时间也就是长度后服务器还没有收到客户端的返回信息那么表明这个客户端连接失败。 基础篇 1、zookeeper是什么 Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,应用于分布式应用的协作服务,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。...
阅读 2011·2023-04-26 00:16
阅读 3456·2021-11-15 11:38
阅读 3125·2019-08-30 12:50
阅读 3161·2019-08-29 13:59
阅读 736·2019-08-29 13:54
阅读 2465·2019-08-29 13:42
阅读 3285·2019-08-26 11:45
阅读 2169·2019-08-26 11:36