Apache ZooKeeper 及 Curator 使用总结

1. 下载

官网地址:Apache ZooKeeper

点击下载按钮

选择对应的版本进行下载

2. 使用

1、解压

tar -zxf apache-zookeeper-3.9.2-bin.tar.gz

2、复制配置文件,有一个示例配置文件 conf/zoo_sample.cfg,此文件不能生效,需要名称为 zoo.cfg 的文件才能生效,因此改名复制一份配置文件

cp conf/zoo_sample.cfg conf/zoo.cfg

3、修改配置,其他配置暂不做修改,只重新指定一下 dataDir 的路径

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=../data
# the port at which the clients will connect
clientPort=2181

4、启动 ZooKeeper 服务端

./bin/zkServer.sh start

5、ZooKeeper 客户端连接,本机连接可以不写 ip:port

./bin/zkCli.sh -server ip:port

3. 常用命令

通过 help 命令可查看 ZooKeeper 常用命令

1、创建节点,create 命令

在根目录下创建 node1 节点,与它关联的内容是字符串 "node1"

create /node1 "node1"

在 node1 节点下创建 node1.1 节点,与它关联的内容是数字 123

create /node1/node1.1 123

2、获取节点的数据,get 命令

获取 node1 节点下 node1.1 子节点的数据,get /node1/node1.1

[zk: localhost:2181(CONNECTED) 7] get /node1/node1.1
123

3、更新节点数据内容,set 命令

set /node1/node1.1 "node1.1-123"

4、查看节点状态,stat 命令

查看 node1 节点的状态,stat /node1

[zk: localhost:2181(CONNECTED) 6] stat /node1
cZxid = 0x4
ctime = Tue Aug 20 17:01:23 CST 2024
mZxid = 0x4
mtime = Tue Aug 20 17:01:23 CST 2024
pZxid = 0x5
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1

5、查看某个目录下的子节点,ls 命令

查看根目录下的子节点,ls /

[zk: localhost:2181(CONNECTED) 4] ls /
[node1, zookeeper]

查看 node1 节点下的子节点和状态,ls -s /node1

[zk: localhost:2181(CONNECTED) 9] ls -s /node1
[node1.1]
cZxid = 0x4
ctime = Tue Aug 20 17:01:23 CST 2024
mZxid = 0x4
mtime = Tue Aug 20 17:01:23 CST 2024
pZxid = 0x5
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1

6、删除节点,delete 命令,要删除的节点必须没有子节点才行

删除 node1 节点,delete /node1,提示该节点不为空

[zk: localhost:2181(CONNECTED) 11] delete /node1
Node not empty: /node1

删除 node1 节点下 node1.1 子节点,delete /node1/node1.1

[zk: localhost:2181(CONNECTED) 12] delete /node1/node1.1

4. Curator

Curator 是 Netflix 公司开源的一套 ZooKeeper Java 客户端框架,相比于 Zookeeper 自带的客户端 zookeeper 来说,Curator 的封装更加完善,各种 API 都可以比较方便地使用

4.1 引入依赖

版本自行选择

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${curator.version}</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>${curator.version}</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${curator.version}</version>
</dependency>

4.2 连接 ZooKeeper 客户端

1、使用工厂类 CuratorFrameworkFactory 的静态 newClient() 方法

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;/*** Curator 客户端** @author GreyFable* @since 2024/8/22 11:33*/
public class CuratorClient {public static void main(String[] args) {// 重试策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);// 创建客户端实例CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);// 启动客户端client.start();}
}

2、使用工厂类 CuratorFrameworkFactory 的静态 builder() 构造者方法

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;/*** Curator 客户端** @author GreyFable* @since 2024/8/22 11:33*/
public class CuratorClient {public static void main(String[] args) {RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);CuratorFramework client = CuratorFrameworkFactory.builder().connectString("localhost:2181")// 会话超时时间.sessionTimeoutMs(5000)// 连接超时时间.connectionTimeoutMs(5000).retryPolicy(retryPolicy).build();client.start();}
}

4.3 操作 ZooKeeper

1、判断节点是否存在

Stat stat = client.checkExists().forPath("/node1/0001");
if (null != stat) {System.out.println("节点已存在");
}

2、创建节点

通常是将 znode 分为 4 大类:

  • 持久(PERSISTENT)节点 :一旦创建就一直存在,即使 ZooKeeper 集群宕机,直到将其删除
  • 临时(EPHEMERAL)节点 :临时节点的生命周期是与 客户端会话(session) 绑定的,会话消失则节点消失 。并且,临时节点 只能做叶子节点 ,不能创建子节点
  • 持久顺序(PERSISTENT_SEQUENTIAL)节点 :除了具有持久(PERSISTENT)节点的特性之外, 子节点的名称还具有顺序性。比如 /node1/app0000000001 、/node1/app0000000002
  • 临时顺序(EPHEMERAL_SEQUENTIAL)节点 :除了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性

在使用 ZooKeeper 的时候,会发现 CreateMode 类中实际有 7 种 znode 类型 ,但是用的最多的还是上面介绍的 4 种

创建默认持久化节点,只有当父节点 /node1 存在时才会成功创建,否则会报错

client.create().forPath("/node1/0001");

创建指定类型的节点,只有当父节点 /node1 存在时才会成功创建,否则会报错

client.create().withMode(CreateMode.PERSISTENT).forPath("/node1/0002");

父节点不存在时自动创建父节点,使用 creatingParentsIfNeeded() 方法

client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/node1/0003");

创建节点并指定数据内容,注意数据内容要是 byte 数组

client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/node1/0004", "0004".getBytes());

3、获取节点数据

byte[] bytes = client.getData().forPath("/node1/0001");

4、更新节点数据

 client.setData().forPath("/node1/0001", "0001".getBytes());

5、删除节点

删除一个子节点

client.delete().forPath("/node1/0001");

删除一个节点以及其下的所有子节点

client.delete().deletingChildrenIfNeeded().forPath("/node1/0001");

6、获取某个节点的所有子节点路径

List<String> list = client.getChildren().forPath("/node1/0001");

4.4 监听器

Curator 引入了 Cache 来实现对 Zookeeper 服务端事件监听,Cache 事件监听可以理解为一个本地缓存视图与远程 Zookeeper 视图的对比过程,分为一下注册类型

  • NodeCache:对某一个节点进行监听,对当前节点数据变化进行处理
  • PathChildrenCache:对子节点进行监听,但是不会对二级子节点进行监听,对当前节点的子节点数据变化进行处理
  • TreeCache:对当前节点下所有节点进行监听,对当前节点的子节点,及递归子节点数据变化进行处理

不过在 Curator 5.1.0 以后,NodeCachePathChildrenCacheTreeCache 均已被弃用,统一使用 CuratorCache 进行所有节点的事件监听,对应的方法如下:

  • forCreates():创建
  • forChanges():设值,
  • forCreatesAndChanges():创建和设值
  • forDeletes():删除,如果删除多级节点,会触发多次
  • forAll():所有事件

默认情况下,Listener 监听整个子树(指定节点及其子节点)的事件,如果指定了 SINGLE_NODE_CACHE 选项,则只监听单个节点的事件

CuratorCache curatorCache = CuratorCache.build(client, "/node1");
// CuratorCache curatorCache = CuratorCache.build(client, "/node1", CuratorCache.Options.SINGLE_NODE_CACHE);CuratorCacheListener listener = CuratorCacheListener.builder().forCreates(childData ->System.out.println("create: " + childData.getPath() + " " + new String(childData.getData()))).forChanges((oldNode, node) -> System.out.println("change")).forCreatesAndChanges((oldNode, node) -> System.out.println("createAndChange")).forDeletes(childData -> System.out.println("delete")).forAll((type, oldData, data) -> {if (type.name().equals(CuratorCacheListener.Type.NODE_CREATED.name())) {System.out.println("create");} else if (type.name().equals(CuratorCacheListener.Type.NODE_CHANGED.name())) {System.out.println("change");} else if (type.name().equals(CuratorCacheListener.Type.NODE_DELETED.name())) {System.out.println("delete");}}).build();curatorCache.listenable().addListener(listener);
curatorCache.start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/429247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#和数据库高级:继承与多态

文章目录 一、继承的基本使用继承的概念&#xff1a;继承的特点&#xff1a;为什么使用继承&#xff1f; 二、继承的关键字1、this关键字2、base关键字3、Protected关键字4、子类调用父类的构造函数的总结&#xff1a; 三、继承的特性继承的传递性&#xff1a;继承的单根性&…

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主&#xff0c;肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染&#xff0c;又能做单页应用的框架&#xff0c;如果想做单页应用&#xff0c;又想学服务端渲染&#xff0c;使用Remix可以降低学习成本。最近&#xff0c;在学习Remix的过程中&#xff0c;遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

Godot游戏如何提升触感体验

在游戏世界中&#xff0c;触感体验至关重要&#xff0c;既能极大提升玩家沉浸感&#xff0c;让其深度融入游戏&#xff0c;在操作角色或与环境互动时&#xff0c;通过触感反馈获得身临其境的真实感&#xff08;比如动作游戏中角色攻击或受击时的振动反馈&#xff0c;能使玩家更…

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;并基于前期收集到的5种常见的花朵数据集&#xff08;向日葵、玫瑰、蒲公英、郁金香、菊花&#xff09;进行处理后进行模型训练&#xff0c;最…

解决DockerDesktop启动redis后采用PowerShell终端操作

如图&#xff1a; 在启动redis容器后&#xff0c;会计入以下界面 &#xff1a; 在进入执行界面后如图&#xff1a; 是否会觉得界面过于单调&#xff0c;于是想到使用PowerShell来操作。 步骤如下&#xff1a; 这样就能使用PowerShell愉快地敲命令了&#xff08;颜值是第一生…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“&#xff0c;创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU&#xff0c;设置UART&#xff0c;以及调试方式。添加项目名称&#xff0c;点击“完成“按钮。 …

Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式&#xff0c;这里记录一下&#xff0c;仅供参考 目录 一、主从架构 1、搭建方式 2、同步原理 3、优化策略&#xff1a; 4、总结&#xff1a; 二、哨兵架构 1、搭建哨兵集群 2、RedisTemplate如何使用哨兵模式 三、分片集群架构 1&#…

集成学习详细介绍

以下内容整理于&#xff1a; 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble)&#xff1a;选择一个由一系列假设h1, h2, …, hn构成的集合…

AI运动小程序开发常见问题集锦一

截止到现在写博文时&#xff0c;我们的AI运动识别小程序插件已经迭代了23个版本&#xff0c;成功应用于健身、体育、体测、AR互动等场景&#xff1b;为了让正在集成或者计划进行功能扩展优化的用户&#xff0c;少走弯路、投入更少的开发资源&#xff0c;我们归集了一部分集中的…

Redis数据结构之set

一.set集合特性 集合类型也是保存多个字符串类型的元素的&#xff0c;但和list列表不一样&#xff0c;集合中的元素是无序的&#xff0c;而且元素不能够重复&#xff0c;不仅支持增删查改&#xff0c;还支持交集并集等操作 二.相关命令 1.sadd sadd key members…… 咱们把…

【机器学习】--- 决策树与随机森林

文章目录 决策树与随机森林的改进&#xff1a;全面解析与深度优化目录1. 决策树的基本原理2. 决策树的缺陷及改进方法2.1 剪枝技术2.2 树的深度控制2.3 特征选择的优化 3. 随机森林的基本原理4. 随机森林的缺陷及改进方法4.1 特征重要性改进4.2 树的集成方法优化4.3 随机森林的…

JavaScript ---案例(统计字符出现次数)

统计字符出现次数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

深度学习之微积分预备知识点(2)

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

LabVIEW软件维护的内容是什么呢?

LabVIEW软件维护涉及多个方面&#xff0c;确保程序的正常运行和长期稳定性。维护内容包括以下几个方面&#xff1a; 1. Bug修复 在开发和运行过程中&#xff0c;可能会出现各种软件问题或缺陷&#xff08;bugs&#xff09;。维护工作之一就是识别这些问题并通过修复程序中的代…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

Qt5详细安装教程(包含导入pycharm)

1.自行下载Qt 2.双击进行安装 3.设置完成后勾选接受&#xff0c;跳转下一步 4.可选择安装位置&#xff0c;比较习惯安装在D盘 5.根据需求勾选对应组件安装 6.安装完成后&#xff0c;打开pycharm&#xff0c;进入settings—>选择ExternalTools&#xff0c;根据以下步骤进行配…

【WEB】EZ_Host

1、 2、解答 http://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;lshttp://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;cat flag即可看到答案

数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;这边为大家整理了一套数据中台Axure高保真原型。这套原型致力于为企业提供全方位的数据服务&#xff0c;助力企业实现数据驱动的创新发展。 下载及预览地址&#xff1a;h…