一、启动并验证ZooKeeper
1、启动ZooKeeper
[hadoop@cloud05 bin]$ ./zkServer.sh start
[hadoop@cloud06 bin]$ ./zkServer.sh start
[hadoop@cloud07 bin]$ ./zkServer.sh start
2、验证ZooKeeper是否正常启动
[hadoop@cloud05 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[hadoop@cloud06 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[hadoop@cloud07 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
二、ZooKeeper基本操作
1、 连接ZooKeeper
[hadoop@cloud05 bin]$ ./zkCli.sh -server 192.168.2.35:2181
2 、创建znode节点
[zk: localhost:2181(CONNECTED) 2] create /zk 2000
Created /zk
3、获取节点的值
[zk: localhost:2181(CONNECTED) 3] get /zk
2000
4、 对zk节点重新赋值
[zk: localhost:2181(CONNECTED) 4] set /zk 5000
[zk: localhost:2181(CONNECTED) 5] get /zk 500
5000
5、 通过ls命令查看zookeeper包含内容
[zk: localhost:2181(CONNECTED) 6] ls /
[dubbo, configs, wk, zookeeper, clusterstate.json, aliases.json, live_nodes,
zk, overseer, overseer_elect, collections]
6、 删除znode节点
[zk: localhost:2181(CONNECTED) 21] delete /zk
三、通过JAVA API 操作ZooKeeper
org.apache.zookeeper.ZooKeeper类 主要方法列表
方法名称 | 描述 |
String create(final String path, byte data[], List acl, CreateMode createMode) | 创建一个znode节点, 参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型 |
void delete(final String path, int version) | 删除一个znode节点, 参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除; |
Stat exists(final String path, Watcher watcher) | 判断某个znode节点是否存在 参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher |
Stat exists(String path, boolean watch) | 判断某个znode节点是否存在 参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher |
Stat setData(final String path, byte data[], int version) | 设置某个znode上的数据 参数: 路径、数据、版本号;如果为-1,跳过版本检查 |
byte[] getData(final String path, Watcher watcher, Stat stat) | 获取某个znode上的数据 参数: 路径、监视器、数据版本等信息 |
List getChildren(final String path, Watcher watcher) | 获取某个节点下的所有子节点 参数: 路径、监视器;该方法有多个重载 |
package example;
import java.io.IOException;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
*
* @author shenfl
*
*/
public class ZooKeeperTest {
private static final String CONNECT_STR = "192.168.2.35:2181,192.168.2.36:2181";
private static final int SESSION_TIMEOUT = 30000;
private ZooKeeper zooKeeper;
/**
* 连接ZooKeeper
*/
@Before
public void connect() {
try {
zooKeeper = new ZooKeeper(CONNECT_STR, SESSION_TIMEOUT,
new Watcher() {
@Override
public void process(WatchedEvent e) {
System.out.println(" process : " + e.getType());
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 关闭ZooKeeper
*/
@After
public void close() {
try {
zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 创建znode
*PERSISTENT 持久化节点
PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1
EPHEMERAL 临时节点, 客户端session超时这类节点就会被自动删除
EPHEMERAL_SEQUENTIAL 临时自动编号节点
*/
@Test
public void testCreate() {
String rs = null;
try {
rs = zooKeeper.create("/zk", "data001".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("rs=>" + rs);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 设置znode下的数据,-1 表示对所有的版本
*/
@Test
public void testSetData() {
try {
// 当zk节点发生变化时需要 触发wacth
Stat stat = zooKeeper.setData("/zk", "data002".getBytes(), -1);
int version = stat.getVersion();
System.out.println("version=" + version);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 获取ZooKeeper中znode节点
*/
@Test
public void testGetData() {
byte[] zkB = null;
String zkData = "";
try {
zkB = zooKeeper.getData("/zk", null, null);
zkData = new String(zkB);
System.out.println("zkData:" + zkData);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 判断节点是否存在 设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper实例时指定的 watcher
*/
@Test
public void testExists() {
try {
Stat stat = zooKeeper.exists("/zk", true);
System.out.println(stat.getVersion());
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void testChilds() {
try {
if (zooKeeper.exists("/zk/zk01", false) == null) {
zooKeeper.create("/zk/zk01", "zk01".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
if (zooKeeper.exists("/zk/zk02", false) == null) {
zooKeeper.create("/zk/zk02", "zk02".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
List<String> childens = zooKeeper.getChildren("/zk", true);
for (String node : childens) {
System.out.println(node);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}