zookeeper基本使用

文章目录

  • 1. zookeeper
  • 2. zookeeper安装
  • 3. zookeeper运行
  • 4. zookeeper操作
    • (1) 服务端常用命令操作
    • (2) 客户端常用命令
    • (3) javaAPI操作
      • Curator
      • Curator基本操作
        • 节点操作
        • watch事件监听
        • 分布式锁
  • 5. zookeeper集群
    • (1) 集群搭建
    • (2) 集群启动
  • 6. 图形化页面工具ZooInspector

1. zookeeper

1. zookeeper是Apache hadoop 项目下的一个子项目,是一个树形目录服务
2. zookeeper翻译过来就是动物园管理员,用来管理Hadoop(大象),hive(蜜蜂),pig(小猪)的管理员
3. zookeeper是一个分布式的,开源的分布式引用程序的协调服务

功能包括:
1. 配置管理
2. 分布式锁
3. 集群管理

2. zookeeper安装

前提: 安装jdk

  1. 下载zookeeper
  2. 上传到linux解压
  3. 配置zoo.cfg,安装目录下的conf目录中
cp zoo_sample.cfg zoo.cfg
# 数据目录设置
dataDir=/path/to/zookeeper_data
# 客户端连接端口
clientPort=2181

3. zookeeper运行

服务端启动:

# 使用zkServer start启动
zkServer start
# 查看服务节点状态
zkServer.sh status
# 停止节点
zkServer.sh stop

在这里插入图片描述
standalone为单节点模式(孤独的):
在这里插入图片描述

4. zookeeper操作

数据模型: zookeeper是一个树形目录服务,其数据模型和Unix的文件系统很类似,拥有一个层次化结构。每一个节点都被称为ZNode,每个节点上都会保存自己的数据节点信息。节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。
节点分为四大类:
PERSISTENT 持久化节点
EPHEMERAL 临时节点 -e
PERSISTENT_SEQUENTIAL 持久化顺序节点 -s
EPHEMERAL_SEQUENTIAL 临时顺序节点 -es
在这里插入图片描述

(1) 服务端常用命令操作

zkServer.sh start 				# 开启服务
zkServer.sh stop				# 停止服务
zkServer.sh status				# 查看状态
zkServer.sh restart				# 重启

(2) 客户端常用命令

zkCli.sh -server localhost:2181 		# 连接服务端(默认连接本地2181)
quit									# 退出
ls 	[-s -w -R] path						#查看目录文件
create [-e -s -es]	path				# 创建节点默认持久化,支持子节点,,如: /a1/b1
get path								# 获取节点数据
set path 内容							# 给节点设置内容
delete path								# 删除节点
deleteall path							# 删除所有节点,包括子节点
ls2 path								# 节点详细信息: ls -s (效果相同)
help									# 查看帮助文档

(3) javaAPI操作

Curator

Curator是APache Zookeeper的java客户端
常见的zookeeper javaAPI:
原生java API
ZkClient
Curator
Curator项目的目标是简化zookeeper客户端的使用
Curator官网: https://curator.apache.org/

Curator基本操作

maven坐标:

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

建立连接:

 // 方式一CuratorFramework clent = CuratorFrameworkFactory.newClient("192.168.72.88:2181", // 连接地址,集群使用,隔开5000,           // 会话超时时间3000,           // 连接超时时间new ExponentialBackoffRetry(3000, 10) // 重试策略);client.start(); //开启连接
// 方式二: 如果指定了命名空间,就会以指定的目录为根目录,可以做到隔离和简化效果CuratorFramework build = CuratorFrameworkFactory.builder().connectString("192.168.72.88:2181").sessionTimeoutMs(5000).connectionTimeoutMs(3000).namespace("test") // 命名空间.retryPolicy(new ExponentialBackoffRetry(3000, 10)).build();build.start();
节点操作

创建节点:

// 基本创建, 在根目录下创建xjy节点,数据为hello("可选,默认当前客户端的ip")client.create().forPath("/xjy", "hello" .getBytes());
// 创建指定模式的节点
client.create().withMode(CreateMode.CONTAINER).forPath("/xjy2");
// 创建多级节点
client.create().creatingParentsIfNeeded().forPath("/xjy2/aa");

查询节点:

// 查询节点数据
byte[] bytes = client.getData().forPath("/xjy");
String s = new String(bytes);
System.out.println(s);
// 查询子节点
List<String> list = client.getChildren().forPath("/");for (String s : list) {System.out.println(s);
}
// 查询节点状态信息
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("xjy");
System.out.println(stat);

删除数据:


修改数据:

client.setData().forPath("xjy","hello".getBytes());// 根据版本修改数据
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("xjy");
int version = stat.getVersion();
client.setData().withVersion(version).forPath("xjy","haha".getBytes());

删除数据:

// 删除单个节点
client.delete().forPath("xjy");//删除带有子节点的节点
client.delete().deletingChildrenIfNeeded().forPath("xjy");// 必须删除
client.delete().guaranteed().forPath("xjy");// 回调函数
client.delete().guaranteed().inBackground((curatorFramework, curatorEvent) -> {System.out.println("删除节点: " + curatorEvent.getPath() + " 状态: " + curatorEvent.getResultCode() + " 类型: " + curatorEvent.getType());}).forPath("xjy");
watch事件监听

zookeeper允许用户在指定节点上注册一些watcher,并且在一些特定事件触发的时候,zookeeper服务端会将时间通知到感兴趣的客户端上去,该机制是zookeeper实现分布式协调服务的重要特性
zookeeper引入了watche机制来实现了发布/定略功能,能够让多个定略者,同时监听某一个对象,当一个对象自身状态变化时,会通知到定略者。
curator引入了cache来实现对zookeeper服务端事件的监听
zookeeper提供了三种watcher:
**NodeCache **: 只监听某一个特定的节点
pathChildrenCache: 监控一个ZNode的子节点
TreeCache: 监听整个数的所有节点

监听器实现:

NodeCache nodeCache = new NodeCache(client,"/xjy",false); // 是否压缩,获取数据时候需要解压缩(但是数据传输更快)nodeCache.getListenable().addListener(() -> {System.out.println("节点数据发生变化,新数据为:" + new String(nodeCache.getCurrentData().getData()));             });nodeCache.start(); //开启监听
分布式锁

在进行单机应用开发的时候,涉及到并发同步的时候,我们使用synchronized或者lock的方式啦解决多线程代码同步问题,这里的多线程在同一个jvm之下,
如果是分布式集群,属于多个jvm的工作环境,跨jvm之间无法通过多线程的锁解决同步问题
跨机器之间,可以使用第三方的进行锁
zookeeper分布式锁原理:
核心思想:

  1. 当客户端想要获取锁,则创建节点,使用锁,则删除节点
  2. 客户端获取锁时,在lock节点下创建临时顺序的节点
  3. 然后获取lock下面的所有子节点,客户端获取到的所有子节点后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁,使用完锁后,将该节点删除
  4. 如果发现自己创建的节点并非lock所有子节点最小的,说明没有获取锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件
  5. 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到通知,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听

锁实现:
InterprocessSemaphoreMutex: 分布式排它锁(非可重入锁)
InterProcessMutex: 分布式可重如排它锁
InterProcessReadWriteLock: 分布式读写锁
InterProcessMultiLock: 将多个锁作为单个实体管理的容器
InterProcessSemaphoeV2: 共享信号量

InterProcessMutex lock = new InterProcessMutex(client, "/lock");try {lock.acquire(3, TimeUnit.SECONDS); //获取锁// 业务逻辑}finally {lock.release(); // 释放锁}

5. zookeeper集群

leader选举:

Serverid: 服务id: 编号越大选择算法的权重最大
Zxid: 数据ID: 服务器中存放的最大数据Id
投票选举: 选票过半后选举成功

角色:
1. leader领导者:
1) 处理事务请求
2) 激趣内部个服务器的调度者
2. Followe 跟随者
1) 处理客户端非事务请求,转发事务请求给Leader服务器
2) 参与Leader选举投票
3. Observer观察者
1) 处理客户端非事务请求,转发事务请求给Leader服务器

(1) 集群搭建

  1. 准备三台zookeeper机器
  2. 每台机器的zookeeper安装目录下创还能**myid文件,**编写自己的服务id
  3. 配置zoo.cfg配置文件
tickTime=2000  
initLimit=10
syncLimit=5
dataDir=/home/kk/export/soft/zookeeper370/data	# 数据目录
clientPort=2181
server.1=192.168.72.88:2888:3888
server.2=192.168.72.89:2888:3888
server.3=192.168.72.90:2888:3888

(2) 集群启动

# 分别在每台上启动即可
zkServer.sh start

在这里插入图片描述

6. 图形化页面工具ZooInspector

下载:

将安装包解压后:
在这里插入图片描述
运行jar包:
在这里插入图片描述
连接zookeeper:
在这里插入图片描述
页面展示:
在这里插入图片描述

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

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

相关文章

【学术会议征稿】第三届智能电网与能源系统国际学术会议

第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议&#xff08;SGES 2024&#xff09;将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局&#xff0c;让现有能源…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城狮&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…

SpringBoot+Vue(2)excel后台管理页面

一、需求 SpringBootVue写excel后台管理页面&#xff08;二级页面打开展示每一个excel表&#xff0c;数据库存储字段为“下载、删除、文件详情、是否共享、共享详情”&#xff09; 二、解答 后端(Spring Boot) 1. 项目设置 使用Spring Initializr创建一个新的Spring Boot项目…

vue3使用Echarts图表生成项目进度甘特图

先看效果 代码展示 <template><h1>项目进度甘特图</h1><div id"app"><!-- Echarts 图表 --><div ref"progressChart" class"progressChart"></div></div> </template><script setup&…

深入解析香橙派 AIpro开发板:功能、性能与应用场景全面测评

文章目录 引言香橙派AIpro开发板介绍到手第一感觉开发板正面开发板背面 性能性能概况性能体验 应用场景移植操作系统香橙派 AIpro开发板支持哪些操作系统&#xff1f;烧写操作系统到SD卡中启动开发板的步骤查看系统提供的事例程序体验——开发的简洁性 视频播放展示ffmpeg简介f…

C语言——流程控制:if...else、switch...case

控制类语句&#xff1a; 逻辑运算符&#xff1a; 选择语句&#xff1a; if...else&#xff1a; if&#xff08;&#xff09;括号内的内容终究会被转换成0,1&#xff0c;满足的话即为1&#xff0c;不满足的话为0。因此要注意&#xff0c;&#xff08;&#xff09;括号内因为条件…

安卓笔记1-Retrofit2请求自定义接口

1、整体功能概述 安卓项目中使用Retrofit2实现和自定义接口的网络交互&#xff0c;通过Postman模拟服务端&#xff0c;创建自定义接口。 作用 前后端开发进度对不齐时&#xff0c;客户端可利用本功能模拟测试数据。备忘。 缺点 retrofit模拟接口需要配置响应数据类&#xff…

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…

[python]基于yolov10+gradio目标检测演示系统设计

【设计介绍】 YOLOv10结合Gradio实现目标检测系统设计是一个结合了最新目标检测技术和快速部署框架的项目。下面将详细介绍这一系统的设计和实现过程。 一、YOLOv10介绍 YOLOv10是YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本&#xff0c;由清华大学的研究…

Flowable-流程图标与流程演示

BPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识&#xff0c;BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范&#xff0c;它能增进业务建模时的沟通效率。目前BPMN2.0是最新的…

四. TensorRT模型部署优化-pruning(sparse-tensor-core)

目录 前言0. 简述1. 自动驾驶中需要关注的电力消耗2. Ampere架构中的3rd Generation Tensor core3. Sparse tensor core做矩阵乘法总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们…

[激光原理与应用-110]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 13 - 德擎激光焊接在线缺陷检测系统 WDD详解解析

目录 一、产品简介 1.1 概述 1.2 多光学信号传感器 &#xff08;1&#xff09;外观 &#xff08;2&#xff09;消费电子行业应用 1.3 IO信号处理模块/可编程控制模块 1.4 操作系统分析软件 1.5 检测原理分析 二、硬件原理 2.1 系统架构与电路接口 2.2 多光学信号传感…

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性&#xff1f; SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MuseV (踩完了所有的坑):基于视觉条件并行去噪的无限长度和高保真虚拟人视频生成

目录 下载项目 创建虚拟环境 启动虚拟环境&执行项目依赖 基于DOCKER的尝试 A. 安装引擎 B. 下载桌面安装包 C. 安装桌面包 用Docker运行MuseV 1. 拉取镜像 ​编辑 2. 运行Docker镜像 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收…

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱&#xff0c;免去我们自己再思考和摸索 2. 模板设计模式 基本…

Profibus_DP转ModbusTCP网关模块连马保与上位机通讯

Profibus转ModbusTCP网关模块&#xff08;XD-ETHPB20&#xff09;广泛应用于工业自动化领域。例如&#xff0c;可以将Profibus网络中的传感器数据转换为ModbusTCP协议&#xff0c;实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关&#xff08;XD-ETHP…

windows单机版mongodb安装

1、先从官网下载安装包官网下载地址 2.本地解压并创建目录 2.1创建data和log目录 2.2创建mongodb.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storag…

RISC-V 指令系统

指令系统 指令集 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computing&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computing&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多…

Perl语言简介

1.简介 Perl 是 Practical Extraction and Report Language 的缩写&#xff0c;可翻译为"实用报表提取语言"。   Perl 是高级、通用、直译式、动态的程序语言。   Perl 最初的设计者为拉里沃尔&#xff08;Larry Wall&#xff09;&#xff0c;于1987年12月18日发…

【UE5.1 角色练习】15-枪械射击——子弹发射物

目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中&#xff08;【UE5.1 角色练习】06-角色发射火球-part1&#xff09;我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”&#xff0c;用于表示…