Zookeeper支持某些特定的四字命令字母与其的交互。他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向Zookeeper提交相应的命令。Zookeeper常用的四字命令见下图所示。

aaarticlea/png;base64,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" alt="" width="527" height="328" />

上图,是Zookeeper四字命令的一个简单用例。

[root@hadoop ~]# echo ruok|nc localhost 2181
[root@hadoop ~]# zkServer.sh start zoo1.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo1.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]# zkServer.sh start zoo2.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo2.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]# zkServer.sh start zoo3.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]# echo ruok|nc localhost 2181
imok[root@hadoop ~]# echo ruok|nc localhost 2182
imok[root@hadoop ~]# echo ruok|nc localhost 2183
imok[root@hadoop ~]# echo conf|nc localhost 2181
clientPort=2181
dataDir=/usr/local/zk/data_1/version-2
dataLogDir=/usr/local/zk/logs_1/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3387
quorumPort=2287
peerType=0
[root@hadoop ~]#

二、Zookeeper的简单操作

2.1  Zookeeper的shell操作

2.1.1 Zookeeper命令工具

再启动Zookeeper服务之后,输入以下命令,连接到Zookeeper服务:

    zkCli.sh -server localhost:2181

执行结果如下所示:

[root@hadoop ~]# zkCli.sh -server localhost:2181
Connecting to localhost:2181
2014-10-17 03:35:51,051 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT
2014-10-17 03:35:51,055 [myid:] - INFO [main:Environment@100] - Client environment:host.name=hadoop
2014-10-17 03:35:51,057 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.6.0_24
2014-10-17 03:35:51,057 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Sun Microsystems Inc.
2014-10-17 03:35:51,066 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/local/jdk/jre
2014-10-17 03:35:51,079 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zk/bin/../build/classes:/usr/local/zk/bin/../build/lib/*.jar:/usr/local/zk/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zk/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zk/bin/../lib/netty-3.2.2.Final.jar:/usr/local/zk/bin/../lib/log4j-1.2.15.jar:/usr/local/zk/bin/../lib/jline-0.9.94.jar:/usr/local/zk/bin/../zookeeper-3.4.5.jar:/usr/local/zk/bin/../src/java/lib/*.jar:/usr/local/zk/bin/../conf:
2014-10-17 03:35:51,083 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/local/jdk/jre/lib/i386/client:/usr/local/jdk/jre/lib/i386:/usr/local/jdk/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
2014-10-17 03:35:51,084 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2014-10-17 03:35:51,086 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2014-10-17 03:35:51,099 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2014-10-17 03:35:51,100 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=i386
2014-10-17 03:35:51,101 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.i686
2014-10-17 03:35:51,101 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2014-10-17 03:35:51,102 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2014-10-17 03:35:51,106 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/root
2014-10-17 03:35:51,120 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@b02e7a
Welcome to ZooKeeper!
JLine support is enabled
2014-10-17 03:35:51,233 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (Unable to locate a login configuration)
2014-10-17 03:35:51,247 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/127.0.0.1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2014-10-17 03:35:51,290 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x491da0e20b0000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0]

连接成功之后,系统会输出Zookeeper的相关环境及配置信息,并在屏幕输出“welcome to Zookeeper!”等信息。输入help之后,屏幕会输出可用的Zookeeper命令,如下图所示

aaarticlea/png;base64,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" alt="" width="976" height="381" />

2.1.2 使用Zookeeper命令的简单操作步骤

(1) 使用ls命令查看当前Zookeeper中所包含的内容:ls /

[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 2]

(2) 创建一个新的Znode节点"zk",以及和它相关字符,执行命令:create /zk myData

[zk: localhost:2181(CONNECTED) 2] create /zk myData
Created /zk

(3) 再次使用ls命令来查看现在Zookeeper的中所包含的内容:ls /

[zk: localhost:2181(CONNECTED) 3] ls /
[zk, zookeeper]

此时看到,zk节点已经被创建。  

(4) 使用get命令来确认第二步中所创建的Znode是否包含我们创建的字符串,执行命令:get /zk

[zk: localhost:2181(CONNECTED) 4] get /zk
myData
cZxid = 0x500000006
ctime = Fri Oct 17 03:54:20 PDT 2014
mZxid = 0x500000006
mtime = Fri Oct 17 03:54:20 PDT 2014
pZxid = 0x500000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

(5) 接下来通过set命令来对zk所关联的字符串进行设置,执行命令:set /zk jiang1234

[zk: localhost:2181(CONNECTED) 5] set /zk jiang2014
cZxid = 0x500000006
ctime = Fri Oct 17 03:54:20 PDT 2014
mZxid = 0x500000007
mtime = Fri Oct 17 03:55:50 PDT 2014
pZxid = 0x500000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0

(6) 再次使用get命令来查看,上次修改的内容,执行命令:get /zk

[zk: localhost:2181(CONNECTED) 6] get /zk
jiang2014
cZxid = 0x500000006
ctime = Fri Oct 17 03:54:20 PDT 2014
mZxid = 0x500000007
mtime = Fri Oct 17 03:55:50 PDT 2014
pZxid = 0x500000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0

(7) 下面我们将刚才创建的Znode删除,执行命令:delete /zk

[zk: localhost:2181(CONNECTED) 7] delete /zk

(8) 最后再次使用ls命令查看Zookeeper中的内容,执行命令:ls /

[zk: localhost:2181(CONNECTED) 8] ls /
[zookeeper]

经过验证,zk节点已经删除。

2.2 Zookeeper的api的简单使用

2.2.1 ZookeeperAPI简介

Zookeeper API共包含五个包,分别为:

  (1)org.apache.zookeeper
  (2)org.apache.zookeeper.data
  (3)org.apache.zookeeper.server
  (4)org.apache.zookeeper.server.quorum
  (5)org.apache.zookeeper.server.upgrade

其中org.apache.zookeeper,包含Zookeeper类,他是我们编程时 最常用的类文件。这个类是Zookeeper客户端的主要类文件。如果要使用Zookeeper服务,应用程序首先必须创建一个Zookeeper实例, 这时就需要使用此类。一旦客户端和Zookeeper服务建立起了连接,Zookeeper系统将会给次连接会话分配一个ID值,并且客户端将会周期性的 向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使用Zookeeper API来做相应处理了。

Zookeeper类提供了如下图所示的几类主要方法

aaarticlea/png;base64,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" alt="" />

2.2.2 Zookeeper API的使用

这里通过一个例子来简单介绍如何使用Zookeeper API 编写自己的应用程序,代码如下:

package org.zk;

import java.io.IOException;
import java.util.List; import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper; public class ListGroup extends ConnectionWatcher {
public void list(String groupNmae) throws KeeperException, InterruptedException{
String path ="/"+groupNmae;
try {
List<String> children = zk.getChildren(path, false);
if(children.isEmpty()){
System.out.printf("No memebers in group %s\n",groupNmae);
System.exit(1);
}
for(String child:children){
System.out.println(child);
}
} catch (KeeperException.NoNodeException e) {
System.out.printf("Group %s does not exist \n", groupNmae);
System.exit(1);
}
}
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ListGroup listGroup = new ListGroup();
listGroup.connect(args[0]);
listGroup.list(args[1]);
listGroup.close();
}
}

此类包含两个主要的 ZooKeeper 函数,分别为 createZKInstance ()和 ZKOperations()。其中:

(1) createZKInstance()函数负责对 ZooKeeper 实例 zk 进行初始化。

ZooKeeper 类有两个构造函数,我们这里使用“ ZooKeeper (String connectString, int sessionTimeout ,Watcher watcher )”对其进行初始化。因此,我们需要提供初始化所需的,连接字符串信息,会话超时时间,以及一个 watcher 实例。 19行到 25行代码,是程序所构造的一个watcher 实例,它能够输出所发生的事件。

(2) ZKOperations ()函数是我们所定义的对节点的一系列操作。

它包括:创建 ZooKeeper 节点( 35行到 36行代码)、查看节点( 38 行到 39 行代码)、修改节点数据( 41 行到 42 行代码)、查看修改后节点数据( 44 行到 45行代码)、删除节点( 47行到 48行代码)、查看节点是否存在( 50 行到 51 行代码)。

代码的运行结果如下:

1. 创建ZooKeeper节点(Znode:/znode;数据:myData2;权限:OPEN_ACL_UNSAFE;节点类型:Persistent)
None
2. 查看节点是否创建成功:
/znode myData2
3. 修改节点数据:
4. 查看是否修改成功:
jiang1234
5. 删除节点:
6. 查看/znode节点状态:
节点间状态:[null]

三、ZooKeeper示例

假设一组服务器,用于为客户端提供一些服务。我们希望每个客户端都能够能够找到其中一台服务器,使其能够使用这些服务,挑战之一就是维护这组服务器 列表。这组服务器的成员列表明显不能存在网络中的单个节点上,因为如果那个节点发生故障,就意味着是整个系统的故障(我们希望这个列表有很高的可用性)。 假设我们有了一个可靠的方法解决了这个成员列表的存储问题。如果其中一台服务器出现故障,我们仍然需要解决如何从服务器成员列表中将它删除的问题。某个进 程需要负责删除故障服务器,但注意不能由故障服务器自己来完成,因为故障服务器已经不再运行。

我们所描述的不是一个被动的分布式数据结构,而是一个主动的、能够在某个外部事件发生时修改数据项状态的数据结构。ZooKeeper提供这种服务,所以让我们看看如何使用它来实现这种众所周知的组成员管理应用。

ZooKeeper中的组成员关系

理解ZooKeeper的一种方法就是将其看作一个具有高可用性的文件系统。但这个文件系统中没有文件和目录,而是统一使用“节点”(node)的概念,称为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成一个层次化的命名空间。一种自然的建立组成员列表的方式就是利用这种层次结构,创建一个以组名为节点名的znode作为父节点,然后以组成员名(服务器名)为节点名来创建作为子节点的znode。如下图给出了一组具有层次结构的znode。

aaarticlea/png;base64,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" alt="" width="331" height="288" />

在这个示例中,我们没有在任何znode中存储数据,但在一个真实的应用中,你可以将“关于成员的数据”存储在它们的znode中,例如主机名。

3.1 创建组

3.1.1 代码示例

让我们通过编写一段程序的方式来再次详细介绍ZooKeeper的Java API,这段示例程序用于为组名为/zoo的组创建一个znode。代码参见如下

代码 该程序在ZooKeeper中新建表示组的Znode

package org.zk;

import java.io.IOException;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; public class CreateGroup implements Watcher{
private static final int SESSION_TIMEOUT=5000; private ZooKeeper zk;
private CountDownLatch connectedSignal=new CountDownLatch(1);
@Override
public void process(WatchedEvent event) {
if(event.getState()==KeeperState.SyncConnected){
connectedSignal.countDown();
}
} public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
CreateGroup createGroup = new CreateGroup();
createGroup.connect(args[0]);
createGroup.create(args[1]);
createGroup.close();
} private void close() throws InterruptedException {
zk.close();
} private void create(String groupName) throws KeeperException, InterruptedException {
String path="/"+groupName;
if(zk.exists(path, false)== null){
zk.create(path, null/*data*/, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
System.out.println("Created:"+path);
} private void connect(String hosts) throws IOException, InterruptedException {
zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
connectedSignal.await();
}
}

运行该程序需要配置classpath环境变量或者在执行java命令时添加-classpath选项,具体运行方式参见:http://www.cnblogs.com/sunddenly/p/4050812.html

运行后的结果为:

[root@hadoop code]# ls
build classes CreateGroup.java HelloWorld.java jar.jar PackageTest.java zookeeper.out
[root@hadoop code]# javac -d ./classes CreateGroup.java
[root@hadoop code]# java org.zk.CreateGroup localhost:2181 zoo
2014-10-28 18:00:26,154 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on
2014-10-28 18:00:26,157 [myid:] - INFO [main:Environment@100] - Client environment:host.name=hadoop
2014-10-28 18:00:26,157 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.6.0_24
2014-10-28 18:00:26,157 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Sun Microsystems Inc.
2014-10-28 18:00:26,158 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/local/jdk/jre
2014-10-28 18:00:26,158 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=……
……
Created:/zoo
2014-10-28 18:00:26,236 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x4956f7f1d70005 closed
2014-10-28 18:00:26,237 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@509] - EventThread shut down
[root@hadoop code]#

3.1.2 代码分析

在上面代码中,main()方法执行时,创建了一个CreateGroup实例并且调用了这个实例的connect()方法。connect方法实例化了一个新的ZooKeeper类的对象,这个类是客户端API中的主要类,并且负责维护客户端和ZooKeeper服务之间的连接。ZooKeeper类的构造函数有三个参数:
  第一个是:ZooKeeper服务的主机地址,可指定端口,默认端口是2181。
  第二个是:以毫秒为单位的会话超时参数,这里我们设成5秒。
  第三个是:参数是一个Watcher对象的实例。
Watcher对象接收来自于ZooKeeper的回调,以获得各种事件的通知。在这个例子中,CreateGroup是一个Watcher对象,因此我们将它传递给ZooKeeper的构造函数。
当一个ZooKeeper的实例被创建时,会启动一个线程连接到ZooKeeper服务。由于对构造函数的调用是立即返回的,因此在使用新建的ZooKeeper对象之前一定要等待其与ZooKeeper服务之间的连接建立成功。我们使用Java的CountDownLatch类来阻止使用新建的ZooKeeper对象,直到这个ZooKeeper对象已经准备就绪。这就是Watcher类的
用途,在它的接口中只有一个方法:
    public void process(WatcherEvent event);
客 户端已经与ZooKeeper建立连接后,Watcher的process()方法会被调用,参数是一个表示该连接的事件。在接收到一个连接事件(由 Watcher.Event.KeeperState的枚举型值SyncConnected来表示)时,我们通过调用CountDownLatch的countDown()方法来递减它的计数器。锁存器(latch)被创建时带有一个值为1的计数器,用于表示在它释放所有等待线程之前需要发生的事件数。在调用一欢countDown()方法之后,计数器的值变为0,则await()方法返回。
现在connect()方法已经返回,下一个执行的是CreateGroup的create()方法。在这个方法中,我们使用ZooKeeper实例中的create()方法来创建一个新的ZooKeeper的znode。所需的参数包括:
    路径:用字符串表示。
    znode的内容:字节数组,本例中使用空值。
    访问控制列表:简称ACL,本例中使用了完全开放的ACL,允许任何客户端对znode进行读写。
    创建znode的类型:有两种类型的znode:短暂的和持久的。

创建znode的客户端断开连接时,无论客户端是明确断开还是因为任何原因而终止,短暂znode都会被ZooKeeper服务删除。与之相反,当 客户端断开连接时,持久znode不会被删除。我们希望代表一个组的znode存活的时间应当比创建程序的生命周期要长,因此在本例中我们创建了一个持久 的znode。

create()方法的返回值是ZooKeeper所创建的路径,我们用这个返回值来打印一条表示路径成功创建的消息。当我们查看“顺序znode”(sequential znode)时.会发现create()方法返回的路径与传递给该方法的路径不同。

3.2 加入组

下面的这一段程序用于注册组的成员。每个组成员将作为一个程序运行,并且加入到组中。当程序退出时,这个组成员应当从组中被删除。为了实现这一点,我们在ZooKeeper的命名空间中使用短暂znode来代表一个组成员。

在基类ConnectionWatcher中,对创建和连接ZooKeeper实例的程序逻辑进行了重构,参见代码如下

代码 用于将成员加入组的程序

package org.zk;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids; public class JoinGroup extends ConnectionWatcher{
public void join(String groupName,String memberName) throws KeeperException, InterruptedException{
String path="/"+groupName+"/"+memberName;
String createdPath=zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Created:"+createdPath);
}
public static void main(String[] args) throws InterruptedException, IOException, KeeperException {
JoinGroup joinGroup = new JoinGroup();
joinGroup.connect(args[0]);
joinGroup.join(args[1], args[2]); //stay alive until process is killed or thread is interrupted
Thread.sleep(Long.MAX_VALUE);
}
}

代码 3.3 用于等待建立与ZooKeeper连接的辅助类

package org.zk;

import java.io.IOException;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper; public class ConnectionWatcher implements Watcher{
private static final int SESSION_TIMEOUT=5000; protected ZooKeeper zk;
CountDownLatch connectedSignal=new CountDownLatch(1);
public void connect(String host) throws IOException, InterruptedException{
zk=new ZooKeeper(host, SESSION_TIMEOUT, this);
connectedSignal.await();
}
@Override
public void process(WatchedEvent event) {
if(event.getState()==KeeperState.SyncConnected){
connectedSignal.countDown();
}
}
public void close() throws InterruptedException{
zk.close();
} }

JoinGroup的代码与CreateGroup非常相似,在它的join()方法中,创建短暂znode,作为组znode的子节点,然后通过 休眠来模拟正在做某种工作,直到该进程被强行终止。接着,你会看到随着进程终止,这个短暂znode被ZooKeeper删除。

3.3 列出组成员

现在,我们需要一段程序来查看组成员,参见代码如下:

代码 用于列出组成员的程序

package org.zk;

import java.io.IOException;
import java.util.List; import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper; public class ListGroup extends ConnectionWatcher {
public void list(String groupNmae) throws KeeperException, InterruptedException{
String path ="/"+groupNmae;
try {
List<String> children = zk.getChildren(path, false);
if(children.isEmpty()){
System.out.printf("No memebers in group %s\n",groupNmae);
System.exit(1);
}
for(String child:children){
System.out.println(child);
}
} catch (KeeperException.NoNodeException e) {
System.out.printf("Group %s does not exist \n", groupNmae);
System.exit(1);
}
}
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ListGroup listGroup = new ListGroup();
listGroup.connect(args[0]);
listGroup.list(args[1]);
listGroup.close();
}
}

在list()方法中,我们调用了getChildren()方法来检索并打印输出一个znode的子节点列表,调用参数为:该znode的路径和 设为false的观察标志。如果在一znode上设置了观察标志,那么一旦该znode的状态改变,关联的观察(Watcher)会被触发。虽然在这里我 们可以不使用观察,但在查看一个znode的子节点时,也可以设置观察,让应用程序接收到组成员加入、退出和组被删除的有关通知。

在这段程序中,我们捕捉了KeeperException.NoNodeException异常,代表组的znode不存在时,这个异常就会被抛 出。下面看一下ListGroup程序的工作过程:虽然搭建了分布式的ZooKeeper,但分布式ZooKeeper启动运行比较耗时,我在这采用前面 提到的复制模式下的ZooKeeper来进行测试。

首先我们得启动ZooKeeper,启动以后将上面的源程序放到Linux目录中并进行编译,我将其放到了"/usr/code"目录下,并在该目录下创建一个classes文件夹,用于存放生成字节码文件:

[root@hadoop ~]# cd /usr/code
[root@hadoop code]# ls
ConnectionWatcher.java DeleteGroup.java ListGroup.java
classes CreateGroup.java JoinGroup.java PackageTest.java
[root@hadoop code]# javac -d ./classes ConnectionWatcher.java
[root@hadoop code]# javac -d ./classes *.java

由于目前我们还没有在组中添加任何成员,因此zoo是空的:

[root@hadoop code]# java org.zk.ListGroup  localhost zoo
2014-10-30 01:52:19,703 [myid:] - INFO [main:Environment@100] - Client environment:……
……
No memebers in group zoo

我们可以使用JoinGroup来向组中添加成员。在sleep语句的作用下,这些作为组成员的znode不会自己终止,所以我们可以,以后台进程的方式来启动他们:

[root@hadoop code]# java org.zk.JoinGroup localhost zoo duck &
2014-10-30 02:06:05,018 [myid:] - INFO [main:Environment@100] - Client environment:……
……
Created:/zoo/duck
[root@hadoop code]# java org.zk.JoinGroup localhost zoo cow &
2014-10-30 02:06:05,018 [myid:] - INFO [main:Environment@100] - Client environment:……
……
Created:/zoo/cow
[root@hadoop code]# java org.zk.JoinGroup localhost zoo goat &
2014-10-30 02:06:05,018 [myid:] - INFO [main:Environment@100] - Client environment:……
……
Created:/zoo/goat

最后一行命令保存了将goat添加到组中的java进程的ID。我们需要保存这个进程的ID,以便能够在查看组成员之后杀死进程。

[root@hadoop code]#
2014-10-30 03:15:30,619 [myid:] - INFO [main:Environment@100] - Client environment:……
……
duck
cow
goat

为了从组中删除一个成员,我们杀死了goat所对应的进程:

[root@hadoop code]# kill $goat_pid
几秒钟之后,由于进程的ZooKeeper会话已经结束(超时为5秒),所以goat会从组成员列表消失,并且对应的短暂znode也已经被删除。
[root@hadoop code]# java org.zk.ListGroup localhost zoo
2014-10-30 03:23:41,120 [myid:] - INFO [main:Environment@100] - Client environment:……
……
duck
cow

对于参与到一个分布式系统中的节点,这样就有了一个建立节点列表的方法。这些节点也许彼此并不了解。例如,一个想使用列表中节点来完成某些工作的客 户端,能够在这些节点不知道客户端的情况下发现它们。最后,注意,组成员关系管理并不能解决与节点通信过程中出现的网络问题。即使一个节点是一个组中的成 员,在与其通信的过程中仍然会出现故障,这种故障必须以一种合适的方式解决(重试、使用组中另外一个成员等)。☆☆☆

3.4 ZooKeeper命令行工具

ZooKeeper提供了一个命令行工具用于在其命名空间内进行交互。我们可以使用这个命令工具列出/zoo节点之下的znode列表,如下所示

[root@hadoop code]# zkCli.sh -server localhost ls /zoo
Connecting to localhost
……
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[duck, cow]
[root@hadoop code]#

3.5 删除组

下面来看如何删除一个组。ZooKeeper类提供了一个delete()方法,该方法有两个参数:

1. 路径

2. 版本号

如果所提供的版本号与znode的版本号一致,ZooKeeper会删除这个znode。这是一种乐观的加锁机制,使客户端能够检测出对znode的修改冲突。通过将版本号设置为-1,可以绕过这个版本检测机制,不管znode的版本号是什么而直接将其删除。ZooKeeper不支持递归的删除操作,因此在删除父节点之前必须先删除子节点。

在代码3.5中,DeleteGroup类用于删除一个组及其所有成员。
代码3.5用于删除一个组及其所有成员的程序

package org.zk;

import java.io.IOException;
import java.util.List; import org.apache.zookeeper.KeeperException; public class DeleteGroup extends ConnectionWatcher{
public void delete(String groupName) throws InterruptedException, KeeperException{
String path="/"+groupName;
List<String> children;
try {
children = zk.getChildren(path, false);
for(String child:children){
zk.delete(path+"/"+child, -1);
}
zk.delete(path, -1);
} catch (KeeperException.NoNodeException e) {
System.out.printf("Group %s does not exist\n", groupName);
System.exit(1);
}
}
public static void main(String[] args) throws InterruptedException, IOException, KeeperException {
DeleteGroup deleteGroup = new DeleteGroup();
deleteGroup.connect(args[0]);
deleteGroup.delete(args[1]);
deleteGroup.close();
}
}

最后,我们可以删除之前所创建的zoo组:

[root@hadoop code]# java org.zk.DeleteGroup localhost zoo
……
[root@hadoop code]# java org.zk.ListGroup localhost zoo
2014-10-30 05:39:41,974 [myid:] - INFO [main:Environment@100] - Client environment:……
Group zoo does not exist
[root@hadoop code]#

Zookeeper命令操作的更多相关文章

  1. ZooKeeper学习第三期---Zookeeper命令操作

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  2. 【Zookeeper系列】Zookeeper命令操作(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...

  3. 5、Zookeeper命令操作

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  4. 【转】ZooKeeper学习第二期--Zookeeper命令操作

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  5. ZooKeeper学习第三期---Zookeeper命令操作(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...

  6. ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作

    问题导读1.ZooKeeper包含哪些常用命令?2.通过什么命令可以列出服务器 watch 的详细信息?3.ZooKeeper包含哪些操作?4.ZooKeeper如何创建zookeeper? 常用命令 ...

  7. ZooKeeper系列(3)命令操作 (转)

    原文地址:http://www.cnblogs.com/wuxl360/p/5817524.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多 ...

  8. zk 06之:ZooKeeper命令、命令行工具及简单操作

    常用命令ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 ZooK ...

  9. Zookeeper系列一:Zookeeper基础命令操作

    有些事不是努力就可以改变的,五十块的人民币设计的再好看,也没有一百块的招人喜欢. 前言 由于公司年底要更换办公地点,所以最近投了一下简历,发现面试官现在很喜欢问dubbo.zookeeper和高并发等 ...

随机推荐

  1. X86-64寄存器和栈帧

    简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...

  2. 在Linux上使用iptables命令开启对外访问的网络端口

    如果linux下没有开启对某端口访问权限,你可以通过下面的命令可以开启允许对外访问的网络端口,示例如下: [root@asg76 sysconfig]# iptables -I INPUT -p tc ...

  3. 如何使用屏幕取色工具ColorPixl

    ColorPix可以屏幕取色,假如现在想要取色桌面徽标键的颜色,按任意键可以锁定这个区域(press any key to lock)这样我们就可以在放大的区域更清楚的取色,加号按钮可以设置该软件是否 ...

  4. Silverlight 之 断点调试

    silverlight程序经常会遇到无法调试的情况,下面来总结解决方案. 一.问题描述 在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题.如下几种情况: 1. ...

  5. ZOJ 2319 Beautiful People

    LIS.先按S降序升序再按B降序排序(如果B不按降序排序的话就会覆盖掉正解),然后再对B用O(nlog(n))的LIS求解就可以了.用d数组标记每个元素在上升序列中的位置,然后根据d倒着找id就可以了 ...

  6. IOS 将公历日期转换为中国农历

    代码方法: //日期阳历转换为农历: - (NSString *)convertDateToNongLi:(NSString *)aStrDate { NSDate *dateTemp = nil; ...

  7. 微信小程序 - 生命周期

    生命周期 1.小程序注册完成后,加载页面,触发onLoad方法.(切记,onShow和onLoad的区别,onShow是每当进入这个页面时就会触发,而onload是载入进来时才触发) 2.页面载入后触 ...

  8. No configuration found for the specified action解决办法(转)

    使用Struts2,配置一切正常,使用常用tag也正常,但是在使用<s:form>标记时,发现控制台总是输出警告信息, 警告信息内容如下: 警告: No configuration fou ...

  9. 图说十大数据挖掘算法(一)K最近邻算法

    如果你之前没有学习过K最近邻算法,那今天几张图,让你明白什么是K最近邻算法. 先来一张图,请分辨它是什么水果 很多同学不假思索,直接回答:“菠萝”!!! 仔细看看同学们,这是菠萝么?那再看下边这这张图 ...

  10. FIS3 构建 工程化

    1.安装 npm install -g fis3 //插件 npm install -g fis3-hook-relative npm install -g fis3-preprocessor-aut ...