【ZooKeeper高手实战】ZooKeeper常用命令及客户端工具Curator核心功能

news2024/12/27 12:57:02

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书
文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
请添加图片描述

ZooKeeper 中常用运维及使用命令

zk 运维常用命令:

命令执行模板:echo [参数] | nc localhost 2181,常用参数如下:

  • conf:查看当前 zk 配置
  • cons:查看连接的数量
  • crst:重置客户端统计
  • dump:输出会话
  • envi:查看环境
  • ruok:检查节点是否正在运行
  • stat:查看运行时状态
  • srst:重置服务器统计
  • wchs:查看 watcher 信息
  • wchc:输出 watcher 详细信息
  • wchp:输出 watcher,以 znode 为单位分组
  • mntr:输出比 stat 更加详细

基于 jstat 命令监控和检查 zk 的 JVM 运行情况:

# 先查询 zk 的进程 id
ps -ef | grep zookeeper
# 进程 ID 515460 ,采样间隔 250 ms,采样数 4
jstat -gc 515460 250 4

开启 zk 的 JMX 端口以及使用 JConsole 观察 JVM 内存使用:

zk 中启动 JMX 功能,可以去暴露一组端口,以供监控和管理 Java 应用程序

zkServer.sh 中,找到 ZOOMAIN 变量,将 ZOOMAIN 后边的内容替换为下边的三条内容:

-Dcom.sum.management.jmxremote.port=21811
-Dcom.sum.management.jmxremote.ssl=false
-Dcom.sum.management.jmxremote.authenticate=false

打开 JMX 端口之后,就可以通过 JDK 自带的可视化 JVM 进程内存分析工具 JConsole 进行内存分析了

zk 操作常用命令:

# 启动服务端
sh zkServer.sh start
# 启动客户端
sh zkCli.sh
# 创建 test 节点,数据为 1010
create /test 1010
# 查看目录 
ls /
# 读取数据
get /test
# 更新数据
set /test 1020
# 删除节点
delete /test

ZooKeeper 客户端工具 Curator 常用功能

目前,业内使用最广泛的 zk 客户端框架为:Curator

Curator 是由 Netflix 开源出来的,提供了丰富的操作 zk 的 API

如果想使用 Curator,需要引入的 maven 依赖如下(zk 使用 3.4.5 版本,对应 curator 框架版本 2.4.2):

目前 Curator 官网说最新版本的 Curator 已经取消了对 zookeeper 3.4.x 的支持,不过原理都是一致的,先了解原理,再看源码就很容易看懂

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

Curator 连接 zk 使用示例如下:

public class CuratorZkExample {
    public static void main(String[] args) {
        // 创建一个 CuratorFramework 实例
        CuratorFramework client = CuratorFrameworkFactory.newClient(
                "localhost:2181", // ZooKeeper 服务器地址
                5000, // 客户端跟 zk 进行心跳,如果心跳断开超过 5 秒,绘画就会断开
                3000, // 连接 zk 的超时时间
                new ExponentialBackoffRetry(1000, 3) // 重试策略,1秒后重试,最多重试3次
        );

        // 启动客户端
        client.start();

        try {
            // 创建一个 ZooKeeper 节点
            String path = "/example/path";
            client.create().creatingParentsIfNeeded().forPath(path, "data".getBytes());

            // 获取节点数据
            byte[] data = client.getData().forPath(path);
            System.out.println("Node data: " + new String(data));

            // 更新节点数据
            byte[] newData = "new data".getBytes();
            client.setData().forPath(path, newData);

            // 读取更新后的节点数据
            data = client.getData().forPath(path);
            System.out.println("Updated node data: " + new String(data));

            // 删除节点
            client.delete().forPath(path);

            Thread.sleep(Integer.MAX_VALUE);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭客户端
            client.close();
        }

    }
}

zk 一般如何实现元数据存储?

一般是将元数据转成 json 字符串,去创建一个 znode,将元数据的 json 串写到这个 znode 的值中,如果需要就直接从这个 znode 中读取即可

下边主要讲解一下 Curator 中常用的一些功能如何使用:

Curator 中 Leader 的选举

Curator 的 Leader 选举机制有两种:

  • Leader Latch
  • Leader Elction

Leader Latch 使用讲解:

首先创建一个 Leader Latch 如下,在 /leader/latch 目录下创建节点进行 Leader 的选举:

LeaderLatch leaderLatch = new LeaderLatch(client, "/leader/latch");

所有竞选 Leader 目录为 /leader/latch 的节点会进行协商,选择一个 Leader 出来,可以通过 hasLeaderShip 判断自己是否时 Leader:

System.out.println("是否成为 Leader:" + leaderLatch.hasLeadership());

调用 start 方法之后,节点会开始竞选 Leader,之后阻塞在 await 方法上,直到成为 Leader 之后,才可以执行 await 之后的代码:

// 开始竞选 Leader
leaderLatch.start();
// 阻塞等待成为 Leader
leaderLatch.await();
// 执行 Leader 操作
...
// 将当前实例从 Leader 选举中关闭
leaderLatch.close();

完整代码如下:

public class LeaderLatchDemo {
    public static void main(String[] args) throws Exception {
        // 创建一个 CuratorFramework 实例
        CuratorFramework client = CuratorFrameworkFactory.newClient(
                "localhost:2181", // ZooKeeper 服务器地址
                new ExponentialBackoffRetry(1000, 3) // 重试策略,1秒后重试,最多重试3次
        );
        // 启动客户端
        client.start();
        LeaderLatch leaderLatch = new LeaderLatch(client, "/leader/latch");
        leaderLatch.start();
        leaderLatch.await();
        System.out.println("是否成为 Leader:" + leaderLatch.hasLeadership());
        leaderLatch.close();
    }
}

Leader Election 使用讲解:

使用 Leader Election 时,需要先创建 LeaderSelector 实例,之后调用 start 方法去启动竞选,当成为 Leader 之后,在 LeaderSelector 中注册的监听器中的 takeLeadership 方法将会被调用,在该方法中执行 Leader 所需要的操作,执行完毕之后,当方法退出时,就意味着当前实例放弃了 Leader 地位,完整代码如下:

public class LeaderElectionDemo {
    public static void main(String[] args) throws Exception {
        // 创建一个 CuratorFramework 实例
        CuratorFramework client = CuratorFrameworkFactory.newClient(
                "localhost:2181", // ZooKeeper 服务器地址
                new ExponentialBackoffRetry(1000, 3) // 重试策略,1秒后重试,最多重试3次
        );
        // 启动客户端
        client.start();
        LeaderSelector leaderSelector = new LeaderSelector(client, "/leader/selector", new LeaderSelectorListener() {
            @Override
            public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
                System.out.println("你已经成为 Leader");
                // 在这里做 Leader 要做的事情,此时不能让方法退出
                Thread.sleep(Integer.MAX_VALUE);
            }
            @Override
            public void stateChanged(CuratorFramework client, ConnectionState newState) {
                System.out.println("连接状态发生变化");
                if (newState.equals(ConnectionState.LOST)) {
                    throw new CancelLeadershipException();
                }
            }
        });
        leaderSelector.start();
        Thread.sleep(Integer.MAX_VALUE);
    }
}

Curator 实现分布式锁原理:

Curator 实现 zk 的分布式锁,就是通过 临时顺序节点 实现

简单来说,就是所有人去竞争一个锁

指定一个锁的目录,在此目录下创建一个临时顺序节点

如果是第一个节点的话,表示获取到了锁

如果不是第一个节点,就对上一个节点加一个监听,上一个节点释放锁之后,第二个节点会得到通知,就去拿到锁

在这里插入图片描述

Curator 提供的节点监听机制:

Curator 事件有两种模式:

  • 标准的观察模式,使用 Watcher 监听器

  • 缓存事件监听,类似于将本地缓存视图和 ZooKeeper 视图进行对比的过程,Curator 提供了 3 个接口:

    • Path Cache:对指定路径的子目录进行监听,不监听该节点
    • Node Cache:对一个节点进行监听
    • Tree Cache:对整个目录进行监听

Watcher 监听器处理事件:

需要定义一个事件,再通过 usingWatcher 即可对某个路径进行监听

Watcher watcher = new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) {
        log.info("监听器watchedEvent:" + watchedEvent);
    }
};

byte[] content = client.getData().usingWatcher(watcher).forPath("/test/watcher");
System.out.println(new String(content));

利用 Watcher 对节点进行监听的话,缺点就是只可以监听 1 次,监听到 1 次事件之后这个监听器就会失效

如果要反复监听,那么就需要反复调用 usingWatcher 来注册

缓存事件监听:

PathCache 和 NodeCache 接口的使用都放在下边(这里使用的 Curator 客户端版本为 2.4.2,因此还没有 Tree Cache 功能,这里就不演示了):

// Path Cache 监听
public static void main(String[] args) throws Exception {
    // 创建一个 CuratorFramework 实例
    CuratorFramework client = CuratorFrameworkFactory.newClient(
            "localhost:2181", // ZooKeeper 服务器地址
            new ExponentialBackoffRetry(1000, 3) // 重试策略,1秒后重试,最多重试3次
    );
    // 启动客户端
    client.start();
    PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/cluster", true);
    pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
        @Override
        public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
            System.out.println("监听到子节点发生变化,收到事件:" + pathChildrenCacheEvent);
        }
    });
    pathChildrenCache.start();
    Thread.sleep(Integer.MAX_VALUE);
}


// NodeCache 监听
public static void main(String[] args) throws Exception {
    // 创建一个 CuratorFramework 实例
    final CuratorFramework client = CuratorFrameworkFactory.newClient(
            "localhost:2181", // ZooKeeper 服务器地址
            new ExponentialBackoffRetry(1000, 3) // 重试策略,1秒后重试,最多重试3次
    );

    // 启动客户端
    client.start();
    final NodeCache nodeCache = new NodeCache(client, "/nodecache");
    nodeCache.getListenable().addListener(new NodeCacheListener() {
        @Override
        public void nodeChanged() throws Exception {
            Stat stat = client.checkExists().forPath("/nodecache");
            if (stat != null) {
                byte[] bytes = client.getData().forPath("/nodecache");
                System.out.println("节点数据发生变化" + new String(bytes));
                System.out.println();
            } else {
                System.out.println("节点被删除...");
            }
        }
    });
    nodeCache.start();
    Thread.sleep(Integer.MAX_VALUE);
}

ZooKeeper 客户端功能总结:

使用客户端工具 Curator 主要是用来做节点的 CRUD + 监听 + Leader 选举,用在分布式业务系统中

其中 Curator 提供的像 Barrier、分布式计数器、分布式队列这些功能使用场景很少,并且同样的功能还有更好的选择

比如更推荐使用 Redis 做分布式计数、RabbitMQ/RocketMQ 做分布式队列!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

答疑解惑:核技术利用辐射安全与防护考核

前言 最近通过了《核技术利用辐射安全与防护考核》&#xff0c;顺利拿到了合格证。这是从事与辐射相关行业所需要的一个基本证书&#xff0c;考试并不难&#xff0c;在此写篇博客记录一下主要的知识点。 需要这个证书的行业常见的有医疗方面的&#xff0c;如放疗&#xff0c;…

寒假护眼台灯哪款更好?五款高品质护眼台灯推荐

近年来学生近视的现象越来越严重了&#xff0c;而且近视的年龄也越来越小了&#xff0c;不少还没开始上小学的孩子&#xff0c;就已经戴上了厚厚的近视眼镜。而那些高年级的学生更是近视的重灾区&#xff0c;不仅每天需要高强度的学习和长时间用眼&#xff0c;甚至晚上都还需要…

Java内存模型(JMM)是基于多线程的吗

Java内存模型&#xff08;JMM&#xff09;是基于多线程的吗 这个问题按我的思路转换了下&#xff0c;其实就是在问&#xff1a;为什么需要Java内存模型 总结起来可以由几个角度来看待「可见性」、「有序性」和「原子性」 面试官&#xff1a;今天想跟你聊聊Java内存模型&#…

【pdf密码】pdf打印密码强制解除

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

LED电平显示驱动电路图

LB1409九位LED电平显示驱动电路 如图所示为LBl409九位LED电平显示驱动电路。图&#xff08;a&#xff09;是用LB1409做电平显示驱动电路&#xff0c;图&#xff08;b&#xff09;是应用基准电压电平显示驱动电路。LB1409是日本东京互洋电机株式会社生产的产品&#xff0c;与其…

最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书

前提&#xff1a;朋友弄了一个培训机构&#xff0c;培训考试合格后&#xff0c;给发证书&#xff0c;需要一个证书查询系统。委托我给弄一个&#xff0c;花了几个晚上给写的证书查询系统。 实现功能&#xff1a; 前端按照姓名手机号码进行证书查询证书信息展示证书展示&#x…

0108作业

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setWindowTitle("腾讯会议");this->resize(470,800);//设置界面大小this->setFixedSize(470,800);//锁定界面大小this->setStyleSheet("background-color:w…

老板向我请教Transformer的原理,我没讲清

最近&#xff0c;一直跟别人讲大语言模型带来的AIGC是巨变&#xff0c;涉及了多个领域&#xff0c;并且谈了我们工作和生活中可以利用的地方&#xff0c;以及预测2024年大语言模型将在哪些领域爆发。这时&#xff0c;老板过来了&#xff0c;就聊&#xff0c;问&#xff0c;谈到…

解决:Unity : Error while downloading Asset Bundle: Couldn‘t move cache data 问题

目录 问题&#xff1a; 尝试 问题得到解决 我的解释 问题&#xff1a; 最近游戏要上线&#xff0c;发现一个现象&#xff0c;部分机型在启动的时候闪退或者黑屏&#xff0c;概率是5%左右&#xff0c;通过Bugly只有个别机型才有这个现象&#xff0c;其实真实情况比这严重的多…

【操作系统】复习汇总(各章节知识图谱)

第1章&#xff1a; 第2章&#xff1a; 第3章&#xff1a; 第4章&#xff1a; 第5章&#xff1a; 第6章&#xff1a; 第7章&#xff1a; 第8章&#xff1a; 第9章&#xff1a;

如何用GPT/GPT4完成AI绘图和论文写作?

详情点击链接&#xff1a;如何用GPT/GPT4完成AI绘图和论文写作&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…

Vue使用printJS导出网页为pdf、printJS导出pdf

先放几个参考链接 感谢&#xff01; Vue使用PrintJS实现页面打印功能_vue print.js 设置打印pdf的大小-CSDN博客 前台导出pdf经验汇总 &#xff08;html2canvas.js和浏览器自带的打印功能-print.js&#xff09;以及后台一些导出pdf的方法_iqc后台管理系统怎么做到导出pdf-CSD…

3D模型UV展开原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

3D软件坐标系速查【左手/右手】

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 基本上&#xff0c;游戏引擎和3…

西电期末考点总结

一.“打擂台” 介绍 打擂台用于找到一个数组中的最值问题&#xff0c;先设置一个虚拟擂主&#xff0c;并保证他是“最弱的”&#xff0c;然后遍历数组&#xff0c;找到“更强的”数据&#xff0c;就交换擂主&#xff0c;“打”到最后的“擂主”就是最值数据 相关题目 1004.…

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 两组由4块磁盘组建的raid5磁盘阵列&#xff0c;两组raid5阵列划分为lun并组成了lvm结构&#xff0c;ext3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线&#xff0c;热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…

小H靶场笔记:DC-7

DC-7 January 8, 2024 4:11 PM Tags&#xff1a;Drupal 8&#xff1b;Drush Owner&#xff1a;只惠摸鱼 信息收集 使用arp-scan和nmap扫描C段存活主机&#xff0c;探测到靶机ip&#xff1a;192.168.199.137&#xff0c;且开放80、22端口 探测22、80开放端口的服务、版本、操…

统计数据集句子长度信息

在文本分类任务做科研写论文的时候&#xff0c;我们有时候需要对对数据集的大小进行分析&#xff0c;如果你想统计CSV文件中某一列英语句子的单词个数&#xff08;不包含标题&#xff09;&#xff0c;可以使用Python的split()函数将句子拆分为单词&#xff0c;并计算单词的个数…

【EasyExcel】导出excel冻结表头和冻结指定列并支持筛选器

需求背景&#xff1a; 导出excel的同时冻结表头和前两列基础信息&#xff0c;方便导出后用户查看信息。 一、技术选型&#xff1a; easyExcel的自定义写策略处理&#xff1a;SheetWriteHandler 二、方案设计&#xff1a;&#xff08;基于实现 SheetWriteHandler 接口&#xf…

歌词滚动显示

歌词滚动显示 环境准备htmldata.js歌词css 解析歌词为对象数组查找指定时间点的歌词创建歌词元素li计算偏移量监听播放时间执行偏移计算 模仿音乐软件实现歌词随播放时间滚动显示 环境准备 html <!DOCTYPE html> <html lang"en"> <head><meta…