使用场景

        有一个向外提供的服务,服务必须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);
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐