Zookeeper 实现 master 选举
使用场景
有一个向外提供的服务,服务必须7*24小时提供服务,不能有单点故障。所以采用集群的方式,采用master、slave的结构。一台主机多台备机。主机向外提供服务,备机负责监听主机的状态,一旦主机宕机,备机要迅速接代主机继续向外提供服务。 从备机选择一台作为主机,就是master选举。
原理解析
右边三台主机会尝试创建master节点,谁创建成功了,就是master,向外提供。其他两台就是slave。
所有slave必须关注master的删除事件(临时节点,如果服务器宕机了,Zookeeper会自动把master节点删除)。如果master宕机了,会进行新一轮的master选举。 本次我们主要关注master选举,服务注册、发现先不讨论。
程序流程
Worker Server在启动的时候如下流程
类图
Worker Server 主工作类
RuningData 描述Worker Server的基本信息
LeaderSelectorZkClient 调度器, 用来启动和停止Worker Server
运行LeaderSelectorZkClient.mian()方法可以查看到效果
对应网络抖动的方法
由于网络抖动,可能误删了master节点导致重新选举,如果master还未宕机,而被其他节点抢到了,会造成可能有写数据重新生成等资源的浪费。我们这里,增加一个判断,如果上次自己不是master就等待5s在开始争抢master,这样就能保障没有宕机的master能再次选中为master。
代码如下
1
2
3
4
5
6
7
8
9
10
|
if (masterData != null && masterData.getName().equals(serverData.getName())) { takeMaster(); } else { // 延迟5s再争抢 delayExector.schedule( new Runnable() { public void run() { takeMaster(); } }, delayTime, TimeUnit.SECONDS); }
|
转载地址:https://blog.csdn.net/jerome_s/article/details/52334906