zoukankan      html  css  js  c++  java
  • (原)3.1 Zookeeper应用

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

    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宕机,进行争抢
  • 相关阅读:
    MySQL Workbench的安全更新模式
    IEnumerable<T>和IQueryable<T>区分
    Google 网站打不开
    使用 MVVMLight 命令绑定(转)
    使用 MVVMLight 绑定数据(转)
    安装/使用 MVVMLight(转)
    ?? 运算符(C# 参考)
    REST风格URL
    node+mysql 数据库连接池
    理解mysql执行多表联合查询
  • 原文地址:https://www.cnblogs.com/shengkejava/p/5726794.html
Copyright © 2011-2022 走看看