high-concurrent-distributed
  • Introduction
  • RPC
    • RPC模式介绍
      • RPC概念
      • RPC核心过程/RPC需要解决的问题
      • RPC框架
    • 常见RPC技术
    • 网络协议分析
      • 网络七层
      • TCP
      • UDP
      • 应用层HTTP协议
  • 分布式系统Zookeeper
    • CAP理论
    • Zookeeper基础知识
      • Zookeeper介绍
      • Zookeeper基础
      • Zookeeper单机部署
      • Zookeeper配置文件详解、下载目录说明
      • Zookeeper工作流
      • Zookeeper CLI/客户端常用命令
      • Zookeeper leader选举
      • Java客户端介绍
        • 原生Zookeeper API
        • curator客户端
        • zkClient客户端
    • Zookeeper高级知识
      • Zookeeper集群
      • 典型的应用场景
        • 分布式配置中心
        • 分布式锁
        • 集群管理(Group Membership)
        • 统一的命名服务
        • zookeeper的注意事项
        • 队列管理
  • Dubbo框架
    • Dubbo介绍
    • Dubbo常见问题解析
Powered by GitBook
On this page
  • 图 3. 集群管理结构图
  • 清单 3. Leader Election 关键代码

Was this helpful?

  1. 分布式系统Zookeeper
  2. Zookeeper高级知识
  3. 典型的应用场景

集群管理(Group Membership)

Previous分布式锁Next统一的命名服务

Last updated 5 years ago

Was this helpful?

Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。

Zookeeper 不仅能够帮你维护当前的集群中机器的服务状态,而且能够帮你选出一个“总管”,让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。

它们的实现方式都是在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,然后每个 Server 在它们创建目录节点的父目录节点上调用( path, boolean watch) 方法并设置 watch 为 true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以 Children 将会变化,这时上的 Watch 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。

Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。

图 3. 集群管理结构图

图 3. 集群管理结构图

这部分的示例代码如下,完整的代码请看附件:

清单 3. Leader Election 关键代码

void findLeader() throws InterruptedException { 
       byte[] leader = null; 
       try { 
           leader = zk.getData(root + "/leader", true, null); 
       } catch (Exception e) { 
           logger.error(e); 
       } 
       if (leader != null) { 
           following(); 
       } else { 
           String newLeader = null; 
           try { 
               byte[] localhost = InetAddress.getLocalHost().getAddress(); 
               newLeader = zk.create(root + "/leader", localhost, 
               ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 
           } catch (Exception e) { 
               logger.error(e); 
           } 
           if (newLeader != null) { 
               leading(); 
           } else { 
               mutex.wait(); 
           } 
       } 
   }
getChildren
String
getChildren