`
dengyin2000
  • 浏览: 1207238 次
  • 性别: 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源码剖析:深入理解Leader选举机制

    本文详细分析了Zookeeper的源码,特别是Leader选举过程的实现。首先,介绍了阅读源码的...最后,重点分析了Zookeeper中的Leader选举机制,包括其多层队列架构和具体实现流程,帮助读者深入理解这一核心功能的底层逻辑。

    zookeeper的安装

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

    ZooKeeper权限控制样例程序

    ZooKeeper权限控制样例程序,配合文档:http://blog.csdn.net/nileader/article/details/43014541

    zookeeper测试小程序

    已经包含zookeeper和zookeeperTest JAR包,找个资源真不容易

    ZooKeeper典型使用场景

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos 算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得zookeeper...因此,也非常欢迎你分享你在ZK使用上的奇技淫巧。

    zookeeper Web 界面程序

    为.jar的程序,需要JDK1.7以上的版本,只需修改zookeeper的连接地址,即可查询zookeeper节点的信息。 注:本资源是对github上的一个开源项目的一个改造,如有侵权,请告知,会及时的删除资源。原项目地址:...

    C#使用Zookeeper示例

    1. 使用前先Nuget搜索ZooKeeper.Net安装 2. 安装ZooKeeper,百度自行搜索“Windows下安装ZooKeeper” 3. 下载路径:https://mirrors.cnnic.cn/apache/zookeeper/

    zookepper中leader作用

    zookeeper中的leader的主要作用,一个zookeeper 集群 只有一个leader: 类似master/slave模式

    Zookeeper分布式应用程序协调服务:zookeeper-3.4.13

    Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。

    Zookeeper集群

    大部分分布式应用系统需要一个主控、协调器或者控制器来管理物理分布的子进程,目前,大多数都需要开发私有的协调程序,缺乏一个通用机制,协调程序的反复编写浪费,并且难以形成通用、伸缩性好的协调器,zookeeper...

    从Paxos到Zookeeper

    同时,本书深入介绍了分布式一致性问题的工业解决方案——ZooKeeper,并着重向读者展示这一分布式协调框架的使用方法、内部实现及运维技巧,旨在帮助读者全面了解ZooKeeper,并更好地使用和运维ZooKeeper。...

    zookeeper 使用指导PDF

    zookeeper 使用指导

    ZooKeeper 客户端的使用(二).

    ZooKeeper 客户端的使用(二).

    zookeeper测试程序c++

    c++实现创建,监听,获取指定节点,获取全部子节点,监听子节点变化,监听节点变化等长用zookeeper功能

    dubbo整合zookeeper程序

    该示例代码是基于dubbo+zookeeper的微服务实战 订单模块/用户模块/API 使用ecplise开发详细说明见博客https://blog.csdn.net/weixin_39519416/article/details/88123067

    dubbo使用zookeeper注册最小依赖jar包

    dubbo使用zookeeper注册最小依赖jar包,包含dubbo核心包一个,Commons包一个,log4j包一个,netty核心包一个,slf4j包两个,spring核心包一个,zookeeper包两个,javassist包一个。本地搭建可以成功调用服务。欢迎来...

    Zookeeper使用场景及详解

    Zookeeper使用场景及详解,优劣之分

    zookeeper-3.3.6.tar.gz

    D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 ...

Global site tag (gtag.js) - Google Analytics