ZooKeeper

一、初始ZooKeeper

Zookeeper 是 Apache的一个项目,并且是一个树形目录服务,简称zk。
Zookeeper 是一个分布式的、开源的分布式应用程序的协调服务。
Zookeeper 提供的主要功能包括:

配置管理
分布式锁
集群管理

二、ZooKeeper命令操作

2.1 Zookeeper数据模型

ZooKeeper 是一个树形目录服务,其数据模型和文件系统目录树很类似,拥有一个层次化结构。这里面的每一个节点都被称为: ZNode,每个节点上都会保存自己的数据和节点信息。节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。
节点可以分为四大类:
PERSISTENT 持久化节点
EPHEMERAL 临时节点 :-e
PERSISTENT_SEQUENTIAL 持久化顺序节点 :-s
EPHEMERAL_SEQUENTIAL 临时顺序节点 :-es
持久化节点是不删除可以永久保存的,但是临时节点在当前会话结束之后就会自动删除。
顺序节点会按照顺序节点创建的先后顺序为节点赋值,如此时要建立两个顺序节点,名分别为node1、node2,呢么创建出来的节点名为node100000001和node200000002,也就是会在名字后面加上一段有顺序的数字。

2.2 ZooKeeper 服务端常用命令

启动 ZooKeeper 服务:

./zkServer.sh start

查看 ZooKeeper 服务状态:

./zkServer.sh status

停止 ZooKeeper 服务:

 ./zkServer.sh stop

重启 ZooKeeper 服务:

 ./zkServer.sh restart

2.3 ZooKeeper 客户端常用命令

(1)连接ZooKeeper 服务器

./zkCli.sh –server ip:port

如果是服务端就在本机上,则只需./zkCli.sh就可以连接上
(2)断开连接

quit

(3)显示指定目录下节点

ls 目录

(4)创建节点

create /节点path value

(5)获取节点值

get /节点path

(6)设置节点值

set /节点path value

(7)删除单个节点

delete /节点path(如果该节点还有子节点会报错)

(8)删除带有子节点的节点

deleteall /节点path

(9)创建临时节点

create -e /节点path value

(10)创建顺序节点

create -s /节点path value

(11)查询节点详细信息

ls –s /节点path

该命令返回节点的信息如下

czxid:节点被创建的事务ID
ctime: 创建时间
mzxid: 最后一次被更新的事务ID
mtime: 修改时间
pzxid:子节点列表最后一次被更新的事务ID
cversion:子节点的版本号
dataversion:数据版本号
aclversion:权限版本号
ephemeralOwner:用于临时节点,代表临时节点的事务ID,如果为持久节点则为0
dataLength:节点存储的数据的长度
numChildren:当前节点的子节点个数

三、Zookeeper JavaAPI操作

常见的ZooKeeper Java API :

 原生Java APIZkClientCurator

这里介绍Curator,这是Apache ZooKeeper 的java客户端库
需要首先导入Maven依赖

    <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.0</version></dependency>

3.1建立连接

有两种建立连接的方法
方法1:CuratorFrameworkFactory的newClient方法。该方法是一个重载方法,一般需要四个参数,只有第一个和第四个参数是必须的,如果不传这两个参数,会设置默认值。

connectString:连接字符串。zk server 地址和端口,传入的是一个字符串形式,如果是要构建集群的话,两个地址端口之间用逗号隔开。如"192.168.56.10:2181,192.168.56.11:2181"
sessionTimeoutMs:会话超时时间,单位ms,代表如果设定时间没有会话的话会自动断开连接
connectionTimeoutMs :连接超时时间,单位ms,当构建连接超过了这个时间就会根据第四个参数重试策略进行后续选择
retryPolicy :未能顺利连接成功的重试策略

    RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.56.10:2181",60 * 1000, 15 * 1000, retryPolicy);

第二种方法是CuratorFrameworkFactory的builder方法,可以通过链式操作设置相关的参数,然后构建出连接。

client = CuratorFrameworkFactory.builder().connectString("192.168.56.10:2181").sessionTimeoutMs(60 * 1000).connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).build();

两种方法都可以获取连接,但是获取连接之后需要开启连接。

client.start();

3.2添加节点

//如果创建节点,没有指定存储的数据,则默认将当前客户端的ip作为数据存储
String path = client.create().forPath("/a1");
//指定存储数据,传入的是byte[]
String path = client.create().forPath("/a2", "Hello World".getBytes());
//使用withMode指定存储的节点类型,默认是持久化节点,传入的参数是枚举
String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/a3");
//创建多级节点
//creatingParentsIfNeeded():如果父节点不存在,则创建父节点
String path = client.create().creatingParentsIfNeeded().forPath("/a4/b1");

3.3删除节点

//删除单个节点
client.delete().forPath("/a1");
// 删除带有子节点的节点
client.delete().deletingChildrenIfNeeded().forPath("/a4");
//必须成功的删除
client.delete().guaranteed().forPath("/a2");
//回调
client.delete().guaranteed().inBackground(new BackgroundCallback(){@Overridepublic void processResult(CuratorFramework client, CuratorEvent event) throws  Exception {System.out.println(event);}}).forPath("/a1");

3.4修改节点

//直接进行修改
client.setData().forPath("/a1", "hh".getBytes());
//先查出当前节点数据的版本,在修改,避免进行了无效的修改Stat status = new Stat(); client.getData().storingStatIn(status).forPath("/a1");int version = status.getVersion();System.out.println(version);client.setData().withVersion(version).forPath("/a1", "heihei".getBytes());

3.5查询节点

//查询节点数据
byte[] data = client.getData().forPath("/a1");
// 查询子节点
List<String> path = client.getChildren().forPath("/");
//查询节点状态信息storingStatIn,storingStatIn方法会把详细信息保存成Stat这个类的Bean,所以需要创建这样一个对象
client.getData().storingStatIn(status).forPath("/a1");

3.6Watch事件监听

Watch事件监听
ZooKeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。
ZooKeeper 原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便
需要开发人员自己反复注册Watcher,比较繁琐。
Curator引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。
ZooKeeper提供了三种Watcher:
NodeCache : 只是监听某一个特定的节点
PathChildrenCache : 监控一个ZNode的子节点.
TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合
下面给出NodeCache的代码例子,其余两个几乎相同

//创建NodeCache对象
final NodeCache nodeCache = new NodeCache(client,"/a1");
//.注册监听
nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {//获取修改节点后的数据byte[] data = nodeCache.getCurrentData().getData();System.out.println(new String(data));} });//开启监听.如果设置为true,则开启监听是,加载缓冲数据nodeCache.start(true);

3.7分布式锁实现

在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题。
但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题。那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁。
目前分布式锁有三种主流方法实现
(1)基于缓存实现的
(2)ZooKeeper实现
(3)数据库层面实现(乐观锁、悲观锁)
ZooKeeper分布式锁原理
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
1.客户端获取锁时,在lock节点下创建临时顺序节点。
2.然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
3.如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
4.如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点
并注册监听。

在Curator中有五种锁方案:

InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
InterProcessMutex:分布式可重入排它锁
InterProcessReadWriteLock:分布式读写锁
InterProcessMultiLock:将多个锁作为单个实体管理的容器
InterProcessSemaphoreV2:共享信号量

Zookeeper的快速入门(Curator)相关推荐

  1. Zookeeper简介/快速入门——特别详细

    ZooKeeper是一个集中的服务,用于维护配置信息.命名.提供分布式同步和提供组服务.所有这些类型的服务都以某种形式被分布式应用程序使用.每次它们被实现时,都会有大量的工作来修复不可避免的错误和竞争 ...

  2. ZooKeeper 之快速入门

    -----------------破镜重圆,坚持不懈! 1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务 ...

  3. 学习笔记:快速入门ZooKeeper技术

    学习视频:黑马程序员 ZooKeeper 视频教程,快速入门 ZooKeeper 技术 学习资料:黑马程序员 公众号提供的文档资料链接 | 提取码:dor4) 本文最后更新于 2022-04-25,若 ...

  4. zookeeper快速入门——应用(两种分布式锁)

    在<zookeeper快速入门--简介>一文中,我们介绍了zookeeper的机制.但是还是比较抽象,没有直观感受到它在分布式系统中的应用.本文我们使用一个例子,三次迭代演进,来说明Zoo ...

  5. Hadoop快速入门——第四章、zookeeper安装

    Hadoop快速入门--第四章.zookeeper安装 压缩包下载地址:[https://download.csdn.net/download/feng8403000/85227883] 目录 1.上 ...

  6. python 操作 zookeeper 快速入门

    python 操作 zookeeper 快速入门 文章目录 python 操作 zookeeper 快速入门 什么是zookeeper python 操作 zk 快速入门 zk节点 创建节点 查询节点 ...

  7. 高性能RPC框架—----------------------Dubbo一站式快速入门

    https://blog.csdn.net/tangyang8941/article/details/88025412 一.Web应用架构的演变 ​    随着互联网的发展,网站应用的规模不断扩大,W ...

  8. (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门

    在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...

  9. Dubbo -- Dubbo快速入门代码编写

    文章目录 1. Dubbo快速入门代码编写 1.1 需求分析 1.2 项目和模块创建 1.3 导入相关依赖 1.4 编写提供服务的接口 1.5 编写调用服务的程序 1.6 安装dubbo-servic ...

最新文章

  1. 小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码
  2. 对应生成树的基本回路_数据结构与算法——最小生成树
  3. c语言用指针带出局部变量,关于C语言中返回局部变量和局部指针变量
  4. JS检查是否支持Storage
  5. python工作环境_CentOS7下python工作环境管理
  6. shell 与 空格
  7. 送花(洛谷 2073)
  8. .Net 中接口应用的知识点(排序)
  9. RocketMQ入门到入土(二)事务消息顺序消息
  10. windows c语言 sata 序列号,【Delphi】获取IDE/SATA硬盘序列号
  11. Ubuntu12.10 下 音乐播放器没声音
  12. 未能联接game center服务器,Game Center无法毗邻服务器怎么办 五种方法任你选择
  13. 简单的led驱动 了解下
  14. outStream.flush()
  15. ZooKeeper之常用命令大全
  16. 【2021-11-07 最新python】 pixabay 图片网站全量爬虫 代码分享
  17. linux卸载gdb命令,Linux_Unix卸载gdb调试工具出现问题的解决方法,  Unix系统通过命令能够卸载 - phpStudy...
  18. 在群辉上搭建git服务器
  19. 更改CentOS上的默认SSH端口号的方法步骤
  20. 机器人操作系统ROS Indigo 入门学习(18)——ROS wiki导航

热门文章

  1. 【渝粤题库】陕西师范大学201291 商法学 作业(高起专)
  2. 关于ACCESS数据库的不可更新查询
  3. JSDoc 拥抱 Javascript
  4. flac是什么格式,flac转mp3怎么高效实现
  5. Unity手柄按键映射
  6. iOS开发之layer.frame,layer.anchorPoint,layer.position对frame的影响
  7. C语言: 字符串 -2
  8. 高校学生工作信息系统研究
  9. Matlab修改Consolas字体
  10. iApp后台带PHP文件源码全开源