1.zookeeper选举机制
1.初始化时的选举
优先看zxid,zxid相同的情况下看myid
集群启动时,1号zxid=0,myid=1,2号zxid=0,myid=2,3号zxid=0,myid=3
1号启动,先投给自己一票
2号启动,zxid与1号相同,myid比1号大,因此1号投给2号,2号也投给2号,超过半数,因此2号成为leader,1号成为follower
3号启动,已经有了Leader,3号成为follower
当选举结束后,更新状态,Leader更新为Leading,follower更新为following
2.如果是运行过程中Leader挂掉:
(1) 变更状态。Leader挂后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。
(2) 每个Server会发出一个投票。在运行期间,每个服务器上的ZXID可能不同,此时假定1号的ZXID为123,3号的ZXID为122;在第一轮投票中,1号和3号都会投自己,产生投票(1, 123),(3, 122),然后各自将投票发送给集群中所有机器。
(3) 处理投票。首先比较zxid,如果zxid相同比较myid,由于1号的zxid为123,大于3号的zxid122,所以1号成为Leader。
(4)改变服务器的状态。当选举结束后,更新状态,Leader更新为Leading,follower更新为following。
2.zookeeper一致性算法zab Zookeeper Atomic Broadcast
当 ZooKeeper 集群接收到来自客户端的事务性的会话请求后,集群中的其他 Follow 角色服务器会将该请求转发给 Leader 角色服务器进行处理。当 Leader 节点服务器在处理完该条会话请求后,会将结果通过操作日志的方式同步给集群中的 Follow 角色服务器。然后 Follow 角色服务器根据接收到的操作日志,在本地执行相关的数据处理操作,最终完成整个 ZooKeeper 集群对客户端会话的处理工作。
ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 协议。
所有客户端写入数据都是写入到Leader中,然后,由 Leader 复制到Follower中。从而保证数据一致性。复制过程类似 两阶段提交,ZAB 只需要 Follower 有一半以上返回 Ack 信息就可以执行提交,不需要等待所有follower节点反馈,大大减小了同步阻塞。
简单介绍完,开始重点介绍 消息广播 和 崩溃恢复。整个 Zookeeper 就是在这两个模式之间切换。 简而言之,当 Leader 服务可以正常使用,就进入消息广播模式,当 Leader 不可用时,则进入崩溃恢复模式。
(1)消息广播
ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个二阶段提交过程。
1:对于客户端发送的写请求,全部由 Leader 接收,Leader 接收到写请求后,会对这个消息赋予一个zxid。这个zxid是自增唯一的,通过zxid的大小比较就可以实现有序。Leader 为每个follower准备了一个FIFO队列,将带有zxid的客户端的写请求封装成一个事务 Proposal,分发给所有的 follower。
2:当follower接收到proposal,先把proposal写到磁盘,写入成功以后再向leader回复一个ack。
3:如果Leader接收到Follower超过半数的成功ACk响应,此时leader先自己进行提交commit,然后在通知所有的follower,让所有的follower进行提交。
(2)崩溃恢复
当Leader 失去与过半 Follwer 的联系之后,会进入崩溃恢复模式。
崩溃恢复有两个原则:
- 所有被Leader已经提交的proposal必须被所有follower提交。
- 所有还没有被Leader进行提交的proposal必须被丢弃。
对于第一个原则:因为所有proposal被commit之前必须有超过半数的follower ack,即必须有超过半数节点的服务器的事务日志上有该提案的proposal,因此只要有合法数量的节点正常工作,就必然有一个节点保存了所有被commit消息的proposal状态。 这样ZAB 协议就保证了那些已经在 Leader 服务器上提交的事务最终被所有服务器都提交。
对于第二个原则:如果旧的leader挂了,新的Leader上位了,新的Leader发现底下的follower里面还有旧的leader的proposal,新的leader会要求follower进行一个回滚操作,回退到一个确实已经被集群中过半机器提交的最新的事务 Proposal 。(改朝换代了,新皇帝登基了,旧的皇帝的指令当然是不好使的了,新的王朝要听新的帝王的指令)