1、zookeeper与zab协议

2019-05-01  本文已影响0人  小manong
一、初识zk
1、概述

原语:操作系统或计算机网络用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程。具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。

2、特点

顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
原子性:更新只能成功或者失败,没有中间状态。
单一视图(无论客户端连接的哪一个zk服务器,其看到的服务端数据模型是一样的)
可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
实时性(一定时间内保证可以读取到最新值)

3、zk设计目标

(1)目标一:简单的数据模型

zk使得分布式程序能够通过一个共享的、树形结构的命名空间进行相互协调。(这里的树形结构,指zk服务器内存中的一个数据模型,由一些列被称为ZNode的数据节点组成)。zk将全量数据存储在内存中,以此来提高服务器吞吐、减少延时的目的。

zk存储结构

(2)可以构建集群

一个zk服务器集群通常由一组机器组成,一般3-5台机器就可以组成一个可用的zk集群了。组成zk集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器都互相保持着通信。只要集群中存在超过一般的机器能够正常工作,那么整个集群就能正常保持服务。

zk架构图

(3)顺序访问

来自客户端的每一个版本请求,zk都会分配一个全局唯一的递增编号,这个编号表示了所有事物操作的先后顺序

(4)高性能

zk将全量数据存储在内存中,并直接服务于客户端的所有非事物请求,适用于读操作为主的应用场景。根据有关资料显示压测可达到12-13W的qps。

4、zk基本概念

(1)集群模式:zk引入leader、follower和observer三个角色。通过选举产生leader机器,leader服务器为客户端提供读和写服务;follower和observer都能提供读服务,但是observer不参与选举。
(2)会话session:在zk中,一个客户端连接是指客户端和服务端的一个TCP长连接。对外默认端口是2181,客户端启动的时候,首先会和服务端建立一个TCP连接,从第一次建立开始,客户端会话的生命周期也就开始了,通过这个连接,客户端能够通过心跳检测与服务端保持有效的会话,也能够向zk服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的watch事件通知;session的sessionTimeout用来设置一个客户端会话的超时时间,由于为止原因,导致客户端连接断开,只要sessionTimeout规定的时间内能够重新连上集群中任意一台服务器,那么之前创建的会话仍然有效。
(3)数据节点ZNode:zk中数据节点指数据模型中的数据单元ZNode。数据模型是一颗树,保存在内存中,由\进行分割的路径,就是一个ZNode;在每一个ZNode上都会保存自己的数据内容,同时会保存一些列的属性信息。

1、持久性节点:指一旦这个ZNode被创建,除非主动进行ZNode移除操作,否则这个ZNode将一直保存在zk中
2、临时节点:生命周期和客户端会话绑定,一旦客户端会话失效,这个客户端创建的所有临时节点都会被移除。

(4)版本:对应于每一个ZNode,zk会为其维护一个叫做stat的数据结构,stat中记录了这个ZNode的三个数据版本,分别是version(当前ZNode版本)、cversion(当前ZNode子节点版本)和aversion(当前ZNode的ACL版本)
(5)Watcher:watche(事件监听器)是zk一个重要的特性,zk允许用户在指定的节点上注册一些东watcher,并且在一些特定的事件触发的时候,zk服务端会将事件通知感兴趣的客户端上去,该机制是zk实现分布式协调的重要特性。
(6)ACL:zk采用ACL来进行权限控制,zk定义了五种权限(create创建子节点、read获取节点数据和子节点列表、write更新节点数据、delete删除子节点、admin设置节点ACL)

5、小结

(1)ZooKeeper是一个开源的分布式协调服务,提供了分布式数据一致性的解决方案。
(2)ZooKeeper 本身就是一个分布式程序(只要半数以上节点存活,ZooKeeper 就能正常服务),构建zk集群时候节点个数必须大于1且是奇数。
(3)ZooKeeper 将数据保存在内存中,这也就保证了 高吞吐量和低延迟(但是内存限制了能够存储的容量不太大,此限制也是保持znode中存储的数据量较小的进一步原因)。
(4)ZooKeeper 是高性能的。 在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)
(5)ZooKeeper有临时节点的概念。
(6)ZooKeeper 底层其实只提供了两个功能:①管理(存储、读取)用户程序提交的数据;②为用户程序提交数据节点监听服务。

二、ZAB协议

1、ZAB协议与paxos协议关系

ZAB协议的开发设计人员在协议设计之初并没有要求其具有很好的扩展性,最初只是雅虎公司内部哪些高吞吐、低延迟、健壮、简单的分布式系统场景设计的,因此ZAB协议并不想paxos协议那样,是一种通用的分布式一致性算法,是一种特别为zk设计的奔溃可恢复的原子消息广播算法。

2、ZAB协议的核心

所有事物的请求必须由一个全局的唯一的服务器来协调处理,这样的服务器称为leader服务器,余下的服务器称为follow服务器。leader服务器负责将一个客户端请求转换为一个(事物)proposal提议,并将该提议分发到集群中所有的follow服务器。之后leader服务器等待follow服务器的反馈,一旦超过半数的follow服务器进行了正确的反馈后,leader服务器将再次向所有的follow服务器分发commit请求,要求将前一个proposal进行提交。

3、ZAB协议基本模式(崩溃恢复和消息广播)

(1)崩溃恢复:当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进人恢复模式并选举产生新的Leader服务器。当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该Leader服务器完成了状态同步之后,ZAB协议就会退出恢复模式。其中,所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致。
(2)消息广播:当集群中已经有过半的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进人消息广播模式了。 当一台同样遵守ZAB协议的服务器启动后加人到集群中时,如果此时集群中已经存在一个Leader服务器在负责进行消息广播,那么新加人的服务器就会自觉地进人数据恢复模式:找到Leader所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。正如上文介绍中所说的,ZooKeeper设计成只允许唯一的一个Leader服务器来进行事务请求的处理。Leader服务器在接收到客户端的事务请求后,会生成对应的事务提案并发起一轮广播协议;而如果集群中的其他机器接收到客户端的事务请求,那么这些非Leader服务器会首先将这个事务请求转发给Leader服务器。

三、zk原理探究

1、zk角色概念
zk集群结构图
2、zk的读写机制
3、zk节点数据操作流程
zk数据节点操作流程

1.在Client向Follwer发出一个写的请求
2.Follwer把请求发送给Leader
3.Leader接收到以后开始发起投票并通知Follwer进行投票
4.Follwer把投票结果发送给Leader
5.Leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给follow,然后commit;
6.Follwer把请求结果返回给Client

4、zk选举

以一个简单的例子来说明整个选举的过程:假设有五台服务器组成的 zookeeper 集群,它们 的 serverid 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点 上,都是一样的。假设这些服务器依序启动,来看看会发生什么
  1、服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的 选举状态一直是 LOOKING 状态
  2、服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于 两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持 LOOKING 状态
  3、服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1,2,3 中的老大,而与上面不 同的是,此时有三台服务器(超过半数)选举了它,所以它成为了这次选举的 leader
  4、服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1,2,3,4 中最大的,但是 由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命了
  5、服务器 5 启动,同 4 一样,当小弟

(2)奔溃恢复时候的选举。

5、zid概念
6、zk状态同步流程
zk状态同步流程图
  1. Leader等待server连接;
    2 .Follower连接leader,将最大的zxid发送给leader;
    3 .Leader根据follower的zxid确定同步点;
    4 .完成同步后通知follower 已经成为uptodate状态;
    5 .Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
7、zk中leader工作机制
zk中leader的工作流程

1 .恢复数据;
2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3 .Learner的消息类型主要有PING消息(Learner的心跳信息)、REQUEST消息(Follower发送的提议信息,包括写请求及同步请求)、ACK消息( Follower的对提议的回复,超过半数的Follower通过,则commit该提议)、REVALIDATE消息(用来延长SESSION有效时间),根据不同的消息类型,进行不同的处理。

8、 follow的工作机制
follow工作机制

1.向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2.接收Leader消息并进行处理;
3.接收Client的请求,如果为写请求,发送给Leader进行投票;
4.返回Client结果。

9、Observer工作机制
10、zk中保证事物的顺序性

参考:
《从Paxos到Zookeeper 》
https://segmentfault.com/a/1190000016349824
https://blog.csdn.net/xqb_756148978/article/details/52259381
https://www.cnblogs.com/qingyunzong/p/8632995.html#_label4_4
https://blog.csdn.net/qq_22094297/article/details/80692624

上一篇下一篇

猜你喜欢

热点阅读