介绍
分布式应用程序协调器,为分布式系统提供一致性服务,一致性由Paxos算法的ZAB协议完成的
主要功能:配置维护,域名服务,分布式同步,集群管理等
Zk如何保证一致性
zk有以下特点:
顺序一致性:从同一个客户端发出的多个事务请求,会按发出的顺序依次记录到zk
原子性:所有事务请求结果在集群中所有server的应用情况一致,要么都成功,要么都失败
单一视图:无论集群连接哪一台server,读取的数据模型中的数据都是一致的
可靠性:一旦事务被zk记录,则会被永久记录
最终一致性:
Paxos算法 (基于消息传递)
有三个角色
提案者
表决者
同步者
故事说明:
有一个议员发了一个提议: 将电费设定为 1 元/度。他首先看了一下记事本,嗯,当前提议编号是 0,那么我的这个 提议的编号就是 1,于是他给所有议员发消息:1 号提议,设定电费 1 元/度。其他议员收到 消息以后查了一下记事本,哦,当前提议编号是 0,这个提议可接受,于是他记录下这个提 议并回复:我接受你的 1 号提议,同时他在记事本上记录:当前提议编号为 1。发起提议的 议员收到了超过半数的回复,立即给所有人发通知:1 号提议生效!收到的议员会修改他的 记事本,将 1 好提议由记录改成正式的法令,当有人问他电费为多少时,他会查看法令并告 诉对方:1 元/度。
现在看冲突的解决: 假设总共有三个议员 S1、S2 与 S3,S1 和 S2 同时发起了一个提议:设定电费,提议编 号均为 1。S1 想设为 1 元/度,S2 想设为 2 元/度。此时 S3 先收到了 S1 的提议,于是他一查 记事本,发现提议编号 1 大于当前的编号 0,所以同意了该提议。紧接着他又收到了 S2 的 提议,结果他再查记事本,发现这个提议的编号等于当前记录的编号 1,于是他拒绝了这个 提议:对不起,这个提议先前提过了。于是 S2 的提议被拒绝,S1 正式发布了提议:1 号提 议生效。S2 向 S1 或者 S3 打听并更新了 1 号法令的内容,然后他可以选择继续发起 2 号提 议。
2pc -->两阶段提交 prepare(提议)->accpet(接收)
3pc–>三阶段提交 prepare(提议)->accpet(接收)->commit(提议通过)
原理:提案者发出N号(编码是递增的)提议,表决者根据自身记录的最大编码与N判断,如果>N可以进行决策,并将决策后的结果返回给提案者,然后更新N为自己的最大的编码,如果最终提案者接收大于一半的表决者回馈,则提议通过,向全体表决者与同步者同步最大的编号。
ZAB协议:zookeeper atomic broadCast,zk的原子消息广播协议,一种支持崩溃恢复的原子协议,zookeeper主要靠ZAB协议来实现分布式数据的一致性
zookeeper使用单一主进程来接收所有事务的请求,若客户发出的是写请求,会将请求转发给leader,由leader以提案方式广播该写请求,如果超过半数同意,则同意该写请求,leader在通过广播方式,让follower同步数据
Zk有三类角色
leader : (唯一的事务操作者,也可以处理读请求)写请求的处理者
follower:可以直接处理读请求,但不会处理客户端的写请求,会将请求转发给leader处理,对leader发起的事务提案有表决权,同步
Observer:可以理解为不参与Leader选举的follower,没有选举权和被选举权,用于协助follower处理更多的读请求,Observer的增加,会提供集群的读请求的吞吐量,但不会增加leader选举通过的压力
ZK的三个数据:
zxid:64位的长整型数据,高32为代表epoch,低32为代表xid
epoch:(时期,年号)每个leader选举结束后都会生成一个epoch,并通知所有其他server,包含Observer和follower
xid:事务ID,是一个递增序号,即使leader更替,xid还是从当前位置继续增加
ZK的三种模式
恢复模式:在集群启动,或者Leader崩溃后,系统都需要进入恢复模式,以恢复系统对外提供服务能力,其包含2个阶段,leader选择和初始化同步
广播模式:分为初始化广播和更新广播
同步模式:初始化同步和更新同步
zk的四种状态:
LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态。
FOLLOWING:跟随者状态。表明当前服务器角色是Follower。
LEADING:领导者状态。表明当前服务器角色是Leader。
OBSERVING:观察者状态。表明当前服务器角色是Observer。
恢复模式的三种原则
Leader主动出让原则:若leader收到的follower数量未过半,则自动将状态转为looking,去寻找新的leader
已经被处理的消息不能丢原则:
被丢弃的消息不能再现原则(看下图)
选举过程
1.其中(1,0) ,1代表serverId,0代表zxid
选举的原理主要:
1选检查选票的有效性
2选择zxid最大的节点为leader
3如果zxid相同,选择最大的serverId为leader