zookeeper 学习
1):ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名
服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使
用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态
2):主观理解:一个集群分享一份数据,并且每个可以接入到zookeeper的客户端提供数据(权限允许的情况下)和在数据改变的情况下通知所有连接的客户端
,为了便于处理和操作数据,此处的客户端一般由java程序接入,来处理复杂的逻辑,这里的一份数据是以节点的形式存储的而且储存的形式是二进制流的形式,所以可以这
样理解这份数据,它是相当于key-value形式的数据,其中节点值为key,节点数据为value,但是比一般的键值对形式存储数据高级的地方有四点:
· (1):类似文件形式的存储结构关系,父节点可以获取子节点
(2):以byte流形式存储,也就意味着可以存储任何形式的数据,只是为了保证效率默认存储1M大小的数据,zookeeper只是致力于管理集群,节点只是存储少
许关键配置数据,所以1M足够使用
(3):拥有权限控制,zookeeper提供ac访问权限控制
(4):能提供分布式应用所需要的高级功能,列如:事务锁
1:zookeeper的角色
1):领导者(leader):领导者负责投票的发起和决定
2):学习者(Learner)
(1):追随者(follower)follower用于接收客户端请求并向客户端返回结果,在选主过程中进行投票
(2):观察者(observer)observer可以接收客户端连接,将写请求发送给leader节点,但Observer不参与投票过程,只同步leader的状态
Observer的目的是为了扩展系统,提高读取速度
(3):客户端(client)请求发起方
2:设计的目的
1):最终一致性:client不论连着哪个server,展示给他的都是同一个视图,这是zookeeper最重要的性能
2):可靠性:具有简单、健壮、良好的性能,如果消息m被一台服务器接收,那么它将被所有服务器接收
3):实时性:Zookeeper保证客户端在一个时间间隔内获取服务器更新信息,或者服务器失败信息,但由于网络延时等因素,Zookeeper不能保证两台
客户端在同时得到刚更新的数据,如果需要最新的数据,应该在被调用前sync()接口
4):等待无关:慢的或者无效的client不得干预有效client的请求,使得每个client都能有效的等待
5):原子性:更新只能成功或者失败,没有中间状态
6):顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b之前发送,则在所有server中消息a都在消息b之前发送,偏序
是指如果消息b在消息a后被同一发送者发布,a必将在b之前
3:zookeeper的工作原理
1):Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢
复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader
的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
2):为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实
现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那
个leader的统治时期。低32位用于递增计数。
3):每个server在工作过程中有三种状态
1):LOOKING:当server不知道leader是谁之前,进行搜索
2):LEADING:当前server即为选举出来的leader
3):FOLLOWING:leader应经被选举出来,当前server进行同步
4):选主流程 :Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。
先介绍basic paxos流程:
1):选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
2 ):选举线程首先向所有Server发起一次询问(包括自己);
3 ):选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最
后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
4 ):收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
5 ):线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的
leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。
5):同步流程 :选完leader以后,zk就进入状态同步过程。
1):leader等待server连接;
2 ):Follower连接leader,将最大的zxid发送给leader;
3 ):Leader根据follower的zxid确定同步点;
4 ):完成同步后通知follower 已经成为uptodate状态;
5 ):Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
6):Leader的工作流程 Leader主要有三个功能
1):恢复数据;
2 ):维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3 ):Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对
提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。
7):Follower的工作原理
1):Follower主要有四个功能:
(1):向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
(2):接收Leader消息并进行处理;
(3):接收Client的请求,如果为写请求,发送给Leader进行投票;
(4):返回Client结果。
2):Follwer的消息循环处理
(1):PING消息: 心跳消息;
(2):PROPOSAL消息:Leader发起的提案,要求Follower投票;
(3):COMMIT消息:服务器端最新一次提案的信息;
(4):UPTODATE消息:表明同步完成;
(5):REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
(6):SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。