Zookeeper重点总结

ZAB协议(Zookeeper Atomic Boardcast )

zookeeper原子广播协议,zookeeper使用ZAB协议,实现分布式数据一致性。具体的,zk使用一个单一的主进程来接受并处理客户端的事务请求,并使用ZAB协议,将数据的变更状态以事务Proposal的形式广播到所有Follower。

Zookeeper中的角色:

Leader:1,可以进行事务操作(写操作)和非事务操作(读操作),2,保证事务操作的顺序性。

Follower:1,处理非事务请求,转发事务请求给Leader节点。2,可以参与Leader选举 。3,参与事务投票

Observer:1,处理非事务请求,转发事务请求给Leader节点。

Observer节点与Follower节点的区别是不能参与Leader选举投票和事务投票。Observer节点的主要作用就是增加读非事务处理的能力。

Leader选举:

zookeeper集群初始化时,没有leader和follower节点,这时候需要进行leader选举。一般来说,ZXID(事务ID)大的更有机会成为Leader节点,因为ZXID越大,表示数据越新。如果XZID一样,则根据SID(serverID,即myid)判断,SID越大的节点,越有机会成为leader。

选举详细过程:在集群初始化的时候,每个节点都会发出第一个投票,将自己投为leader,投票的数据格式为(SID,ZXID),投票会被其他节点接收到,其他节点接收到之后,对比自己最新的一次投票,判断哪个被投票的节点更适合称为leader。判断机制如下:谁的ZXID越大,就选谁,ZXID一样,选择SID更大的那个。判断出更适合称为leader的节点之后,将这个Leader节点作为被选举者再次发出投票。

节点在每次发出投票之后,就会统计当前是否有quorum数量(过半,总结点数/2 + 1)的投票都投给了同一个节点,如果存在,则认为这个节点是Leader。之后会等待一定时间(默认200毫秒),看看是否有更新的投票。再之后,看看Leader是不是自己,如果是,则将自己设置为leader,否则将自己设置为follower。

上面是一种集群初始化时,Leader选举的情况。在集群运行过程中,如果leader挂掉,则也会发生leader重新选举。选举的过程和集群初始化时leader选举过程基本是一样的。

 

事务操作(Proposal)

Leader节点进行一个事务提议(Proposal),然后发给各个Follower节点,各个Follower节点收到Proposal之后,记录事务日志,然后返回Ack给Leader节点。Leader如果收到了过半数节点的Ack,则进行事务Commit,并让所有的Follower也进行Commit。Follower收到Commit通知之后,将事务变更应用到内存数据库zkdatabase中。需要注意的是,由于之前Observer并没有参加事务投票,所以Leader发出Commit时候要区别对待。对于Observer,需要将事务内容和ZXID全部发给Observer,Observer才能完成事务。对于Follower,只需要发送ZXID即可。

 

你可能感兴趣的:(Zookeeper重点总结)