zookeeper选主和同步机制

来源:互联网 发布:如何在一个数据区间 编辑:程序博客网 时间:2024/06/13 18:40

在上篇博文《zookeeper轻松入门》中,已经详细介绍了zookeeper的架构和数据交互的过程。我们已经知道zookeeper的更新操作具有强一致性,而这一过程正是通过leader广播实现的。本篇博文就在此基础上详细介绍一下zookeeper的选举机制的同步机制。

zab协议

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。

这里写图片描述

选主和同步的联系

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。
因此,选主得到的leader保证了同步状态的进行,状态同步又保证了leader和Server具有相同的系统状态,当leader失去主权后可以在其他follower中选主新的leader。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch(年号)用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch(时期、。纪元),标识当前属于那个leader的统治时期。低32位用于递增计数。

每个Server在工作过程中有三种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步

异常问题的处理

1). 选举过程中,新的Server加入

当一个Server启动时它都会发起一次选举,此时由选举线程发起相关流程,那么每个Server都会获得当前zxid最大的那个server,如果本次最大的Server没有获得n/2+1 个票数,那么下一次投票时,他将向zxid最大的Server投票,重复以上流程,最后一定能选举出一个Leader。

2). 选举过程中,Server退出

只要保证n/2+1个Server存活zk service仍可以正确工作,如果少于n/2+1个Server 存活就没办法选出Leader。

3). 选举过程中或选举完成后,Leader死亡

当选举出Leader以后,其他server已经处于FLLOWING 状态,本次选主过程正常进行。当选主完成后,所有的Fllower都会向Leader发送Ping消息,如果无法ping通,就改变自己的状为(FLLOWING ==> LOOKING),发起新的一轮选举。

4). 双主问题

Leader的选举是保证只产生一个公认的Leader的,而且Follower重新选举与旧Leader恢复并退出基本上是同时发生的,当Follower无法ping通Leader时就认为Leader已经出问题开始重新选举,Leader收到Follower的ping没有达到半数以上则要退出Leader重新选举。

1 0
原创粉丝点击