Zookeeper 入门(2):命令行操作,IDEA操作,节点的增删改查,监控

客户端命令行操作

语法概览

命令基本语法功能描述
help显示所有操作命令
ls path使用 ls 命令来查看当前 znode 的子节点 [可监听]
-w :监听子节点变化
-s: 附加次级信息
create普通创建
-s: 含有序列
-e: 临时(重启或者超时消失)
get path获得节点的值 [可监听]
-w :监听节点内容变化
-s: 附加次级信息
set设置节点的具体值
stat查看节点状态
delete删除节点
deleteall递归删除节点
  • 1)启动客户端
    [atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh -server hadoop102:2181
    
  • 2)显示所有操作命令
    [zk: hadoop102:2181(CONNECTED) 1] help
    

znode 节点数据信息

  • 1)查看当前 znode 中所包含的内容

    [zk: hadoop102:2181(CONNECTED) 0] ls /
    [zookeeper]
    
  • 2)查看当前节点详细数据

    [zk: hadoop102:2181(CONNECTED) 5] ls -s /
    [zookeeper]cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 1
    
    • (1)czxid: 创建节点的事务 zxid
      每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。用来保证时序性
    • (2)ctime: znode 被创建的毫秒数(从 1970 年开始)
    • (3)mzxid: znode 最后更新的事务 zxid
    • (4)mtime: znode 最后修改的毫秒数(从 1970 年开始)
    • (5)pZxid:znode 最后更新的子节点 zxid
    • (6)cversion:znode 子节点变化号,znode 子节点修改次数
    • (7)dataversion:znode 数据变化号
    • (8)aclVersion:znode 访问控制列表的变化号
    • (9)ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0。
    • (10)dataLength:znode 的数据长度
    • (11)numChildren:znode 子节点数量

节点类型(持久/短暂/有序号/无序号)

在这里插入图片描述

  • (1)持久化目录节点
    客户端与Zookeeper断开连接后,该节点依旧存在
  • (2)持久化顺序编号目录节点
    客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  • 3)临时目录节点
    客户端与Zookeeper断开连接后,该节点被删除
  • (4)临时顺序编号目录节点
    客户端与 Zookeeper 断开连接后 , 该节点被删除 ,只是 Zookeeper 给该节点名称进行顺序编号。
1)分别创建2个普通节点(永久节点 + 不带序号):create
[zk: localhost:2181(CONNECTED) 3] create /sanguo "diaochan"
Created /sanguo
[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo"liubei"
Created /sanguo/shuguo

注意:创建节点时,要赋值

2)获得节点的值:get -s
[zk: localhost:2181(CONNECTED) 5] get -s /sanguo
diaochan
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000003
mtime = Wed Aug 29 00:03:23 CST 2018
pZxid = 0x100000004
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
[zk: localhost:2181(CONNECTED) 6] get -s /sanguo/shuguo
liubei
cZxid = 0x100000004
ctime = Wed Aug 29 00:04:35 CST 2018
mZxid = 0x100000004
mtime = Wed Aug 29 00:04:35 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
3)创建带序号的节点(永久节点 + 带序号)
  • (1)先创建一个普通的根节点 /sanguo/weiguo

    [zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
    Created /sanguo/weiguo
    
  • (2)创建带序号的节点

    [zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/zhangliao "zhangliao" Created /sanguo/weiguo/zhangliao0000000000
    [zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/zhangliao "zhangliao" Created /sanguo/weiguo/zhangliao0000000001
    [zk: localhost:2181(CONNECTED) 4] create -s  /sanguo/weiguo/xuchu "xuchu" Created /sanguo/weiguo/xuchu0000000002
    

    如果原来没有序号节点,序号从 0 开始依次递增。如果原节点下已有 2 个节点,则再排序时从 2 开始,以此类推。

4)创建短暂节点(短暂节点 + 不带序号 or 带序号)
  • (1)创建短暂的不带序号的节点

    [zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
    Created /sanguo/wuguo
    
  • (2)创建短暂的带序号的节点

    [zk: localhost:2181(CONNECTED) 2] create -e -s /sanguo/wuguo "zhouyu"
    Created /sanguo/wuguo0000000001
    
  • (3)在当前客户端是能查看到的

    [zk: localhost:2181(CONNECTED) 3] ls /sanguo 
    [wuguo, wuguo0000000001, shuguo]
    
  • (4)退出当前客户端然后再重启客户端

    [zk: localhost:2181(CONNECTED) 12] quit
    [atguigu@hadoop104 zookeeper-3.5.7]$ bin/zkCli.sh
    
  • (5)再次查看根目录下短暂节点已经删除

    [zk: localhost:2181(CONNECTED) 0] ls /sanguo
    [shuguo]
    
5)修改节点数据值
[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"

监听器原理

  • 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。
  • 监听机制保证ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序
监听原理详解
  • 1)首先要有一个main() 线程
  • 2)在 main 线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
  • 3)通过 connect 线程将注册的监听事件发送给 Zookeeper。
  • 4)在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中
  • 5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
  • 6)listener 线程内部调用了process()方法。
常见的监听(节点数据变换与个数变化)
  • 监听节点数据的变化
    get path [watch]
    
  • 监听子节点增减的变化
    ls path [watch]
    

在这里插入图片描述

1、节点的值变化监听
  • (1)在 hadoop104 主机上注册监听 /sanguo 节点数据变化

    [zk: localhost:2181(CONNECTED) 26] get -w /sanguo 
    
  • (2)在 hadoop103 主机上修改 /sanguo 节点的数

    [zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"
    
  • (3)观察 hadoop104 主机收到数据变化的监听

    WATCHER::
    WatchedEvent state:SyncConnected type:NodeDataChanged  path:/sanguo
    

    注意:在 hadoop103 再多次修改 /sanguo 的值,hadoop104上不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。

2、节点的子节点变化监听(路径变化)
  • (1)在 hadoop104 主机上注册监听/sanguo 节点的子节点变化

    [zk: localhost:2181(CONNECTED) 1] ls -w /sanguo
    [shuguo, weiguo]
    
  • (2)在 hadoop103 主机/sanguo节点上创建子节点

    [zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
    Created /sanguo/jin
    
  • (3)观察 hadoop104 主机收到子节点变化的监听

    WATCHER::
    WatchedEvent state:SyncConnected type:NodeChildrenChanged 
    path:/sanguo
    

注意:节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。

节点删除与查看

1)删除节点
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin
2)递归删除节点
[zk: localhost:2181(CONNECTED) 15] deleteall /sanguo/shuguo
3)查看节点状态
[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1

客户端API操作(IDEA)

前提:保证 hadoop102hadoop103hadoop104 服务器上 Zookeeper 集群服务端启动。

1、 环境搭建

  • 1、 创建一个工程:zookeeper

  • 2)添加pom文件

    <dependencies>
    	<dependency>
    		<groupId>junit</groupId>
    		<artifactId>junit</artifactId>
    		<version>RELEASE</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.logging.log4j</groupId>
    		<artifactId>log4j-core</artifactId>
    		<version>2.8.2</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.zookeeper</groupId>
    		<artifactId>zookeeper</artifactId>
    		<version>3.5.7</version>
    	</dependency>
    </dependencies>
    
  • 3)拷贝 log4j.properties 文件到项目根目录
    需要在项目的 src/main/resources 目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。

    log4j.rootLogger=INFO, stdout 
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] 
    - %m%n 
    log4j.appender.logfile=org.apache.log4j.FileAppender 
    log4j.appender.logfile.File=target/spring.log 
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] 
    - %m%n 
    
  • 4)创建包名com.atguigu.zk

  • 5)创建类名称zkClient

2、创建 ZooKeeper 客户端

// 注意:逗号前后不能有空格
private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
private static int sessionTimeout = 2000;
private ZooKeeper zkClient = null;
@Before
public void init() throws Exception {
zkClient = new ZooKeeper(connectString, sessionTimeout, new  Watcher() {
	@Override
	public void process(WatchedEvent watchedEvent) {
		// 收到事件通知后的回调函数(用户的业务逻辑)
		System.out.println(watchedEvent.getType() + "--" 
		+ watchedEvent.getPath());
		// 再次启动监听
		try {
		 List<String> children = zkClient.getChildren("/", true);
		 for (String child : children) {
			 System.out.println(child);
		 }
	} catch (Exception e) {
		e.printStackTrace();
	}
}
});

3、创建子节点

// 创建子节点
@Test
public void create() throws Exception {
// 参数 1:要创建的节点的路径; 参数 2:节点数据 ; 参数 3:节点权限 ;参数 4:节点的类型
	String nodeCreated = zkClient.create("/atguigu", "shuaige".getBytes(),
	Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}

测试:在 hadoop102 的 zk 客户端上查看创建节点情况

[zk: localhost:2181(CONNECTED) 16] get -s /atguigu
shuaige

4、获取子节点并监听节点变化

// 获取子节点
@Test
public void getChildren() throws Exception {
	List<String> children = zkClient.getChildren("/", true);
	for (String child : children) {
		System.out.println(child);
	}
	// 延时阻塞
	Thread.sleep(Long.MAX_VALUE);
}

在 IDEA 控制台上看到如下节点:

```bash
zookeeper
sanguo
atguigu
```
  • hadoop102 的客户端上创建再创建一个节点 /atguigu1,观察 IDEA 控制台:

    [zk: localhost:2181(CONNECTED) 3] create /atguigu1 "atguigu1"
    
  • 在 hadoop102 的客户端上删除节点 /atguigu1,观察 IDEA 控制台

    [zk: localhost:2181(CONNECTED) 4] delete /atguigu1
    

5、 判断 Znode 是否存在

// 判断 znode 是否存在
@Test
public void exist() throws Exception {
	Stat stat = zkClient.exists("/atguigu", false);
	System.out.println(stat == null ? "not exist" : "exist");
}

6、客户端向服务端写数据流程

  • 先写leader再写flower,不会写完follower,一部分同步写,一部分异步写
    在这里插入图片描述
  • 如果是先写follower,那么follower会先将消息同步给leader,leader再来同步follower。该follower为同步,其他为异步。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值