`
dengyin2000
  • 浏览: 1225935 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Zookeeper来为你的程序加上Leader Election的功能。

阅读更多
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

废话不多说,
package com.ericsson.threef.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * Created by IntelliJ IDEA.
 * User: EDENYIN
 * Date: 1/4/11
 * Time: 3:13 PM
 * To change this template use File | Settings | File Templates.
 */
public class LeaderElection implements Watcher, Runnable {


    private String zookeeperConnectionString;
    private String rootPath;

    private ZooKeeper zk;

    private byte[] hostAddress;


    public LeaderElection(String zookeeperConnectionString, String rootPath) {
        this.zookeeperConnectionString = zookeeperConnectionString;
        this.rootPath = rootPath;
        try {
            hostAddress = InetAddress.getLocalHost().getHostAddress().getBytes();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        buildZK();
    }


    private void buildZK() {
        System.out.println("Build zk client");
        try {
            zk = new ZooKeeper(zookeeperConnectionString, 10000, this);
            Stat s = zk.exists(rootPath, false);
            if (s == null) {
                zk.create(rootPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
                zk.create(rootPath + "/ELECTION", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            String value = zk.create(rootPath + "/ELECTION/n_", hostAddress, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Error connect to zoo keeper");
        }
    }


    public void process(WatchedEvent event) {
        System.out.println(event);
        if (event.getState() == Event.KeeperState.Disconnected || event.getState() == Event.KeeperState.Expired) {
            System.out.println("Zookeeper connection timeout.");
            buildZK();
        }

    }

    public void run() {
            while (true) {
                try {
                    List<String> children = zk.getChildren(rootPath + "/ELECTION", false);
                    String leaderPath = "Not found";
                    int minValue = -1;
                    for (int i=0;i<children.size();i++) {
                        String child = children.get(i);
                        int index = Integer.parseInt(child.substring(2));
                        if (i == 0) {
                            minValue = index;
                            leaderPath = child;
                        }else if (index < minValue) {
                            minValue = index;
                            leaderPath = child;
                        }
                    }
                    LatchChildWatcher latchChildWatcher = new LatchChildWatcher();
                    byte[] data = zk.getData(rootPath + "/ELECTION/" + leaderPath, latchChildWatcher, null);
                    System.out.println("find the leader on the path:" + leaderPath + " whose host address is " + new String(data));
                    latchChildWatcher.await();
                } catch (Exception e) {
                    e.printStackTrace();
                    System.err.println("Error get the leader." + e.getMessage());
                }
        }
    }

    private class LatchChildWatcher implements Watcher {

        CountDownLatch latch;

        public LatchChildWatcher(){
            latch = new CountDownLatch(1);
        }

        public void process(WatchedEvent event){
            System.out.println("Watcher fired on path: " + event.getPath() + " state: " +
                    event.getState() + " type " + event.getType());
            latch.countDown();
        }
        public void await() throws InterruptedException {
            latch.await();
        }
    }
}



附件是完整的maven项目。

Reference: http://hadoop.apache.org/zookeeper/docs/r3.3.1/recipes.html#sc_leaderElection

分享到:
评论
2 楼 寐语者 2016-04-06  
LeaderElection(String zookeeperConnectionString, String rootPath)这两个参数是什么
1 楼 fish2100 2011-10-21  
非常感谢

相关推荐

    zookeeper的安装

    ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。...

    zookeeper 3.6.3 源码下载

    ZooKeeper 3.6.3 是一个广泛用于分布式系统的协调服务,它为分布式应用程序提供了高效且可靠的命名服务、配置管理、集群同步、分布式锁等核心功能。在深入理解源码之前,我们需要先了解ZooKeeper的基本概念和工作...

    Linux下Zookeeper集群的安装

    这一特性在需要实现Leader Election(领导者选举)的场景中尤为重要,例如在HBase Master的选择过程中。 4. **集群管理** 分布式集群的动态特性意味着节点可能会随时加入或离开集群。Zookeeper能够实时监控集群...

    zookeeper handbook

    本手冊將為讀者介紹 ZooKeeper 的使用方法,并提供了一些有用的指南和解決方案,以幫助讀者更好地使用 ZooKeeper 實現高級別構造。 1. 命名服務 命名服務是 ZooKeeper 的一個基本應用,允許客戶端在 ZooKeeper ...

    ZooKeeper Recipes and Solutions

    本文档提供了使用 ZooKeeper 实现高级功能的指导原则和最佳实践,例如名称服务、配置管理、组成员资格等,并探讨了如何通过 ZooKeeper 构建同步一致性原语,如队列和锁。 #### 创建更高层次结构的指南 ZooKeeper ...

    Ant编译后的zookeeper源码

    6. **选举(Leader Election)**:ZooKeeper集群中的选举机制确保了在任何时刻只有一个领导者负责处理所有的写操作,确保数据的一致性。 在Ant编译后的源码中,你可以找到以下几个关键组件的实现: - `zookeeper-...

    zookeeper-3.4.12.tar.gz.zip

    总结,Apache Zookeeper 3.4.12版本以其强大的功能和稳定性在分布式领域扮演着重要角色。理解并掌握Zookeeper的工作原理和使用方法,对于构建高可用、高一致性的分布式系统至关重要。无论是大型互联网公司还是小型...

    8-ZooKeeper集群安装配置使用1

    ZooKeeper 的选举机制采用 Fast Leader Election 算法,以确保集群的高可用性和一致性。在选举过程中,服务器会经历 LOOKING、LEADING、FOLLOWING 和 OBSERVING 四种状态。选举过程中,服务器会根据 ZXID(事务 ID)...

    Zookeeper讲义.pdf

    它的主要目标是简化分布式应用程序的开发和管理,通过提供一系列的基础服务来帮助解决分布式环境中常见的复杂问题。Zookeeper的设计基于观察者模式,它可以存储并管理一组共享的数据,并允许客户端注册成为观察者。...

    ZooKeeper 典型的应用场景详解

    ZooKeeper是一个高度可用的协调服务,用于分布式应用程序中的管理和同步。它基于观察者模式设计,通过存储和管理共享数据来支持集群间的协作。当这些数据发生改变时,Zookeeper会通知已经注册的观察者,帮助实现...

    zookeeper.7z

    - **Zookeeper 的选举算法**:Zookeeper 使用的是 Fast Leader Election 算法,它能够在短时间内选举出领导者,保证系统的快速恢复。 5. **Zookeeper 的运维与调优** - **监控与日志**:监控 Zookeeper 的运行...

    Zookeeper 进阶之——典型应用场景(一)1

    总结来说,Zookeeper 在分布式系统中扮演了关键角色,它提供了命名服务、配置管理以及集群管理和 Leader Election 功能,极大地简化了分布式环境下的复杂性,提高了系统的稳定性和可扩展性。通过 Zookeeper,开发者...

    zookeeperMaster选举以及数据同步代码

    在分布式系统中,Zookeeper是一个至关重要的组件,它主要用于实现分布式服务管理,提供诸如配置管理、命名服务、集群同步、 leader选举等核心功能。在这个"zookeeperMaster选举以及数据同步代码"项目中,我们将深入...

    19-Zookeeper知识点1

    ZooKeeper 采用 Fast Leader Election 算法(可以理解为 Paxos 的一个简化版,一个变种)。ZooKeeper 服务器共有 4 个状态:LOOKING:寻找 Leader 状态。LEADING:领导者。FOLLOWING:跟随者。OBSERVING:观察者。...

    zookeeper-3.4.10.rar

    4. **选举(Leader Election)**:Zookeeper集群中选举一个领导者(Leader),负责处理所有的写操作和维护集群一致性。 四、Zookeeper的应用场景 1. **Hadoop HDFS**:Hadoop的NameNode使用Zookeeper来监控...

    zookeeper的介绍和使用.docx

    这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫 Leader Election(leader 选举)。比如 HBase 的 Master 就是采用这种机制。 集群管理 在分布式的集群中,经常会由于各种原因,比如硬件故障,软件...

    陶隽-基于Apache Zookeeper的分布式协调原理及应用

    总结来说,ZooKeeper作为一个分布式协调服务,能够在分布式应用中提供协调、同步、领导者选举、配置管理等关键功能。通过其简单易用的API和层次化数据模型,ZooKeeper极大地简化了分布式应用的开发。Spring XD等项目...

    zookeeper免安装版

    5. **选举(Leader Election)**:在Zookeeper集群中,有一个主节点(Leader),其他节点为follower。如果Leader失败,会进行新的选举来确定新的Leader。 6. **原子操作**:所有的操作(如创建、删除节点,设置、...

    从Paxos到Zookeeper 分布式一致性原理与实践 PDF电子书下载 带目录书签 完整版.pdf

    Zab协议有两种模式:选主模式(Leader Election)和广播模式(Broadcasting),其中选主模式主要用于在集群中选举出一个领导者,而广播模式则负责数据的一致性同步。 ##### 4.1 Zab协议详解 1. **选主模式**:当...

Global site tag (gtag.js) - Google Analytics