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

本文主要是介绍【ZooKeeper高手实战】ZooKeeper常用命令及客户端工具Curator核心功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【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() {@Overridepublic void takeLeadership(CuratorFramework curatorFramework) throws Exception {System.out.println("你已经成为 Leader");// 在这里做 Leader 要做的事情,此时不能让方法退出Thread.sleep(Integer.MAX_VALUE);}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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 做分布式队列!

这篇关于【ZooKeeper高手实战】ZooKeeper常用命令及客户端工具Curator核心功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586868

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10