1.Zookeeper是什么?
它是一个分布式的、开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
2.Zookeeper提供了什么?
- 文件系统
每个子目录项如NameService都被称为znode,和文件系统一样,我们能自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
有四种类型的znode:
(1)persistent-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在。
(2)persistent_sequential-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给节点名称进行顺序编号。
(3)ephemeral-临时目录节点
客户端与zookeeper断开连接后,该节点被删除。
(4)ephemeral_sequential-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。
- 通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
3.Zookeper做了什么?
- 命名服务
在Zookeeper的文件系统里创建一个目录,即有唯一的path。
- Zookeeper的配置管理
程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到zookeeper上去,保存在Zookeer的某个目录节点中,然后所有相关应用程序对这个目录进行监听,一旦配置信息发生变化,每个应用程序就会收到Zookeeper的通知。然而后Zookeeper获取新的配置信息应用到系统中就好。
- Zookeeper集群管理
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
(1)对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与zookeeper的连接断开,其所创建的目录节点被删除,所有其他机器都收到通知。新机器加入也是类似的。
(2)对于第二点,只要所有机器所创建的节点是有顺序的,每次选取编号最小的机器作为master就好。
- Zookeeper分布锁
锁服务可以分为两类:一个是保持独占,另一个是控制时序。
(1)保持独占
我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建/distribute_lock节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock节点就释放。
(2)控制时序
/distribute_lock已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。
- Zookeeper队列管理
(1)同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
在约定目录下创建临时目录节点,监听节噗数目是否是我们要求的数目。
(2)FIFO队列
入列有编号,出列按编号 。
- 分布式和数据复制
(1)写主
对数据的修改提交给指定的节点,读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离。
(2)写任意
对数据的修改可提交给任意的节点。
对于Zookeeper,它采用的方式是写任意。对于写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因)。
4.Zookeeper角色描述
Leader:负责进行投票的发起和决议,更新系统状态。
Follower:用于接收客户端请求并向客户端返回结果,在选主过程中参与投票。
ObServer:可以接收客户端连接,将写请求转发给Leader节点。但不参加投票过程,只同点leader的状态
5.Zookeeper的工作原理
核心是原子广播,这个机制保证了种个Server之间的同步。实现这个机制的协议叫到Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者领导者崩溃后,Zab就进入恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。
为了保证事务的顺序一致性,Zookeeper采用递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现zxid是一个64位的数字,字高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个Leader的统治时期,低32位用于递增计数。
6.Zookeeper选主流程
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被选举出来。
- fast paxos
某个Server首先所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid冲突,并接受对方的提议,然后向对方发送提议完成的消息,重复这个流程,最后一定能选举出Leader。
7.Zookeeper同步流程
选完Leader以后,zk就进入状态同步过程。
(1)Leader等待server连接。
(2)Follower连接leader,将最大的zxid发送给leader。
(3)Leader根据follower的zxid确定同步点。
(4)完成同步后通知follower已经成为uptodate状态。
(5)Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
8.Leader的工作流程
(1)恢复数据。
(2)维持与Learner的心跳,接收learner(follower,observer)的请求并判断请求类型,根据消息类型,进行不同的处理。
- PING
指Learner的心跳信息。
- REQUEST
Follower发送的提议消息,包括写请求及同步请求。
- ACK
Follower对提议的回复,超过半数的Follower通过,则commit该提议。
- REVALIDATE
用来延长session有效时间。
9.Follower的工作流程
Follower的消息循环处理如下几种来自Leader的消息:
(1)PING消息:心跳消息。
(2)PROPOSAL消息:Leader发起的提案,要求Follower投票。
(3)COMMIT消息:服务器端最新一次提案,要求Follower投票。
(4)UPTODATE消息:表示同步完成。
(5)REVALIDATE消息:根据Leader的REVALIDATE结果,关闭revalidate的session还是允许其接受消息。
(6)SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
最后欢迎大家访问我的个人网站:1024s