(原)3.1 Zookeeper应用 - Master选举

时间:2023-03-09 16:45:57
(原)3.1 Zookeeper应用 - Master选举

本文为原创文章,转载请注明出处,谢谢

Master 选举

1、原理

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

2、架构图

(原)3.1 Zookeeper应用 - Master选举

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

3、流程图

(原)3.1 Zookeeper应用 - Master选举

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宕机,进行争抢