理解Zookeeper的一种方法是将他视为一个提供高可用性的文件系统。它没有文件和目录,但是有一个统一概念的节点,叫做znode,作为数据以及其他znode的容器。znode来自于一个层次级的命名空间。传统的建立成员列表的方法是以小组的名称创建一个父znode,同时子znode使用的是组成员的名称。

  1.创建组

  下面要写一个为组创建一个znode的程序,来介绍一下Zookeeper 的Java API。如下:

public class ConnectionManager implements Watcher{

    private static final int SESSION_TIMEOUT = ;
protected ZooKeeper zk;
private CountDownLatch countDownLatch = new CountDownLatch(); public void connect(String hosts) throws IOException, InterruptedException {
zk = new ZooKeeper(hosts,SESSION_TIMEOUT,this);
countDownLatch.await();
} public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
countDownLatch.countDown();
}
} public void close() throws InterruptedException {
zk.close();
}
}
public class CreateGroup extends ConnectionManager{

    public void createGroup(String groupName) throws KeeperException, InterruptedException {
String path = "/" + groupName;
String createPath = zk.create(path,null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Create:"+createPath);
} public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
CreateGroup group = new CreateGroup();
group.connect("localhost");
group.createGroup("/zoo");
group.close();
}
}

  main方法执行的时候,先创建一个CreateGroup对象,并调用它的connect方法,此方法实例化一个新的zookeeper对象,他是客户端API的主要类并且维护着客户端和zookeeper服务端的链接。这个构造函数有三个参数,第一个是Zookeeper的主机地址,第二个是每个会话的超时时间,第三个是Watcher对象的实例,Watcher接收Zookeeper的响应,并通知它各种事件,这个例子中ConnectionManager是一个Watcher,因此我们将他传递给Zookeeper的构造函数。

  当一个zookeeper的实例被创建后,它启动一个线程链接到zookeeper服务。对构造函数的响应返回很快,因此在使用zookeeper对象前等待链接建立非常重要。在这里我们使用Java的CountDownLatch来阻塞,直到zookeeper准备好客户端链接到zookeeper后,Watcher的process方法会被调用,并收到一个事件,表明链接已经建立。当收到该事件的时候,我们使用CountDownLatch的countDown操作减掉一个计数。此时计数器归0,await方法返回。当connect方法完成后,调用createGroup方法。在这个方法里我们使用zookeeper的create方法创建一个新的zookeeper的node。znode可能是临时的或则永久性的。一个临时性的znode,在客户端与服务端断开连接后,服务端便把节点删除。create方法的返回值是ZookEeper的创建路径。

  2加入组

  下面是一个将成员注入到组里的程序,每一个程序在程序运行的时候加入到组中,当程序结束的时候,它必须从这个组中移除。我们可以在Zookeeper的命名空间下创建临时节点来实现。

public class JoinGroup extends ConnectionManager{

    public void joinGroup(String groupName,String memberName) throws KeeperException, InterruptedException {
String path = "/" + groupName + "/" + memberName;
String createPath = zk.create(path,null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Create:"+createPath);
} public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
JoinGroup group = new JoinGroup();
group.connect("localhost");
group.joinGroup("/zoo","test");
group.close();
}
}

  JoinGroup与CreateGroup十分的相似,在joinGroup中创建一个临时的节点作为znode的子节点,最后会看到在程序结束的时候,临时节点也相应的被删除。

  3.列出组成员

  现在我们实现一个程序,找出组中的成员,实现如下:
  

public class ListGroup extends ConnectionManager{

    public void listGroup(String groupName) throws KeeperException, InterruptedException {
String path = "/" + groupName;
List<String> children = zk.getChildren(path,false);
if(children.isEmpty()){
System.out.println("no child");
System.exit();
}else{
for(String child : children){
System.out.println(child);
}
}
} public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ListGroup group = new ListGroup();
group.connect("localhost");
group.listGroup("/zoo");
group.close();
}
}

  4.删除一个组

  Zookeeper提供了一个带有路径和版本号的delete方法,Zookeeper只在删除的znode的版本号和已经定义过的版本号一样的时候才会删除该znode,乐观锁机制能够使客户端发现znode修改的冲突,你可以不管版本号而使用版本号-1来删除该znode。早zookeeper中没有递归删除操作,因此在删除父节点前要先删除子节点信息

  

public class DeleteGroup extends ConnectionManager{

    public void deleteGroup(String groupName) throws KeeperException, InterruptedException {
String path = "/" + groupName;
List<String> children = zk.getChildren(path,false);
for(String child : children){
String tempPath = path + "/" + child;
List<String> temp = zk.getChildren(tempPath,false);
if(temp.isEmpty()) {
zk.delete(path + "/" + child, -);
}else{
deleteGroup(tempPath);
}
}
zk.delete(path,-);
} public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
DeleteGroup group = new DeleteGroup();
group.connect("localhost");
group.deleteGroup("/zoo");
group.close();
}
}

  

zookeeper基本操作的更多相关文章

  1. 4. ZooKeeper 基本操作

    ZooKeeper的数据模型及其API支持以下九个基本操作: 操作 描述 create 在ZooKeeper命名空间的指定路径中创建一个znode delete 从ZooKeeper命名空间的指定路径 ...

  2. 转载:ZooKeeper Programmer's Guide(中文翻译)

    本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息. 本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooKeep ...

  3. ZooKeeper程序员指南(转)

    译自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 1 简介 本文是为想要创建使用ZooKeeper协调服务优势的分布式 ...

  4. ZooKeeper学习第四期---构建ZooKeeper应用

    一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...

  5. zookeeper[1] (转)ZooKeeper Programmer's Guide(zookeeper编程向导)---中文

    原文:http://www.cnblogs.com/Xrinehart/p/3512509.html 本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实 ...

  6. 【Zookeeper系列】构建ZooKeeper应用(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4064992.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那 ...

  7. ZooKeeper系列 (4) 构建ZooKeeper应用

    原文地址: http://www.cnblogs.com/wuxl360/p/5817540.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公 ...

  8. ZooKeeper开发者指南(五)

    引言 这个文档是为了想利用ZooKeeper的协调服务来创建分布式应用的开发者提供的指南.它包括概念和实践的信息. 这个文档的一开始的的四部分呈现了不同ZooKeeper高级概念的的讨论.理解Zook ...

  9. zookeeper程序员指南

    1 简介本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息.本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooK ...

随机推荐

  1. linux永久关闭防火墙

  2. [BAT]操作系统定时任务调用批处理忽略error继续运行的方法

    如下,通过forfiles删除7天以前生成的一些文件,当不存在满足搜索条件的文件时,就会报错:ERROR: No files found with the specified search crite ...

  3. 8个设计师必看的免费UI图标设计资源站

    图标是我们日常APP及网页设计过程中必不可少的元素之一,通过小小的图标,可以快速方便的实现视觉引导和功能划分.在创作时,我们需要寻找各种各样的图标来满足自己的设计需求,非常浪费时间和精力.今天,小编给 ...

  4. action spring 注入错误,如果检查各项注入都没有错误时,考虑struts 是否配置了namespace(如果你有多个namespace="/")

    [ERROR] 2015-01-04 09:42:35,180 (CommonsLogger.java:38) - Exception occurred during processing reque ...

  5. 学习bn算法

    好处: 1.归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低: 2.另外一方面,一旦每批训练数据的分布各不相同(b ...

  6. js技巧汇总

    1.window.open()打开一个子页面,在子页面关闭时刷新父页面 子页面关闭事件代码:window.opener.location.href=window.opener.location.hre ...

  7. Winform窗体控件级权限处理

    公共类: static class PowerHelper    {        /// <summary>         /// 设置form上的组件的权限         /// ...

  8. 替换SQL执行计划

    Switching two different SQL Plan with SQL Profile in Oracle... 当SQL是业务系统动态生成的,或者是第三方系统产生的,在数据库层面分析发现 ...

  9. Jsp的语法和指令

    Jsp的三种注释 前端语言注释:<!-- --> 会被转译,也会被发送,但是不会被浏览器执行 java语言注释: 会被转译,但是不会被servlet执行 Jsp注释:<%--  -- ...

  10. 2018.09.18 atcoder Best Representation(kmp)

    传送门 思路简单不知为何调试了很久. 显然要么分成n个(所有字符相同),要么分成1个(原字符串无循环节),要么分成两个(有长度至少为2的循环节). 一开始以为可以直接hash搞定. 后来wa了几次之后 ...