当前位置: 首页 > news >正文

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();

相关文章:

Apache ZooKeeper 及 Curator 使用总结

1. 下载 官网地址&#xff1a;Apache ZooKeeper 点击下载按钮 选择对应的版本进行下载 2. 使用 1、解压 tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件&#xff0c;有一个示例配置文件 conf/zoo_sample.cfg&#xff0c;此文件不能生效&#xff0c;需要名称为…...

深入探索:MATLAB中的硬件支持包(HSP)及其应用

在MATLAB环境中&#xff0c;硬件支持包&#xff08;HSP&#xff09;扮演着至关重要的角色&#xff0c;尤其是在与硬件交互和嵌入式系统开发方面。HSP提供了一套工具和库&#xff0c;使得MATLAB能够与特定的硬件平台进行有效通信&#xff0c;实现代码的生成和优化。本文将详细介…...

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…...

Day26_0.1基础学习MATLAB学习小技巧总结(26)——数据插值

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a; 1、《MATLAB基础教程 (第三版) (薛山)》 2、《MATL…...

SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录 0 场景描述 1 数据准备 2 问题分析 2.1 分析函数法 2.2 自关联求解 3 小结...

神经网络构建原理(以MINIST为例)

神经网络构建原理(以MINIST为例) 在 MNIST 手写数字识别任务中&#xff0c;构建神经网络并训练模型来进行分类是经典的深度学习应用。MNIST 数据集包含 28x28 像素的手写数字图像&#xff08;0-9&#xff09;&#xff0c;任务是构建一个神经网络&#xff0c;能够根据输入的图像…...

【ArcGIS微课1000例】0123:数据库中要素类批量转为shapefile

除了ArcGIS之外的其他GIS平台,想要打开ArcGIS数据库,可能无法直接打开,为了便于使用shp,建议直接将数据库中要素类批量转为shapefile。 文章目录 一、连接至数据库二、要素批量转shp一、连接至数据库 打开ArcMap,或者打开ArcCatalog,找到数据库连接,如下图: 数据库为个…...

【Elasticsearch系列十九】评分机制详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

神经网络通俗理解学习笔记(3)注意力神经网络

Tansformer 什么是注意力机制注意力的计算键值对注意力和多头注意力自注意力机制注意力池化及代码实现Transformer模型Transformer代码实现BERT 模型GPT 系列模型GPT-1模型思想GPT-2模型思想GPT-3 模型思想 T5模型ViT模型Swin Transformer模型GPT模型代码实现 什么是注意力机制…...

【C#】 EventWaitHandle的用法

EventWaitHandle 是 C# 中用于线程间同步的一个类&#xff0c;它提供了对共享资源的访问控制&#xff0c;以及线程间的同步机制。EventWaitHandle 类位于 System.Threading 命名空间下&#xff0c;主要用于实现互斥访问、信号量控制等场景。 创建 EventWaitHandle 创建一个 E…...

设计模式之结构型模式例题

答案&#xff1a;A 知识点 创建型 结构型 行为型模式 工厂方法模式 抽象工厂模式 原型模式 单例模式 构建器模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 模板方法模式 职责链模式 命令模式 迭代器模式 中介者模式 解释器模式 备忘录模式 观…...

camtasia2024绿色免费安装包win+mac下载含2024最新激活密钥

Hey, hey, hey&#xff01;亲爱的各位小伙伴&#xff0c;今天我要给大家带来的是Camtasia2024中文版本&#xff0c;这款软件简直是视频制作爱好者的福音啊&#xff01; camtasia2024绿色免费安装包winmac下载&#xff0c;点击链接即可保存。 先说说这个版本新加的功能吧&#…...

如何导入一个Vue并成功运行

注意1&#xff1a;要确保自己已经成功创建了一个Vue项目&#xff0c;创建项目教程在如何创建Vue项目 注意2&#xff1a;以下操作均在VS Code&#xff0c;教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件&#xff0c;然后点击将文件添加到工作区 2. 选择自己的vue项…...

封装svg图片

前言 项目中有大量svg图片&#xff0c;为了方便引入&#xff0c;所以对svg进行了处理 一、svg是什么&#xff1f; svg是可缩放矢量图形&#xff0c;是一种图片格式 二、使用步骤 1.创建icons文件夹 将icons文件夹放进src中&#xff0c;并创建一个svg文件夹和index.js&…...

tomcat的Catalinalog和localhostlog乱码

找到tomcat安装目录的loging文件 乱码这两个由UTF-8改为GBK...

行人持刀检测数据集 voc yolo

行人持刀检测数据集 9000张 持刀检测 带标注 voc yolo 行人持刀检测数据集 数据集描述 该数据集旨在用于行人持刀行为的检测任务&#xff0c;涵盖了多种场景下的行人图像&#xff0c;特别是那些携带刀具的行人。数据集包含大量的图像及其对应的标注信息&#xff0c;可用于训练…...

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器&#xff0c; 设计一款汽车倒车防撞报警器系统。 要求&#xff1a; 要求&#xff1a;1.配有距离&#xff0c; 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…...

NLP 文本匹配任务核心梳理

定义 本质上是做了意图的识别 判断两个内容的含义&#xff08;包括相似、矛盾、支持度等&#xff09;侠义 给定一组文本&#xff0c;判断语义是否相似Yi 分值形式给出相似度 广义 给定一组文本&#xff0c;计算某种自定义的关联度Text Entailment 判断文本是否能支持或反驳这个…...

FastAPI 的隐藏宝石:自动生成 TypeScript 客户端

在现代 Web 开发中&#xff0c;前后端分离已成为标准做法。这种架构允许前端和后端独立开发和扩展&#xff0c;但同时也带来了如何高效交互的问题。FastAPI&#xff0c;作为一个新兴的 Python Web 框架&#xff0c;提供了一个优雅的解决方案&#xff1a;自动生成客户端代码。本…...

了解云容器实例云容器实例(Cloud Container Instance)

1.什么是云容器实例&#xff1f; 云容器实例&#xff08;Cloud Container Instance&#xff0c; CCI&#xff09;服务提供 Serverless Container&#xff08;无服务器容器&#xff09;引擎&#xff0c;让您无需创建和管理服务器集群即可直接运行容器。 Serverless是一种架构理念…...

STM32模拟I2C驱动PCF8591避坑指南:为什么你的AD/DA数据总在跳?

STM32模拟I2C驱动PCF8591避坑指南&#xff1a;为什么你的AD/DA数据总在跳&#xff1f; 调试STM32与PCF8591的模拟I2C通信时&#xff0c;AD/DA数据跳动是开发者最常遇到的棘手问题。本文将深入分析数据不稳定的根源&#xff0c;并提供一套完整的解决方案。不同于基础教程&#x…...

Word转Markdown踩过的那些坑:Writage插件失效、Pandoc命令报错怎么办?

Word转Markdown实战避坑指南&#xff1a;从工具失效到完美转换的完整方案 每次技术分享会上&#xff0c;总有人问我&#xff1a;"为什么我的Word转Markdown总出问题&#xff1f;"这让我想起自己刚接触文档转换时踩过的无数坑——插件神秘消失、命令行报错、格式全乱套…...

PortProxyGUI:Windows端口转发图形化管理终极指南

PortProxyGUI&#xff1a;Windows端口转发图形化管理终极指南 【免费下载链接】PortProxyGUI A manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. 项目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI 在Windows网络…...

别再折腾源码编译了!Ubuntu 20.04下用apt-get一键安装Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了&#xff01;Ubuntu 20.04下用apt-get一键安装Asterisk PBX&#xff08;附SIP账号配置详解&#xff09; 如果你正在寻找一种快速搭建企业级电话系统的方法&#xff0c;那么Asterisk PBX绝对值得考虑。作为开源PBX领域的标杆&#xff0c;Asterisk提供了完整的…...

宝塔面板磁盘爆满排查与清理全记录

前言前几天登录宝塔面板&#xff0c;发现磁盘空间告急&#xff08;日志文件都清理了&#xff0c;怎么磁盘占用率还这么高&#xff09;&#xff1a;81.52G / 98.3G&#xff0c;剩余不足 17%。虽然服务器负载不高&#xff0c;但这个磁盘占用率让人隐隐不安——如果不及时处理&…...

DDrawCompat:让经典DirectX游戏在Windows 11重获新生的技术桥梁

DDrawCompat&#xff1a;让经典DirectX游戏在Windows 11重获新生的技术桥梁 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/…...

UE4SS终极指南:5步掌握虚幻引擎游戏修改与脚本开发

UE4SS终极指南&#xff1a;5步掌握虚幻引擎游戏修改与脚本开发 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …...

基于RAG与LangChain的AI阅读助手BookWith架构与实现

1. 项目概述&#xff1a;当AI成为你的阅读伙伴作为一名深度阅读爱好者和技术实践者&#xff0c;我一直在寻找一种能真正“理解”内容&#xff0c;并与我进行深度对话的阅读工具。传统的电子书阅读器&#xff0c;无论是Kindle还是其他应用&#xff0c;本质上都只是将纸质书数字化…...

别再只用if-else了!用Simulink Relay模块给你的控制逻辑加个‘缓冲带’(附C代码生成分析)

别再只用if-else了&#xff01;用Simulink Relay模块给你的控制逻辑加个‘缓冲带’&#xff08;附C代码生成分析&#xff09; 在嵌入式控制系统的开发中&#xff0c;我们常常需要处理各种阈值判断和状态切换。传统的if-else结构虽然简单直接&#xff0c;但在实际应用中往往会导…...

怎样高效管理微信社交网络:5个微信工具箱实用技巧完整指南

怎样高效管理微信社交网络&#xff1a;5个微信工具箱实用技巧完整指南 【免费下载链接】wechat-toolbox WeChat toolbox&#xff08;微信工具箱&#xff09; 项目地址: https://gitcode.com/gh_mirrors/we/wechat-toolbox 微信工具箱&#xff08;wechat-toolbox&#xf…...