zookeeper基本使用

news2025/2/9 11:08:26

目录

环境搭建

单机版搭建

集群版搭建

基本语法使用

可视化客户端

数据结构

节点分类

1. 持久节点

2. 临时节点

3. 有序节点

4. 容器节点

5. TTL节点

节点状态

监听机制

watch监听

永久性watch

应用场景

1. 实现分布式锁

2. 乐观锁更新数据

应用场景总结

选举机制


环境搭建

单机版搭建

1. 官网下载zookeeper压缩包, 这里用3.8.3版本, 并解压

官网下载地址: Apache ZooKeeper

2. 复制示例配置文件

cp zoo_sample.cfg zoo.cfg

zoo.cfg配置里面参数说明, 不用修改也能启动

# zookeeper基本时间单位,2妙
tickTime=2000
# follower初始化到leader最大时长, 表示tickTime的倍数, 也就是20秒
initLimit=10
# leader和follower同步数据的最大时长, 表示tickTime的倍数, 也就是10秒
syncLimit=5
# 数据和日志存储目录, 也可以配dataLogDir单独指定日志存储目录, 不建议放在默认的/tmp下
dataDir=/tmp/zookeeper
# 对客户端提供端口号
clientPort=2181
# 对单个客户端提供最大连接数
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# 保存数据的快照数量, 多余的会被清除
#autopurge.snapRetainCount=3
# 自动触发清除任务的时间间隔, 单位小时. 0表示不清除
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

3. 启动zookeeper服务

# 启动, 如果不指定配置文件, 默认找conf/zoo.cfg
bin/zkServer.sh start

# 指定配置文件启动
bin/zkServer.sh start conf/my_zoo.cfg

#查看zookeeper状态
bin/zkServer.sh status

# 关闭服务
bin/zkServer.sh stop

# 重启服务
bin/zkServer.sh restart

4. 客户端连接

# 连接本地zookeeper服务
bin/zkCli.sh

# 连接远程的zookeeper server
bin/zkCli.sh -server ip:port

5. 查看基本命令

        5.1 客户端输入help

        5.2 官网查看客户端命令

ZooKeeper: Because Coordinating Distributed Systems is a Zoo

6. 增删改查等操作

# 查看/下子节点
ls /

# 新增
create /kk a1

# 修改
set /kk a2

# 查看/kk
get /kk

# 删除
delete /kk

集群版搭建

==

基本语法使用

命令基本语法

功能描述

help

显示所有操作命令

ls [-s] [-w] [-R] path

使用 ls 命令来查看当前 znode 的子节点 [可监听]

-w: 监听子节点变化

-s: 节点状态信息(时间戳、版本号、数据大小等)

-R: 表示递归的获取

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

创建节点

-s : 创建有序节点。

-e : 创建临时节点。

-c : 创建一个容器节点。

t ttl] : 创建一个TTL节点, -t 时间(单位毫秒)。

data:节点的数据,可选,如果不使用时,节点数据就为null。

acl:访问控制

get [-s] [-w] path

获取节点数据信息

-s: 节点状态信息(时间戳、版本号、数据大小等)

-w: 监听节点变化

set [-s] [-v version] path data

设置节点数据

-s:表示节点为顺序节点

-v: 指定版本号

getAcl [-s] path

获取节点的访问控制信息

-s: 节点状态信息(时间戳、版本号、数据大小等)

setAcl [-s] [-v version] [-R] path acl

设置节点的访问控制列表

-s:节点状态信息(时间戳、版本号、数据大小等)

-v:指定版本号

-R:递归的设置

stat [-w] path

查看节点状态信息

delete [-v version] path

删除某一节点,只能删除无子节点的节点。

-v: 表示节点版本号

deleteall path

递归的删除某一节点及其子节点

setquota -n|-b val path

对节点增加限制

n:表示子节点的最大个数

b:数据值的最大长度,-1表示无限制

可视化客户端

  • Zookeeper图形化工具:ZooInspector
  • Zookeeper图形化工具:开源的prettyZoo(推荐)
  • Zookeeper图形化工具:收费的ZooKeeperAssistant

这里使用prettyZoo, 连接远程zookeeper

数据结构

zookeeper是 文件系统 + key value 数据结构

  1. 文件系统的树形结构便于表达数据之间的层次关系
  2. 文件系统的树形结构便于为不同的应用分配独立的命名空间( namespace )

ZooKeeper的层次模型称作Data Tree,Data Tree的每个节点叫作Znode。不同于文件系统,每个节点都可以保存数据,每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识,每个节点都有一个版本(version),版本从0开始计数, 可用来CAS实现乐观锁。

节点分类

zookeeper存在几种不同的节点类型,他们具有不同的生命周期:

类型

生命周期

创建示例

持久节点 (persistent node)

一直存在,一直存储在ZooKeeper 服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除

create /locks

临时节点 (ephemeral node)

当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在 ZooKeeper 服务器上被删除。

create -e /locks/DBLock

有序节点 (sequential node)

并不算是一种单独种类的节点,而是在之前提到的持久节点和临时节点特性的基础上,增加了一个节点有序的性质。在我们创建有序节点的时候会自动使用一个单调递增的数字作为后缀

create -e -s /jobs/job

(临时有序节点)

容器节点 (container node)

当一个容器节点的最后一个子节点被删除后,容器节点也会被删除

create -c /work

TTL节点 (ttl node)

当一个TTL节点在 TTL 内没有被修改并且没有子节点,会被删除。注意:默认此功能不开启,需要修改配置文件extendedTypesEnabled=true

create -t 3000 /ttl_node

1. 持久节点

客户端与服务端会话关闭, 或服务端重启, 节点依然存在

2. 临时节点

client宕机或者client在指定的timeout时间内没有给ZooKeeper集群发消息,节点就会消失

创建方式: -e

# 创建临时节点
create -e /kk-tmp a3

3. 有序节点

可以和持久节点或临时节点组合

  • 持久有序节点
  • 临时有序节点

创建方式: -s

4. 容器节点

        Container容器节点(3.5.3版本新增),当容器中没有任何子节点,该容器节点会被zk定期删除(定时任务默认60s 检查一次)。 和持久节点的区别是 ZK 服务端启动后,会有一个单独的线程去扫描,所有的容器节点,当发现容器节点的子节点数量为 0 时,会自动删除该节点。可以用于 leader 或者锁的场景中。

创建方式:  -c

# 创建容器节点
create -c /kk-contain aa

5. TTL节点

带过期时间节点, 当一个TTL节点在 TTL 内没有被修改并且没有子节点,会被删除. 默认禁用。

注意:TTL不能用于临时节点

需要在zoo.cfg中配置extendedTypesEnabled参数

# 开启TTL节点
extendedTypesEnabled=true

创建方式: -t

# 创建ttl节点
create -t 10 /kk-ttl

节点状态

# 查看节点状态
[zk: localhost:2181(CONNECTED) 35] ls -s /kk
[k1, k2, k3]
cZxid = 0xcd
ctime = Tue Dec 26 03:36:44 CST 2023
mZxid = 0xcd
mtime = Tue Dec 26 03:36:44 CST 2023
pZxid = 0xd1
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 3

 参数描述:

  • cZxid :Znode创建的事务id。
  • ctime:节点创建时的时间戳。
  • mZxid :Znode被修改的事务id,即每次对znode的修改都会更新mZxid。对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id),通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode。
  • pZxid: 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意: 只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid)
  • mtime:节点最新一次更新发生时的时间戳.
  • cversion :子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。
  • dataVersion:数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题。
  • ephemeralOwner:如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id。如果不是, ephemeralOwner值为0(持久节点)。在client和server通信之前,首先需要建立连接,该连接称为session。连接建立后,如果发生连接超时、授权失败,或者显式关闭连接,连接便处于closed状态, 此时session结束。
  • dataLength : 数据的长度
  • numChildren :子节点的数量(只统计直接子节点的数量)

监听机制

watch监听

zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。

支持的事件类型:

  • None: 连接建立事件
  • NodeCreated: 节点创建
  • NodeDeleted: 节点删除
  • NodeDataChanged:节点数据变化
  • NodeChildrenChanged:子节点列表变化
  • DataWatchRemoved:节点监听被移除
  • ChildWatchRemoved:子节点监听被移除

命令:

#监听节点数据的变化
get -w /kk
stat -w /kk

#监听子节点增减的变化 
ls -w /kk

说明: 

特性

说明

一次性触发

watch是一次性的,一旦被触发就会移除,再次使用时需要重新注册

客户端顺序回调

watch回调是顺序串行执行的,只有回调后客户端才能看到最新的数据状态。一个watcher回调逻辑不应该太多,以免影响别的watch执行

轻量级

WatchEvent是最小的通信单位,结构上只包含通知状态、事件类型和节点路径,并不会告诉数据节点变化前后的具体内容

时效性

watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收到通知;

永久性watch

  • -w: 一次性监听事件
  • addWatch: 可持续监听事件
# 持续监听当前节点的修改和删除事件,以及当前节点的子节点的删除和新增事件
addWatch -m PERSISTENT /kk

# - 持久化递归订阅(默认),在PERSISTENT的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件
addWatch -m PERSISTENT_RECURSIVE /kk

应用场景

1. 实现分布式锁

多个客户端同时创建临时节点, 只会有一个节点成功. 如果客户端1创建成功, 执行完业务流程后, 释放锁, 也就是删除临时节点, 其他客户端监听该节点删除, 重新竞争锁. 这里用临时节点, 避免客户端宕机情况产生死锁.

# 客户端1
create -c /kk-lock 1


# 客户端2

create -c /kk-lock 1


# 假如客户端1竞争成功, 客户端2创建失败, 客户端2监听该节点
get -w /kk-lock


# 客户端1执行完业务流程后, 释放锁, 删除节点
delete /kk-lock

# 客户端2监听到节点有变动, 重新竞争锁, 创建节点
create -c /kk-lock 1

2. 乐观锁更新数据

更新时带上版本号, CAS更新

# 创建节点
create /kt aa


# 查看节点状态(版本号, 创建时间等)

ls -s /kt


# 带版本号更新, 如果版本不匹配则更新失败
set -v 0 /kt bb

应用场景总结

  • 注册中心
  • 数据发布/订阅(常用于实现配置中心)
  • 负载均衡
  • 命名服务
  • 分布式协调/通知
  • 集群管理
  • Master选举
  • 分布式锁
  • 分布式队列

选举机制

==

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

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

相关文章

【工具使用-A2B】使用A2B配置32通道车载音频系统

一,简介 在工作中需要使用A2B芯片传输32通道的车载音频数据。本文主要介绍,如何配置A2B工程来实现32通道车载音频系统。 二,配置介绍 2.1 A2B链路图配置: 2.2 A2B Master 寄存器配置: 2.3 A2B Slave 寄存器配置:

鸿蒙的基本项目_tabbar,首页,购物车,我的

以上效果,由四个ets文件实现,分别是容器页面。首页,购物车,我的。 页面里的数据,我是用json-server进行模拟的数据。 一、容器页面 使用组件Tabs和Tabcontent结合。 import Home from "./Home"; import …

并发编程——3.细说线程

这篇文章我们来详细的说一下并发编程中的线程及其相关的内容 目录 1.线程的创建 1.1通过继承Thread 1.2通过实现Runnable接口的方式 1.3使用FutureTask方式(实现Callable接口的方式) 1.4三种方式的区别 2.线程的原理 3.线程的常用方法 3.1start…

音频修复增强软件iZotope RX 10 mac特点介绍

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac软件特点 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。 音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…

【JavaScript】异步解决方案的发展历程

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

LabVIEW 通信应用程序框架概述

概述 人和机器对可靠、无处不在且价格实惠的无线数据连接的不断需求给无线行业带来了巨大的压力。业界一致认为,下一代无线网络 (5G) 需要在 2020 年之前将容量提高一千倍,而成本不会相应增加。为了应对这一技术挑战,无线研究人员需要跳出框…

一体机定制_工控触控一体机安卓主板方案

工控一体机是一种集成化的硬件方案,采用了联发科MT8768八核芯片和12nm制程工艺。该芯片拥有2.0GHz的主频和IMG PowerVR GE8320图形处理GPU,具备强大的视频处理能力,并且兼容大部分的视频格式和解码能力。工控一体机搭载了Android 9.0操作系统…

【Python3】\u字符与中文字串互转

小水。 encode和decode: str没有decode函数,但对应的有encode函数,该函数作用是转码为bytes对象bytes通过decode函数转换回对应的str对于一些偏激的(可以用过分来形容)的字符串,例如一二三\\u56db\\u4e94\\u516d,是有…

20231225在WIN10下使用SSH连接Ubuntu20.04.6

20231225在WIN10下使用SSH连接Ubuntu20.04.6 2023/12/25 23:03 https://jingyan.baidu.com/article/5552ef479e1856108ffbc9e3.html Win10怎么开启SSH功能 Win10怎么开启SSH功能,下面就一起来看看吧! 工具/原料 华硕天选4 Windows10 方法/步骤 点击左下角的开始菜单,打开Wind…

电脑如何把多张图片压缩?一键批量压缩图片

大家在日常工作和学习中是不是经常使用图片,有些高清的图片体积就会比较大,在传输和储存时就非常的不方便,碰到这样的情况只需要通过图片压缩就可以解决,但是如果是处理的图片比较多,一张张的压缩就会特别麻烦&#xf…

6 UVM Object

uvm_object类是所有uvm层次类的基类,如uvm_report_object、uvm_component、uvm_transaction、uvm_sequence_item、uvm_sequence等。它在定义一组方法(如create, copy, print, clone, compare, record等)方面起着重要作用。 6.1 UVM Utility …

我在 VSCode 插件里接入了 ChatGPT,解决了Bug无法定位的难题

作为一名软件开发者,我时常面临着代码中Bug的定位和解决问题。这个过程往往既费时又充满挑战。然而,最近我在我的VSCode插件中接入了ChatGPT,这个决定彻底改变了我处理Bug的方式。 Bug:开发者的噩梦 在开发过程中,遇…

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理 Nacos除了可以做注册中心,同样也可以做配置管理来使用。 利用Nacos实现统一配置管理以及配置的热更新:…

86% 的网络攻击是通过加密渠道进行

自 2022 年以来,HTTPS 威胁增长了 24%,凸显了针对加密通道的网络犯罪策略的复杂性。 制造业连续第二年成为最常受到攻击的行业,教育和政府组织的攻击同比增幅最高。此外,包括恶意 Web 内容和恶意软件负载在内的恶意软件继续主导其…

AcWing算法进阶课-1.17.1费用流

算法进阶课整理 CSDN个人主页:更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图,并给定每条边的容量和费用,边的容量非负。 图中可能存在重边和自环,保证费用不会存在负环。 求从 S S S 到 …

geyser互通服基岩版进不去

Java版需要在服务器安全组开通TCP端口(如果有宝塔,也需要开通) geyser下载好的安装运行也需要开通端口,但是它是UDP的(但是我同时也开启了TCP,可能不需要? Java 版玩家隧道 Java 版玩家使用 T…

Cloudstack多个管理服务器节点

https://docs.cloudstack.apache.org/en/4.18.0.0/adminguide/reliability.html 参考翻译: 代理上支持多个管理服务器 在具有多个管理服务器的Cloudstack环境中,可以根据算法配置代理,将其连接到哪个管理服务器。这对于内部负载均衡器或高可…

渗透测试——1.3计算机网络基础

一、黑客术语 1、肉鸡:被黑客攻击电脑,可以受黑客控制不被发现 2、端口(port):数据传输的通道 3、弱口令:强度不高,容易被猜到的口令、密码 4、客户端:请求申请电脑(…

web前端项目-七彩夜空烟花【附源码】

web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML,代码简单,实现效果绚丽,且本项目代码直接运行即可实现,无需图片素材,接下来让我们一起实现一场美丽的烟花秀叭 运行效果:鼠标点击和移动可控制…

Linux服务器流量监控、统计、限制、实时流量,按小时查询、按天数查询、按月数查询、按周数查询、查询TOP10等等各种纬度统计

Linux服务器流量监控、统计、限制、实时流量,按小时查询、按天数查询、按月数查询、按周数查询、查询TOP10等等各种纬度统计。 ServerStatus-V 是一个酷炫高逼格的云探针、云监控、服务器云监控、多服务器探针。使用方便,信息直观。ServerStatus-V 是 ServerStatus 中文版 项…