zookeeper深入浅出 1

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: zookeeper深入浅出

一,zookeeper深入浅出

1,zookeeper的基本信息

zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同 步服务、集群管理、分布式应用配置项的管理等。

它是一个基于观察者模式的分布式服务管理框架,主要负责存储和管理大家关心的数据,然后接受观察者的注册,一旦数据的状态发生变化,zookeeper会将负责通知在zookeeper上注册的那些观察者做出相应的反应。主要有两个核心:文件系统数据结构+监听通知机制


1.1,文件系统数据结构

Zookeeper维护一个类似文件系统的数据结构,每个子目录项都被称为znode,和文件系统类似,我们可以自由的增加,删除znode。主要有下面几个节点:

849990bfa5eb42298aa36c2cbe9cc74f.png


PERSISTENT­持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在

PERSISTENT_SEQUENTIAL­持久化顺序编号目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号,长度10位。

EPHEMERAL­临时目录节点:客户端与zookeeper断开连接后,该节点被删除,主要是和这个sessionId的过期时间进行绑定

EPHEMERAL_SEQUENTIAL­临时顺序编号目录节点:客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

Container 节点:如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次,就是说一个容器节点如果加了子节点,后面子节点被删除了,也会把这个容器节点删除。

TTL 节点:默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定。不需要自己去维护这个过期时间的问题,可以自定义维护这个存活时间。


1.2,zk一种cs结构

即一种客户端和服务端结构。首先会有一次tcp的三次握手建立连接,然后连接建立成功之后会生成一个sessionId,会携带一个sessionId来控制这个连接的过期时间。临时节点主要是通过这个过期时间来设置

9fdca140da6b4d21894da0ee114b3ee5.png

长连接和短连接并没有本质的区别,主要是根据业务来区分,如果要及时关掉就是一个短连接。


短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是短连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。 例如数据库连接,就是使用的就是长连接。


1.3,事件的监听机制

就是说可以对任意一个结点进行监听,即客户端注册监听它关心的任意节点,或者目录节点及递归子目录节点。

1,如果监听的是某个结点,节点被删除或者修改时,对应的客户端将被通知

2,如果是对某目录进行监听,则这个目录的子节点被创建或者删除时,对应的客户端将被通知

3,如果是对目录的递归子节点进行监听,则目录下面的任意子节点有变化,对应的客户端将被通知

通知都是一次性的,无论是对对应的结点还是目录进行监听,一旦触发,对应的监听即将被移除。


2,zookeeper经典的应用场景

1,分布式配置中心

2,分布式注册中心

3,分布式锁

4,分布式队列

5,集群选举

6,分布式屏障

7,发布/订阅


3,下载安装

下载地址:https://zookeeper.apache.org/releases.html

下载之后再解压:

tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

复制一份zoo_sample.cfg配置文件,并重新命名

cp zoo_sample.cfg zoo.cfg

启动命令,通过bin目录下的zkServer.sh进行启动

# 可以通过 bin/zkServer.sh 来查看都支持哪些参数
bin/zkServer.sh start conf/zoo.cfg

在安装目录下面创建data文件夹,然后在zoo.conf配置文件中设置这个dataDir路径为刚刚创建的data路径

接下来就可以启动服务了

切换到这个bin目录下面,连接这个zookeeper

#连接本机
./zkCli.sh
#连接远程
./zkCli.sh -server ip:2181

查看里面的全部信息。

ls /      #查看当前目录下的节点
ls -R /   #递归查看所有的子节点,可以发现呈树形形状

4,创建节点

1,创建结点的命令如下

create [-s] [-e] [-c] [-t ttl] path [data] [acl]
# -s: 顺序节点
# -e: 临时节点
# -c: 容器节点
# -t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用

2,创建持久化结点,每个创建的命令都要以**/**开头

create /test
create /test2 zhenghuisheng  #设置key/value
get /test2 #获取这个value
set /test #修改
create /test2/sub0 # 创建子结点

3,创建顺序的持久化结点,主要添加这个 -s 命令

create /seq  #创建一个父目录
create -s /seq/zhs  #会生成一个10位的序列号,如下图,因此方便可以实现一个分布式锁

4,创建临时结点

create -e /temp #创建临时结点
create -e /temp qaq
get -s /temp

每个节点都有一个附属信息。

cZxid = 0x6   #事务id,创建,删除,修改都属于事务请求。通过这个事务id来保证这个顺序
ctime = Tue Jul 12 22:34:10 CST 2022  #创建这个事务的时间
mZxid = 0x6   #修改这个事务的事务id  
mtime = Tue Jul 12 22:34:10 CST 2022  #修改时间
pZxid = 0x6 #子结点的事务被修改
cversion = 0 #子结点的版本id
dataVersion = 0 #乐观锁
aclVersion = 0 #权限控制
ephemeralOwner = 0x1028ab84f120000  #临时结点的过期时间
dataLength = 0 #数据长度
numChildren = 0 #子结点个数

临时结点和持久化结点的区别就是里面的这个ephemeralOwner不一样。临时结点在时间过期之后,会被服务器给清除掉。临时结点后面不能有子结点。 临时顺序结点和持久化顺序结点一样,并且也是一旦超时,就被被服务器给清楚掉。一旦这个sessionId超时,就不能被救活。

5,容器节点,-c开头,

create -c /container qqq      #创建一个父节点
get -s /conteiner
create -c /container/sub0   #创建一个子结点
create -c /container/sub1   
create -c /container/sub2
delete /container/sub0      #删除这个容器中的子结点
delete /container/sub0
delete /container/sub0
deleteall           #删除全部节点

容器中的节点被删除之后,这个容器默认会存活60s时间,60s之后,就会删除这些结点。

6,ttl节点

需要启动一个系统参数,在这个bin目录下面,修改这个zkServer.sh,在这个ZOOMAIN后面直接添加

-Dzookeeper.extendedTypesEnabled=true

7,监听节点 -w,可以对结点进行通知,也可以对目录进行通知。结点的监听都是一次性的。get增对事件,ls针对目录。

#在获取这个数据时进行监听,一旦数据修改,立马会收到。
get -w /test01
ls -R -w /test        #递归监听下面的全部结点
removewatches /test01   #删除监听


相关文章
|
监控 Dubbo Java
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
272 0
|
消息中间件 存储 缓存
Java请求合并与分而治之
Java请求合并与分而治之
1023 0
Java请求合并与分而治之
|
存储 负载均衡 NoSQL
一文让你搞懂 zookeeper
一文让你搞懂 zookeeper
19066 16
|
缓存 应用服务中间件 nginx
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
这篇文章讨论了在使用Nginx进行动静分离时遇到的静态资源更新不及时的问题。问题描述了在服务器上更新静态资源后,访问页面时页面没有显示更新的情况。文章提供了解决这个问题的方法,即清除浏览器缓存,并提供了相关参考文章链接。此外,还展示了问题复现的步骤和正常情况的预期结果。
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
|
SQL API 数据库
为API设置默认排序规则结果数据的正确性
Dataphin数据服务支持API调用时通过OrderByList自定义排序,确保数据返回符合业务需求。默认排序在API设计时至关重要,因为它影响用户体验、数据一致性及查询正确性。新版本 Dataphin 提供了排序优先级设置,允许在SQL脚本或OrderByList中指定排序,以适应不同场景。
289 0
|
网络协议 算法 Linux
深度解密 TCP 三次握手与四次挥手
深度解密 TCP 三次握手与四次挥手
391 9
|
缓存 边缘计算 应用服务中间件
一篇文章让你搞懂到底什么是 CDN
一篇文章让你搞懂到底什么是 CDN
1633 1
|
前端开发 Java 开发者
【zookeeper 第一篇章】认识一下 zookeeper
Spring框架是为Java应用程序提供全面支持的平台,帮助开发者解决基础问题,专注于业务逻辑。它具备IOC(控制反转)和AOP(面向切面编程)等功能,提供MVC架构支持、事务管理和JDBC异常处理等。Spring的核心是IOC容器,通过依赖注入管理组件。依赖注入包括构造函数、setter及接口注入等方式。IOC的优点在于减少代码量,促进松耦合。
94 0
|
人工智能 监控 前端开发
基于ReAct机制的AI Agent
当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AI Agent,比如字节的Coze,百度的千帆等,还有开源的Dify。你是否想知道其中的原理?是否想过自己如何实现一套AI Agent?当然,借助LangChain就可以。
|
域名解析 负载均衡 网络协议
【域名解析DNS专栏】DNS解析中的Anycast技术:原理与优势
【5月更文挑战第27天】Anycast技术是解决DNS解析高效、稳定和安全问题的关键。它将一个IP地址分配给多地服务器,客户端请求自动路由至最近的低负载服务器,减少延迟,提高解析速度。此外,Anycast实现负载均衡,缓解DDoS攻击,并确保高可用性。通过遍历Anycast服务器选择最低延迟者进行DNS解析,实现网络性能优化。随着技术发展,Anycast在DNS解析中的应用将更加广泛。
1084 2