Zookeeper应用 - Master选举

来源:互联网 发布:tk免费域名注册网站 编辑:程序博客网 时间:2024/04/29 07:29

转载自:http://www.cnblogs.com/shengkejava/p/5726794.html

Master 选举

1、原理

  • 服务器争抢创建标志为Master的临时节点
  • 服务器监听标志为Master的临时节点,当监测到节点删除事件后展开新的一轮争抢
  • 某个服务器成功创建则为Master

2、架构图

  • Master:服务器争抢节点
  • Servers:服务器列表节点
  • work Server:服务器节点

3、流程图

 

 4、核心代码

  • workServer监听
    复制代码
        public WorkServer(final ServerData serverData) {        this.serverData = serverData;        dataListener = new IZkDataListener() {            @Override            public void handleDataChange(String s, Object o) throws Exception {            }            @Override            public void handleDataDeleted(String s) throws Exception {                //toBeMaster();                //适应网络抖动                if(null!=masterData && masterData.getName().equals(serverData.getName())) {                    toBeMaster();                }else{                    executorService.schedule(new Runnable() {                        @Override                        public void run() {                            toBeMaster();                        }                    },10, TimeUnit.SECONDS);                }            }        };    }
    复制代码
    适应网络抖动:当网络发生异常可能会出现短时间的断开,发生此情况时给予节点创建的延时,如果上次保存Master信息为当前节点,则此次Master节点争抢会有10秒钟的优势
  • 争抢Master
    复制代码
    public void toBeMaster() {        if(!running) return;        //创建临时节点,session连接失败自动删除        try{            zkClient.create(MASTER_NOTE,serverData, CreateMode.EPHEMERAL);            masterData = serverData;            System.out.println("当前master:"+masterData.getName());            //测试使用,每5秒释放master节点            if(checkMaster()) {                executorService.schedule(new Runnable() {                    @Override                    public void run() {                        releaseMaster();                    }                },detay,TimeUnit.SECONDS);            }        }catch (ZkNodeExistsException e){            //如果master节点已经存在 读取            ServerData data = zkClient.readData(MASTER_NOTE,true);            //数据为空说明此时master 宕机            if(null==data){                toBeMaster();            }else{                masterData = data;            }        }    }
    复制代码
    • ZkNodeExistsException :说明已存在Master节点
    •   存在后读取节点数据,如果节点数据不存在则说明此时Master宕机,进行争抢

 

编程改变生活,改变人生
分类: Zookeeper
0 0
原创粉丝点击