《ZooKeeper读书笔记》
1、Zookeeper是什么?
Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。Zookeeper可以保证如下分布式一致性特性。
顺序一致性:
原子性:
单一视图:集群中只有一个被称为Leader服务器的机器可以处理来自客户端的事务请求。
实时性:
2、会话Session:
Session是指客户端会话,在zookeeper中,一个客户端连接是指客户端和服务器之间的一个TCP长连接。zookeeper对外的服务端口是2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次建立连接开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向zookeeper服务器发送请求并接收响应,同时还能够通过该连接接收来自服务器的Watch事件通知。
3、ZAB协议(Zookeeper Atomic BroadCast):
ZAB Zookeeper原子消息广播协议,是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。在zookeeper中主要依赖ZAB协议来实现分布式数据一致性,基于该协议,zookeeper实现了一种主备模式的系统架构来保持集群中各个副本直接的数据的一致性。zookeeper使用一个单一的主进程来接收来自客户端的所有事务请求,并采用ZAB的原子广播协议,将服务器数据的状态变更以事务Proposal的形式广播到所有的副本进程上去。
4、ZAB协议的核心:是定义了对于那些会改变zookeeper服务器数据状态的事务请求的处理方式,即:所有事务请求都必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而余下的服务器被称为Follower服务器,Leader服务器负责将一个客户端事务请求转换成一个事务Proposal提议,并将该Proposal分发给集群中的所有Follower服务器。之后Leader服务器需要等待所有Follower服务器的反馈,只要有一半的Follower服务器反馈了该Proposal提议,那么Leader服务器就会再次向所有的Follower服务器发送Commit消息,要求其将前一个Proposal进行提交。
Zookeeper使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用ZAB协议将服务器数据的状态变更以事务Proposal的形式广播到所有的副本进程上去。
5、ZAB协议的两种模式:崩溃恢复和消息广播。
5.1 崩溃恢复:当整个服务框架在启动过程中,或是当Leader服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB协议就会进入到崩溃恢复模式并选举出新的Leader服务器。
5.2 消息广播:当集群中已经有过半的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进入到消息广播模式了。如果集群中的Follower服务器接收到客户端的事务请求,并不会自己去处理该事务请求,而是首先将这个请求转发给Leader服务器,由Leader服务器生成对应的事务提案并发起一轮广播协议。
在整个消息广播的过程中,Leader服务器会为每个事务请求生成对应的Proposal来进行广播,并且在广播事务Proposal之前,Leader服务器会首先为这个事务Proposal分配一个全局单调递增的唯一ID,我们称之为事务ID,即ZXID。由于ZAB协议首先需要保证每一个消息严格的因果关系,因此必须将每一个事务Proposal按照其ZXID的先后顺序进行排序和处理。
具体的,在消息广播过程中,Leader服务器会为每一个Follower服务器都各自分配一个单独的队列。然后将需要广播的事务Proposal一次放入到这些队列中去,并且根据FIFO策略进行消息分发。每一个Follower服务器在接收到这个事务Proposal后,都会首先将其以事务日志的形式写入到本地磁盘中去,并且在成功写入后反馈给Leader服务器一个Ack响应。当Leader服务器接收到过半的Follower服务器的Ack响应后,就会广播一个Commit消息给所有的Follower服务器以通知其对事务进行提交,同时Leader服务器自身也会完成对事务的提交,而每一个Follower服务器在接收到Commit之后,也会完成对事务的提交。
6、选举算法:
要求:能够确保提交已经被Leader服务器提交的事务Proposal,同时丢弃掉已经被跳过的事务Proposal。
针对这个要求,如果让Leader选举算法能够保证新选举出来的Leader服务器拥有集群中所有机器最高的编号(即ZXID最大)的事务Proposal,那么就可以保证这个新选举出来的Leader一定具有所有已经提交的提案。更为重要的是,如果让具有最高编号事务Proposal的机器称为Leader,就可以省去Leader服务器检查Proposal的提交和丢弃工作的这一步操作了。
ZooKeeper的选举过程,简单地讲,就是一个集群中所有的机器相互之间进行一系列的投票,选举产生最合适的机器称为Leader,同时其余机器称为Follower或者Observer的集群机器角色初始化过程。关于Leader选举算法,简单来说就是集群中哪个机器处理的数据越新(通常我们根据每个服务器处理过的最大ZXID来比较确定其数据是否更新),其越有可能称为Leader。当然,如果集群中的所有机器处理的ZXID一致的话,那么SID(服务器ID)最大的服务器成为Leader。