您的位置:首页 > 其它

Zookeeper 实现 master 选举

2016-08-27 14:06 405 查看
使用场景
        有一个向外提供的服务,服务必须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
        代码:https://github.com/JeromeSuz/demo_zookeeper/tree/master/src/main/java/com/demo/_4master        运行LeaderSelectorZkClient.mian()方法可以查看到效果
对应网络抖动的方法
由于网络抖动,可能误删了master节点导致重新选举,如果master还未宕机,而被其他节点抢到了,会造成可能有写数据重新生成等资源的浪费。我们这里,增加一个判断,如果上次自己不是master就等待5s在开始争抢master,这样就能保障没有宕机的master能再次选中为master。

代码如下
12345678910
if
 
(masterData != 
null
 
&& masterData.getName().equals(serverData.getName())) {
    
takeMaster();
else
 
{
    
// 延迟5s再争抢
    
delayExector.schedule(
new
 
Runnable() {
        
public
 
void
 
run() {
            
takeMaster();
        
}
    
}, delayTime, TimeUnit.SECONDS);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: