zookeeper基本操作
理解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基本操作的更多相关文章
- 4. ZooKeeper 基本操作
ZooKeeper的数据模型及其API支持以下九个基本操作: 操作 描述 create 在ZooKeeper命名空间的指定路径中创建一个znode delete 从ZooKeeper命名空间的指定路径 ...
- 转载:ZooKeeper Programmer's Guide(中文翻译)
本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息. 本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooKeep ...
- ZooKeeper程序员指南(转)
译自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 1 简介 本文是为想要创建使用ZooKeeper协调服务优势的分布式 ...
- ZooKeeper学习第四期---构建ZooKeeper应用
一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...
- zookeeper[1] (转)ZooKeeper Programmer's Guide(zookeeper编程向导)---中文
原文:http://www.cnblogs.com/Xrinehart/p/3512509.html 本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实 ...
- 【Zookeeper系列】构建ZooKeeper应用(转)
原文地址:https://www.cnblogs.com/sunddenly/p/4064992.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那 ...
- ZooKeeper系列 (4) 构建ZooKeeper应用
原文地址: http://www.cnblogs.com/wuxl360/p/5817540.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公 ...
- ZooKeeper开发者指南(五)
引言 这个文档是为了想利用ZooKeeper的协调服务来创建分布式应用的开发者提供的指南.它包括概念和实践的信息. 这个文档的一开始的的四部分呈现了不同ZooKeeper高级概念的的讨论.理解Zook ...
- zookeeper程序员指南
1 简介本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息.本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooK ...
随机推荐
- UI设计小白怎样学才能快速入门?
最近有很多同学问我,UI小白有什么捷径可以快速入门?其实我想说设计这门学科没有什么捷径,真的只有多学.多看.多练.多想.多做. 1.先学软件 如果你是小白,软件也不会用,那就先学软件,从PS开始,先看 ...
- Java数据结构和算法(二)顺序存储的树结构
Java数据结构和算法(二)顺序存储的树结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉树也可以用数组存储,可以和完 ...
- 删除pdf文件所有超链接
最近在读deep learning 书Bengio那本,在Github上面下载的,下载回来全都是超链接, 超级烦,比如点一下梯度下降法,就直接跳转到数后尾的index. 我看书还喜欢老点,所以要把他们 ...
- 【Mac】使用PicGIF制作gif动态图片
动态图片是我们常常需要的,mac系统下制作gif图片,可以使用PicGIF,AppStore中有一个简单版本免费的 环境与工具 1.mac系统 2.PicGIF Lite(可以在AppStore下载) ...
- nginx怎么与tomcat完美结合
nginx怎么与tomcat完美结合 现在公司一个服务器上需要部署两个项目,其中一个项目已经正式上线,并且已经占用了80端口,另外一个项目 部署上去后,访问必须要加端口号,这样的用户体验非常不好,那么 ...
- 2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)
传送门 如果有n==m的条件就是卡特兰数. 但现在n不一定等于m. 我们可以考虑用求卡特兰数一样的方法来求答案. 我们知道有一种求卡特兰数的方法是转到二维平面求答案. 这道题就可以这样做. 我们将这个 ...
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
- 2018.08.02 洛谷P3355 骑士共存问题(最小割)
传送门 这题让我联想到一道叫做方格取数问题的题,如果想使摆的更多,就要使不能摆的更少,因此根据骑士的限制条件建图,求出至少有多少骑士不能摆,减一减就行了. 代码: #include<bits/s ...
- 9) 依赖查询 & 镜像站
依赖查询 http://mvnrepository.com/ Maven仓库查询 http://search.maven.org 仓库 加上这两个,如果使用中央仓库 Eclipse 极有可能会卡死 & ...
- 简单的cxf-rs
整体结构 │ pom.xml │ └─src ├─main │ ├─java │ │ └─cn │ │ └─zno │ │ HelloWorld.java │ │ InputBean.java │ │ ...