1. Zookeeper结构

1.1.ZooKeeper数据模型Znode

  ZooKeeper拥有一个层次化的目录结构,命名符合常规文件系统规范

  ZooKeeper树中的每个节点被称为—Znode,和文件系统的目录树一样,ZooKeeper树中的每个节点都有一个唯一的路径标识

  节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)

  客户端应用可以在节点上设置监视器

  

  图中的每个节点称为一个 Znode。 每个 Znode 由 3 部分组成

  ① stat:此为状态信息, 描述该 Znode 的版本, 权限等信息    ② data:与该 Znode 关联的数据    ③ children:该 Znode 下的子节点

ZooKeeper节点属性

通过前面的介绍,我们可以了解到,一个节点自身拥有表示其状态的许多重要属性,如下图所示。

 

ZooKeeper节点类型

1、Znode有两种类型:节点的类型在创建时即被确定,并且不能改变。

  临时节点(ephemeral)(断开连接自己删除)该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也

可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。

  永久节点(persistent)(断开连接不删除)该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

2、Znode 还有一个序列化的特性,如果创建的时候指定的话,该 Znode 的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一

的,这样便会记录每个子节点创建的先后顺序。它的格式为“%10d”(10 位数字,没有数值的数位用 0 补充,例如“0000000001”)

  这样便会存在四种类型的 Znode 节点,分别对应:

  PERSISTENT:永久节点

  EPHEMERAL:临时节点

  PERSISTENT_SEQUENTIAL:永久节点、序列化

  EPHEMERAL_SEQUENTIAL:临时节点、序列化

2. Zookeeper命令行客户端操作

  启动Zookeeper服务之后,输入以下命令,连接到Zookeeper服务:zkCli.sh -server localhost:2183(连接到自己的zookeeper服务)

                                  zkCli.sh -server shizhan2:2183(连接到其他的zookeeper服务)

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

会输出可用的Zookeeper命令,如下图所示

  

  输入connect zhizhan2:2183可以连接到其他zookeeper服务(默认端口是2181,我修改为2183了)

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

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

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

  (2) 创建一个新的Znode节点"zk",以及与它关联的字符串,执行命令:create /zk "myData"(默认持久节点)

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

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

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

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

[zk: localhost:2183(CONNECTED) 4] get /zk
"myData"
cZxid = 0x100000008
ctime = Tue Jun 05 19:02:42 CST 2018
mZxid = 0x100000008
mtime = Tue Jun 05 19:02:42 CST 2018
pZxid = 0x100000008
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

#监听这个节点的数据变化,当另外一个客户端改变/zk时,它会打出下面的

[zk: localhost:2181(CONNECTED) 4] get /zk watch

#WATCHER::

#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk  

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

[zk: localhost:2183(CONNECTED) 5] set /zk "zb"
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:2183(CONNECTED) 7] delete /zk

  (8)删除节点:rmr(删除下面的所有子节点,递归删除),执行命令:rmr /zk

[zk: localhost:2183(CONNECTED) 7] rmr /zk

2.2 Zookeeper的API的简单使用  

  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

  1.org.apache.zookeeper.Zookeeper 是客户端入口主类,负责建立zookeeper 集群的会话,并提供方法进行操作。

  如果要使用Zookeeper服务,应用程序首先必须创建一个Zookeeper实例,这时就需要使用此类。一旦客户端和Zookeeper服务建立起了连接,

Zookeeper系统将会给次连接会话分配一个ID值,并且客户端将会周期性的向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使

用Zookeeper API来做相应处理了

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

功能

描述

create

在本地目录树中创建一个节点

delete

删除一个节点

exists

测试本地是否存在目标节点

get/set data

从目标节点上读取 / 写数据

get/set ACL

获取 / 设置目标节点访问控制列表信息

get children

检索一个子节点上的列表

sync

等待要被传送的数据

  2.org.apache.zookeeper.Watcher

  Watcher 接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚举类,分别代表了通知状态和事件类型,

同时定义了事件的回调方法:process(WatchedEvent event)

  process 方法是 Watcher 接口中的一个回调方法,当 ZooKeeper 向客户端发送一个 Watcher 事件通知时,客户端就会对相应的 process 方法进行回调,

从而实现对事件的处理。 

if (event.getState() == KeeperState.SyncConnected) {
latch.countDown();
} // 发生了waitPath的删除事件
if (event.getType() == EventType.NodeDeleted && event.getPath().equals(waitPath)) {
doSomething();
}

2.3 Zookeeper JAVA API的使用(Demo增删改查程序)

import java.io.IOException;
import java.util.List;
import org.apache.zookeeper.CreateMode;
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; public class SimpleZkClient {
static ZooKeeper zkClient = null; // 会话超时时间,设置为与系统默认时间一致
private static final int sessionTimeout = 30000;
private static final String connectString = "shizhan2:2183,shizhan3:2183,shizhan5:2183"; public static void main(String[] args) throws Exception {
try {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher(){
@Override
// 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑),这是一次性通知
public void process(WatchedEvent event) {
             //事件类型:event.getType() 事件发生的路径:event.getPath() 通知状态:event.getState()
System.out.println(event.getType() +"-----------"+event.getPath());
try {
//循环监听,对节点进行监听true
zkClient.getChildren("/", true);
} catch (Exception e) {
}
}
});
} catch (IOException e) {
e.printStackTrace();
} //创建节点到zk中 参数1:要创建的节点的路径 参数2:节点数据 参数3:节点的权限 参数4:节点的类型
//上传的数据可以是任何类型,但都要转成byte[]
System.out.println("=========创建节点===========");
zkClient.create("/eclipse7", "hellozk111".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //获取znode的数据
byte[] data = zkClient.getData("/eclipse7", false, null);
System.out.println("=========查看创建的节点==========="+new String(data)); //判断znode是否存在
Stat stat = zkClient.exists("/eclipse4", false);
System.out.println("=========判断节点是否存在==========="+ stat==null?"not exist":"exist"); //获取子节点
List<String> children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
Thread.sleep(Long.MAX_VALUE); //删除znode
//参数2:指定要删除的版本,-1表示删除所有版本
zkClient.delete("/eclipse2", -1); zkClient.setData("/app1", "imissyou angelababy".getBytes(), -1);
byte[] da = zkClient.getData("/app1", false, null);
System.out.println(new String(data));
}
}

  

  

                          

  

  

  

  

  

8.4.Zookeeper结构和命令的更多相关文章

  1. zookeeper结构和命令

    1.1. zookeeper特性 1.Zookeeper:一个leader,多个follower组成的集群 2.全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个serv ...

  2. zookeeper学习(3)----基本结构和命令行操作命令

    一. 数据结构 https://www.jianshu.com/p/8e322462bcca zookeeper存储结构:以树形结构的方式存储数据 ZooKeeper数据模型的结构整体上可以看作是一棵 ...

  3. linux shell脚本使用结构化命令

    内容: 一.if-then命令 二.if-then-else命令 三.test命令 四.case命令 1.if-then结构化命令中最基本的类型,其格式如下: if command then comm ...

  4. Shell 语法之结构化命令(流程控制)

    许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...

  5. 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令

    许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then     ...

  6. zookeeper 四字命令

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

  7. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  8. bash&nbsp;shell笔记3&nbsp;结构化命令二

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/513601 三 ...

  9. bash&nbsp;shell笔记2&nbsp;结构化命令

    二.使用结构化命令 知识内容: # 改变命令流 # 使用if-then逻辑 # 嵌套if-then # 测试条件 # 高级if-then功能 许多程序在脚本命令之间需要某些逻辑控制流,有些命令允许脚本 ...

随机推荐

  1. .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控

    前言 .net core 2.* 实施性能监控 这个工具其实给运维 大大们用起来是更爽的.但是Grafana现在还没有找到中文版. 本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库, ...

  2. ActionScript的for循环

    actionscript支持的for循环有三种形式: 1.for(初始值;条件;递增) 例如: for(var x:int=1;x<=10;x++) trace(x); trace()会把结果输 ...

  3. [转帖]k8s.gcr.io镜像无法下载的问题

    k8s.gcr.io镜像无法下载的问题 https://blog.51cto.com/liuzhengwei521/2301497 看了下 赵安家老师应该是青岛人 在济南顺能网络科技有限公司上班 铭盛 ...

  4. [转帖]为何 linux 要用 tar.gz,而不用 7z 或 zip?

    为何 linux 要用 tar.gz,而不用 7z 或 zip? http://embeddedlinux.org.cn/emb-linux/entry-level/201908/13-8776.ht ...

  5. [转帖]使用Gnome文件管理器连接到服务器:FTP/SFTP、Samba、NFS的方法

    使用Gnome文件管理器连接到服务器:FTP/SFTP.Samba.NFS的方法 2019-05-09 16:28:44作者:雷增线稿源:云网牛站 https://ywnz.com/linuxyffq ...

  6. 初识numpy库

    numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型.多维数组上执行数值运算 numpy创建数组(矩阵): numpy中的数据类型: ...

  7. 分词搜索 sphinx3.1.1+php+mysql

    sphinx3.1.1的安装与使用 下载sphinx3.1.1 wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64. ...

  8. 使用 ASP.NET Core 的 gRPC 服务

    将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...

  9. c# TCP/IP协议利用Socket Client通信(只含客户端Demo)

    完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈. TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. ...

  10. C++内存分配和分区

    1.分配方式 静态分配: 静态区(全局区),分配全局变量.静态变量优先于main函数. 动态分配: (1)自动分配:栈区(2)手动分配:堆区,(malloc,free) (new,delete) 2. ...