介绍:
本文主要介绍zookeeper的数据结构,主要是结合java对zookeeper的操作介绍zookeeper的数据结构及功能。
zookeeper的安装及配置,不是本文介绍的范文,本文假定已经安装并启动好了zookeeper。
一、java操作zookeeper的jar包:
java操作zookeeper我们一般采用zkclient包,maven配置如下:
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
二、zookeeper的数据结构:
zookeeper的数据结构类似于linux的文件结构,如下图就很好的解释zookeeper的数据结构。
zookeeper有4种数据节点,分别是:永久节点(PERSISTENT),永久顺序节点(PERSISTENT_SEQUENTIAL),临时节点(EPHEMERAL),临时顺序节点(EPHEMERAL_SEQUENTIAL);
下面就用一段代码把zookeeper的所有节点全部列出来。
package com.lan.LanUtil;
import java.util.List;
import org.I0Itec.zkclient.ZkClient;
public class ShowAllZookeeperPath {
private static String zkServer = "192.168.9.188:2181";//zookeeper地址
public static void main(String[] args) {
ZkClient zkClient = new ZkClient(zkServer);//创建zookeeper的java客户端连接
showZkPath(zkClient, "/");
zkClient.close();
}
/**
* 遍历展示目录下的所有节点
* @author LAN
* @date 2018年12月3日
* @param zkClient
* @param root
*/
public static void showZkPath(ZkClient zkClient, String root) {
List<String> children = zkClient.getChildren(root);//获取节点下的所有直接子节点
if (children.isEmpty()) {
return;
}
for (String s : children) {
String childPath = root.endsWith("/") ? (root + s) : (root + "/" + s);
System.err.println(childPath);
showZkPath(zkClient, childPath);//递归获取所有子节点
}
}
}
在没有对zookeeper做任何操作之前,打印所有zookeeper根目录下的所有子节点结果如下:
其默认有zookeeper节点和quota子节点,由此可看出zookeeper的数据结构类似于目录结构;下面再介绍如何对zookeeper进行操作。
三、zookeeper创建各种节点及节点删除;
package com.lan.LanUtil;
import java.util.List;
import org.I0Itec.zkclient.ZkClient;
public class ZookeeperTest {
private static String zkServer = "192.168.9.188:2181";//zookeeper地址
public static void main(String[] args) {
ZkClient zkClient = new ZkClient(zkServer);//创建zookeeper的java客户端连接
if(!zkClient.exists("/LAN")) {
zkClient.createPersistent("/LAN");
}
System.err.println("***************在/LAN下分别创建4种节点***************");
if(!zkClient.exists("/LAN/永久节点1")) {
zkClient.createPersistent("/LAN/永久节点1");
}
String s1 = zkClient.createPersistentSequential("/LAN/永久顺序节点", null);
zkClient.createEphemeral("/LAN/临时节点1");
zkClient.createEphemeralSequential("/LAN/临时顺序节点1", null);
showZkPath(zkClient, "/LAN");//展示LAN目录下的所有子目录
System.err.println("***************关闭客户端再创建新的客户端***************");
zkClient.close();
zkClient = new ZkClient(zkServer);//创建zookeeper的java客户端连接
showZkPath(zkClient, "/LAN");//展示LAN目录下的所有子目录
System.err.println("***************删除节点s1***************");
zkClient.delete(s1);//删除某个节点,如果该节点下有子节点,则会报错
showZkPath(zkClient, "/LAN");//展示LAN目录下的所有子目录
zkClient.deleteRecursive("/LAN");//强制删除某个节点,并且删除节点下的所有子节点
zkClient.close();
}
/**
* 遍历展示目录下的所有节点
* @author LAN
* @date 2018年12月3日
* @param zkClient
* @param root
*/
public static void showZkPath(ZkClient zkClient, String root) {
List<String> children = zkClient.getChildren(root);//获取节点下的所有直接子节点
if (children.isEmpty()) {
return;
}
for (String s : children) {
String childPath = root.endsWith("/") ? (root + s) : (root + "/" + s);
System.err.println(childPath);
showZkPath(zkClient, childPath);//递归获取所有子节点
}
}
}
运行结果如下:
1、首先创建4种节点:
zkClient.createPersistent("/LAN/永久节点1");
zkClient.createPersistentSequential("/LAN/永久顺序节点", null);
zkClient.createEphemeral("/LAN/临时节点1");
zkClient.createEphemeralSequential("/LAN/临时顺序节点1", null);
结果4个节点都打印出来了,普通节点的名称是我们自定义的,而顺序节点的名称是zookeeper自动赋予的,并且会自动递增(自动递增这一点很重要)。
2、接下来关闭客户端,然后再创建新的客户端,展示所有节点。发现刚才创建的临时节点都没有了。这是zookeeper临时节点的一个特性(当创建临时节点的客户端关闭了,则其创建的临时节点会被自动删除)。
3、节点删除有2种方法,delete和deleteRecursive。delete用于删除某个节点,如果该节点下有子节点,则会报错。deleteRecursive用于强制删除某个节点,并且删除节点下的所有子节点。这2个方法均可用于删除4种节点。
总结:
zookeeper的数据结构类似于linux目录,并且其中有4中节点,分别是永久节点、临时节点、永久顺序节点、临时顺序节点。顺序节点的节点名称由zookeeper自动生成并且递增。临时节点随着客户端的关闭而被自动删除。
这一章节暂时不介绍如何在节点上存储和读取数据。
author:蓝何忠
email:lanhezhong@163.com