ZooKeeper常用API命令
时间:2022-07-23
本文章向大家介绍ZooKeeper常用API命令,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ZooKeeper 类
ZooKeeper Java 代码主要使用 org.apache.zookeeper.ZooKeeper 这个类使用 ZooKeeper 服务。
ZooKeeper(connectString, sessionTimeout, watcher)
- connectString:使用逗号分隔的列表,每个 ZooKeeper 节点是一个 host:port 对,host 是机器名或者 IP 地址,port 是 ZooKeeper 节点使用的端口号。会任意选取 connectString 中的一个节点建立连接。
- sessionTimeout:session timeout 时间。
- watcher: 用于接收到来自 ZooKeeper 集群的所有事件。
主要方法
- create(path, data, flags):创建一个给定路径的 znode,并在 znode 保存 data[]的 数据,flags 指定 znode 的类型(比如持久化还是临时)
- delete(path, version):如果给定 path 上的 znode 的版本和给定的 version 匹配, 删除 znode。
- exists(path, watch):判断给定 path 上的 znode 是否存在,并在 znode 设置一个 watch。
- getData(path, watch):返回给定 path 上的 znode 数据,并在 znode 设置一个 watch。
- setData(path, data, version):如果给定 path 上的 znode 的版本和给定的 version 匹配,设置 znode 数据。
- getChildren(path, watch):返回给定 path 上的 znode 的孩子 znode 名字,并在 znode 设置一个 watch。
- sync(path):把客户端 session 连接节点和 leader 节点进行同步。
方法说明:
- 所有获取 znode 数据的 API 都可以设置一个 watch 用来监控 znode 的变化。
- 所有更新 znode 数据的 API 都有两个版本:无条件更新版本和条件更新版本。
- 如果 version 为 -1,为无条件更新。
- 否则只有给定的 version 和 znode 当前的 version 一样,才会进行更新,称为有条件更新。
- 所有的方法都有同步和异步两个版本
- 同步版本,发送请求给 ZooKeeper,并等待服务器的响应。
- 异步版本,把请求放入客户端的请求队列,然后马上返回。异步版本通过 callback 来接受来自服务端的响应。
代码异常处理
所有同步执行的 API 方法都有可能抛出以下两个异常:
- KeeperException:表示 ZooKeeper 服务端出错。KeeperException 的子类 ConnectionLossException 表示客户端和当前连接的 ZooKeeper 节点断开了连接。网络分区 和 ZooKeeper 节点失败都会导致这个异常出现。发生此异常的时机可能是在 ZooKeeper 节点处理客户端请求之前,也可能是在 ZooKeeper 节点处理客户端请求之后。出现 ConnectionLossException 异常后,客户端会自动重新连接,但是我们需要检查上一次请求是否被成功执行。
- InterruptedException:表示方法被中断了。我们可以使用 Thread.interrupt() 来中断 API 的执行。
getData 方法
- byte[] getData(String path, boolean watch, Stat stat)
同步方法。如果 watch 为 true,该 znode 的状态变化会发送给构建 ZooKeeper 时(构造器)指定的 watcher。
- void getData(String path, boolean watch, DataCallback cb, Object ctx)
异步方法,所以返回值为void。cb 是一个 callback,用来接收服务端的响应。ctx 是提供给 cb 的 context。watch 参数的含义同上
- void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
异步方法。指定传入一个 Watcher 用来接收该 znode 的状态变化。
setData 方法
- Stat setData(String path, byte[] data, int version)
同步版本。如果 version 是 -1,无条件更新。如果 version 是非负整数,条件更新。
- void setData(String path, byte[] data, int version, StatCallback cb, Object ctx)
异步版本。
watch 机制
watch 提供一个让客户端获取最新数据的机制。
如果没有 watch 机制,客户端需要不断的轮询 ZooKeeper 来查看是否有数据更新,非常影响性能。客户端可以在读取数据的时候设置一个 watcher,这样在数据更新时,客户端就会收到通知。
条件更新
设想用 znode /c 实现一个 counter,使用 set 命令来实现自增 1 操作。条件更新场景:
- 客户端1把/c更新到 版本1,实现/c的自增1,值为1
- 客户端2把/c更新到 版本2,实现/c的自增1,值为2
- 客户端1 不知道 /c 已经被客户端2 更新过了,还用过时的版本 1 是去更新 /c,更新失败。如果客户端1 使用的是无条件更新,/c 就会更新为 2,没有实现自增 1 。
使用条件更新可以避免对过期数据进行更新操作。乐观锁原理!!
- 第九章:Shiro的Web——深入浅出学Shiro细粒度权限开发框架
- 第十章:Shiro的Cache——深入浅出学Shiro细粒度权限开发框架
- Appboy基于MongoDB的数据密集型实践
- 微信企业号登录授权Java实现获取员工userid根据userid换openid
- 微信支付-微信红包Java版本
- Universe入门
- 分享一款值得分享的写作工具
- 微信二次开发Java自定义菜单事件实现
- 微信OAuth授权获取用户OpenId-JAVA(个人经验)
- 【手写文字识别】-JavaAPI示例代码
- 【Python3-API】情感倾向分析示例代码
- SpringMVC+Hibernate +MySql+ EasyUI实现CRUD(一)
- 【Python3-API】通用文字识别示例代码
- Python入门教程之安装MyEclipse插件和安装Python环境
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL实时在线备份恢复方案
- Android通过原生请求直接获取网页内容
- matplotlib | Python强大的作图工具,让你从此驾驭图表(二)
- 设计模式 | Catalog设计模式,抵御业务方需求变动
- 【Flutter 专题】99 初识 EventBus
- LeetCode 102 | 将二叉树中同层的元素归并在一起
- Git | Git入门,成为项目管理大师(二)
- 学习|Unity3D使用协程实现减速停车效果
- R语言实现文献的批处理
- django-haystack ImportError: cannot import name 'six' from 'django.utils' in django 3.x
- Thanos 与 VictoriaMetrics,谁才是打造大型 Prometheus 监控系统的王者?
- 阅读大型开源软件的四个技巧
- Tomcat NIO(7)-Poller
- python 求解线性规划问题
- Netty高性能之道