一、Zookeeper的四字命令

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 =

(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 =

(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 =

(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。

在这个示例中,我们没有在任何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学习第二期--Zookeeper命令操作的更多相关文章

  1. ZooKeeper学习第二期--ZooKeeper安装配置

    一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是在一台物 ...

  2. 【转载】ZooKeeper学习第二期--ZooKeeper安装配置

    原文地址(https://www.cnblogs.com/sunddenly/p/4018459.html) 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及 ...

  3. ZooKeeper学习第二期--ZooKeeper安装配置(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...

  4. [转]ZooKeeper学习第一期---Zookeeper简单介绍

    ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...

  5. ZooKeeper学习第一期---Zookeeper简单介绍

    一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同 ...

  6. ZooKeeper学习第一期---Zookeeper简单介绍(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技 ...

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

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

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

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

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

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

随机推荐

  1. Html模板渲染引擎Hogan

    Github:https://github.com/twitter/hogan.js 最简单的使用教程:http://www.imooc.com/article/18493

  2. (Hive)史上最难解析的json字符串解析出来了!!

    首先说下解析的数据如下: {"username":"king","actionInfo":{"id":1,"a ...

  3. js 控制输入文字个数(换行不算)

    如题,换行符在textarea中是要当成一个字符的.用普通的maxlength属性就不行了,于是想到通过事件来控制输入文字的长度. 注意哦,回车换行不能算成字符.这样的话,普通的substring等方 ...

  4. Entity Framework 动态构造Lambda表达式Expression<Func<T, bool>>

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  5. android 自定义流布局。实现热门标签。开源库SimpleFlowLayout

    前言 实际项目中需要实现一个 热门搜索 的栏目,类似下图: 由于 子项(子view) 中的文字是可变的,一行能显示的 子项 的个数也无法确定.需要支持自动换行和计算位置. 开源类库 我自己写了个 自定 ...

  6. 1px的border

    css中是这样写的: div{ border-bottom: 1px solid #dfe5e4; } 但在手机上,像素比不为 1 ,由于 webview 的灰度渲染, border 一般会显示为 2 ...

  7. PCL滤波介绍(3)

    (1)从一个点云中提取索引 如何使用一个,基于某一分割算法提取点云中的一个子集. 代码解析 #include <iostream> #include <pcl/ModelCoeffi ...

  8. Ubuntu下的OpenResty 安装

    安装前的准备 您必须将这些库 perl 5.6.1+, libreadline, libpcre, libssl安装在您的电脑之中. 对于 Linux来说, 您需要确认使用 ldconfig 命令,让 ...

  9. node学习笔记8——发布npm包

    1.注册一个npm账号: 2.在控制台输入 npm login: 依次输入你的账号信息,可通过 npm whoami 来验证是否登录成功 3.初始化包,控制台输入 npm init: 完成之后,可以看 ...

  10. TI webench 一款不错的软件

      之前在一些电子论坛的网站看到过关于TI webench的介绍,今天适用了一下,确实功能很强大,设计内容可以输入你所要设计的内容,包括下面内容: 下图是笔者设计的一个FPGA供电系统,采用5V输入, ...