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.mfbz.cn/a/883194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker Registry API best practice 【Docker Registry API 最佳实践】

文章目录 1. 安装 docker2. 配置 docker4. 配置域名解析5. 部署 registry6. Registry API 管理7. 批量清理镜像8. 其他 &#x1f44b; 这篇文章内容&#xff1a;实现shell 脚本批量清理docker registry的镜像。 &#x1f514;&#xff1a;你可以在这里阅读&#xff1a;https:/…

安卓13设置动态显示隐藏第一页的某一项 动态显示隐藏无障碍 android13设置动态显示隐藏第一页的某一项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有时候,我们的设置里面显示的信息,需要根据不同的情况显示不同的信息,例如,动态的显示或者隐藏 “无障碍” 这一项。 2.问题分析 像这个问题…

基于 K8S kubernetes 搭建 安装 EFK日志收集平台

目录 1、在k8s中安装EFK组件 1.1 安装elasticsearch组件 1.2 安装kibana组件 1.3 安装fluentd组件 文档中的YAML文件配置直接复制粘贴可能存在格式错误&#xff0c;故实验中所需要的YAML文件以及本地包均打包至网盘 链接&#xff1a;https://pan.baidu.com/s/15Ryaoa0_…

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题&#xff0c;真实考过&#xff0c;看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…

Java查找算法——(四)分块查找(完整详解,附有代码+案例)

文章目录 分块查找1.1普通分块查找 分块查找 1.1普通分块查找 分块原则&#xff1a; 块内无序&#xff0c;块间有序:前一块中的最大数据&#xff0c;小于后一块中所有的数据&#xff0c;块与块之间不能有数据重复的交集。块的数量一般等于数字个数开根号 核心思路&#xff…

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

VUE条件树查询

看如下图所示的功能&#xff0c;是不是可高级了&#xff1f;什么&#xff0c;你没看懂&#xff1f;拜托双击放大看&#xff01; 是的&#xff0c;我最近消失了一段时间就是在研究这个玩意的实现&#xff0c;通过不懈努力与钻研并参考其他人员实现并加以改造&#xff0c;很好&am…

南开大学联合同济大学发布最新SOTA Occ OPUS:使用稀疏集进行占据预测,最快实现8帧22FPS

Abstract 占据预测任务旨在预测体素化的 3D 环境中的占据状态&#xff0c;在自动驾驶社区中迅速获得了关注。主流的占据预测工作首先将 3D 环境离散化为体素网格&#xff0c;然后在这些密集网格上执行分类。然而&#xff0c;对样本数据的检查显示&#xff0c;大多数体素是未占…

Windows内核编程基础(3)

内存分配 在应用层编程时&#xff0c;系统提供了GlobalAlloc/HeapAlloc/LocalAlloc等函数。C/C库提供了malloc函数&#xff0c;以及new操作符在堆上分配内存。 在我前面一个关于Windows页交换文件的博客中&#xff0c;介绍了虚拟内存&#xff0c; 虚拟内存是计算机系统内存管…

Unity开发绘画板——03.简单的实现绘制功能

从本篇文章开始&#xff0c;将带着大家一起写代码&#xff0c;我不会直接贴出成品代码&#xff0c;而是会把写代码的历程以及遇到的问题、如何解决这些问题都记录在文章里面&#xff0c;当然&#xff0c;同一个问题的解决方案可能会有很多&#xff0c;甚至有更好更高效的方式是…

Go容器化微服务系统实战

1-1 本课的go微服务有什么不同&#xff1f; 聚焦于容器化可观测的购物微服务系统实战&#xff0c;通过介绍Go语言的应用趋势、容器化优势及微服务适用性&#xff0c;旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…

Java之路--瓦解逻辑控制与方法使用已是瓮中捉鳖

嗨嗨大家&#xff01;今天我们来学习逻辑运算和方法的使用~ 目录 一 逻辑控制 1 分支结构 1.1 if语句 1.2 switch 语句 2 循环结构 2.1 while 循环 2.2 for 循环 2.3 do while 循环 2.4 break 2.5 continue 3. 输出输入 二、方法的使用 1 方法定义语法 2 实参和…

苹果macOS 15.0 Sequoia正式版发布:iPhone应用镜像玩、手机消息电脑知

9月17日苹果向 Mac 电脑用户推送了 macOS 15 更新&#xff08;内部版本号&#xff1a;24A335&#xff09;&#xff0c;除了引入数个 iOS 18 的新功能外&#xff0c;macOS 15 Sequoia 还带来了全新的 Continuity 功能 ——iPhone 镜像。 iPhone 镜像功能可以让用户直接在 Mac 上…

[Linux] Linux操作系统 进程的状态

标题&#xff1a;[Linux] Linux操作系统 进程的状态 个人主页&#xff1a;水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始&#xff1a; 在校的时候&#xff0c;你一定学过《…

图解Transformer就这30页PPT,你们真不看啊

图解Transformer就这30页PPT&#xff0c;你们真不看啊 主要介绍了Seq2Seq模型&#xff0c;慢慢引出了transformer的整体模型架构&#xff0c;比较具体的介绍了编码器部分的数据处理过程&#xff0c;包括了位置编码、多头注意力机制、残差连接、Layer Norm以及前馈网络等基本结…

支付宝沙箱环境 支付

一 什么是沙箱&#xff1a; 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 &#xff1a; AI&#xff1a; 从沙箱到正式环境&#xff1a; 当应用程序开发完成后&#xff0c;需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…

如何查看线程

1、首先找到我们的电脑安装jdk的位置&#xff0c;这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok&#xff0c;那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程&#xff1a; jconsole 这里能够罗列出你系统上的 java 进程&#xff0…

古代经典名方目录数据库-支持经典名方检索!

"古代经典名方目录"是指一系列历史上流传下来的&#xff0c;被认为具有一定疗效的中药方剂的汇总。这些方剂多来源于历代医学典籍&#xff0c;经过长期临床实践的检验&#xff0c;部分已被收录于官方的目录之中&#xff0c;以便于现代医疗实践中的参考和应用。 目前…

手机在网状态查询接口如何用C#进行调用?

一、什么是手机在网状态查询接口&#xff1f; 手机在网状态查询接口是利用实时数据来对手机号码在运营商网络中的状态进行查询的工具&#xff0c;包括正常使用状态、停机状态、不在网状态、预销户状态等。 二、手机在网状态查询适用哪些场景&#xff1f; 例如&#xff1a;商…

设计模式-结构型-11-代理模式

文章目录 1. 基本介绍2. 静态代理2.1 基本介绍UML 类图 2.2 应用实例定义接口目标对象代理对象调用代理 2.3 静态代理优缺点 3. 动态代理3.1 基本介绍3.2 JDK 中生成代理对象的 API参数说明UML类图 3.3 应用实例定义接口目标对象代理工厂调用代理 4. Cglib 代理4.1 基本介绍4.2…