ZooKeeper的使用一般都接触不到,因为平时工作甚少直接使用ZK。但是通过手动操作一下ZK,还是能对其中的门道了解各一二。

shell 常用命令

help 查看所有支持的命令

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port

ls 查看路径下的所有节点

[zk: localhost:2181(CONNECTED) 1] ls /
[zk-book2, zk-book1, zk-book, zookeeper]

create 创建节点

创建临时节点:

[zk: localhost:2181(CONNECTED) 3] create /xingoo 123
Created /xingoo
[zk: localhost:2181(CONNECTED) 4] create -e /xingoo-e 123
Created /xingoo-e
[zk: localhost:2181(CONNECTED) 6] ls /
[zk-book2, zk-book1, zk-book, xingoo, zookeeper, xingoo-e]
[zk: localhost:2181(CONNECTED) 8] quit
Quitting...
[zk: localhost:2181(CONNECTED) 0] ls /
[zk-book2, zk-book1, zk-book, xingoo, zookeeper]

创建顺序节点:

[zk: localhost:2181(CONNECTED) 2] create -s /xingoo-s 1
Created /xingoo-s0000000018
[zk: localhost:2181(CONNECTED) 3] create -s /xingoo-s 1
Created /xingoo-s0000000019
[zk: localhost:2181(CONNECTED) 4] create -s /xingoo-s 1
Created /xingoo-s0000000020
[zk: localhost:2181(CONNECTED) 5] create -s /xingoo-s 1
Created /xingoo-s0000000021
[zk: localhost:2181(CONNECTED) 7] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000020, xingoo-s0000000021, xingoo-s0000000019]

delete 删除节点

[zk: localhost:2181(CONNECTED) 10] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000020, xingoo-s0000000021, xingoo-s0000000019]
[zk: localhost:2181(CONNECTED) 11] delete /xingoo-s*
Node does not exist: /xingoo-s*
[zk: localhost:2181(CONNECTED) 12] delete /xingoo-s0000000020
[zk: localhost:2181(CONNECTED) 13] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000021, xingoo-s0000000019]
[zk: localhost:2181(CONNECTED) 14]

get 查询节点

[zk: localhost:2181(CONNECTED) 14] get /xingoo
123
cZxid = 0x5d
ctime = Mon Apr 09 17:21:50 CST 2018
mZxid = 0x5d
mtime = Mon Apr 09 17:21:50 CST 2018
pZxid = 0x5d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

Java API使用

完整的代码,可以参考《从PAXOS到ZOOKEEPER》,或者我的代码样例:

https://github.com/xinghalo/java-in-action/tree/master/src/cn/xingoo/book/zook/chap5

连接ZooKeeper

public class ZooKeeper_Contructor_Usage implements Watcher {

    /**
* 调用await()阻塞,当减到0时,恢复
* http://www.importnew.com/15731.html
*/
private static CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws IOException {
ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181",5000,new ZooKeeper_Contructor_Usage());
System.out.println(zookeeper.getState());
try{
connectedSemaphore.await();
}catch (Exception e){
System.out.println("zk session established");
}
} @Override
public void process(WatchedEvent watchedEvent) {
System.out.println("recieve watched event:"+watchedEvent);
if(Event.KeeperState.SyncConnected == watchedEvent.getState()){
connectedSemaphore.countDown();
}
}
}

基于CountDownLatch做线程阻塞,ZooKeeper的构造方法中有几个重要的参数:

  • url,是连接地址,如果是多个地址拼接,可以做轮训;url后面还可以跟root目录
  • timeout,连接超时时间;如果连接断开,ZooKeeper会自动重连
  • watcher,默认的监控类

create 创建代码

String path1 = zooKeeper.create("/zk-test-ephemeral-",
"".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL);

exist 判断是否存在

zooKeeper.exists(path, true);

getData 查询数据

zooKeeper.getData(watchedEvent.getPath(),true,stat)

setData 更新数据

这里的版本号用作CAS,后面会详细介绍

zooKeeper.setData(path, "123".getBytes(), -1);

getChildren 查询所有子节点

zooKeeper.getChildren(watchedEvent.getPath(),true)

注意,ZooKeeper客户端里面所有的watcher都是一次性的,如果想要监控每次事件,需要在watcher里面再次注册。

Zookeeper学习笔记——2 Shell和Java API的使用的更多相关文章

  1. Zookeeper学习笔记(三)——java客户端代码操作

    Zookeeper客户端java代码操作 上篇博客记录了shell命令操作zookeeper集群的方式,这次尝试采用java代码来操作.通过查阅API,发现并不困难. 1. 首先获得客户端与服务器的连 ...

  2. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

  3. ZooKeeper 学习笔记

    ZooKeeper学习笔记 1.   zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...

  4. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  5. Zookeeper学习笔记(上)

    Zookeeper学习笔记 本篇主要是一些基本的介绍和API的使用介绍, 有些只是记录了知识点,而没有完全在笔记中详细解释, 需要自行查找资料补充相关概念 主要参考了课程中的内容: Zookeeper ...

  6. ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心

    作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...

  7. ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁

    作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...

  8. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  9. ZooKeeper学习笔记(一)——概述

    zookeeper学习笔记(一)--概述 1. 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.zookeeper从设计模式的角度来理解:是一个基于观察者设计 ...

随机推荐

  1. c# 界面自适应大小

    采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...

  2. HTTP基础知识2

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  3. Python-生产者消费模型 线程

    7.生产者消费者模型(*****)(思聪吃热狗代码) 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题. 该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使 ...

  4. SPLAY,LCT学习笔记(五)

    这一篇重点探讨LCT的应用 例:bzoj 2631 tree2(国家集训队) LCT模板操作之一,利用SPLAY可以进行区间操作这一性质对维护懒惰标记,注意标记下传顺序和如何下传 #include & ...

  5. 用两个int值实现读写锁

    private int readcount = 0; private int writecount = 0; public void lockread() throws InterruptedExce ...

  6. POJ 3040 Allowance【贪心】

    POJ 3040 题意: 给奶牛发工资,每周至少 C 元.约翰手头上有面值V_i的硬币B_i个,这些硬币的最小公约数为硬币的最小面值.求最多能发几周? 分析: 贪心策略是使多发的面额最小(最优解).分 ...

  7. PHP浮点数的精确计算BCMath

    Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_ope ...

  8. #10 [AH2017/HNOI2017]大佬

    题解: 题意看上去挺复杂的 分析一下就能发现自己的自信是没啥用的 只要随便dp一下看看最多能有多少天不使用增加自信 然后问题就变成了 求C1+C2+k=C 然后发现C有10^8 显然枚举C1是不行的了 ...

  9. [转]svn检出的时候报 Unable to connect to a repository at URL错误

    昨天晚上遇到的问题: 在同一个SVN地址下,很多子目录,各种目录各种权限,现在因为业务,需要下载各种目录下的文件. 第一次遇到这个问题..现象是: 1)在web浏览器下可用: 2)在本地创建的目录下c ...

  10. 【AtCoder】CODE FESTIVAL 2017 qual A

    A - Snuke's favorite YAKINIKU -- #include <bits/stdc++.h> #define fi first #define se second # ...