zookeeper功能介绍(一)---用java介绍zookeeper数据结构

介绍:

本文主要介绍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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值