Zookeeper入门基础知识整理

1.什么是Zookeeper?

在这里插入图片描述
翻译:ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式锁和集群管理。

1.1 维护配置信息

在分布式服务中,不同的服务器提供不同的服务,但不同的服务中可能会有相同的配置文件,当配置文件中的某些内容需要修改的时候如果没有zookeeper的存在那么将需要手动登录不同的服务器进行逐个的修改且修改完以后还需要重启服务来使配置生效,这样不仅麻烦而且容易出错。如果使用zookeeper来维护配置信息,只需要把各个服务器相同的配置内容整理出来并且放在zookeeper的节点中然后让服务器来监听这个节点,当节点的内容发生改变时服务器自动更新自己所需要的配置信息。

1.2 命名服务

zookeeper的命名服务功能主要是根据指定名字来获取资源或服务的地址,提供者等信息,利用其znode的特点和watcher机制,将其作为动态注册和获取服务信息的配置中心,统一管理服务名称和其对应的服务器列表信息,我们能够近乎实时地感知到后端服务器的状态(上线、下线、宕机)。
举例来说,B服务部署在六台服务器上,存在六个完全不同的ip地址,同时B服务本身提供一个dubbo接口对外,此时有个A服务需要调用此接口,如果提供某一台服务器的ip,则存在该服务器宕机情况下接口不可用的情况,再切换ip就会影响服务的正常使用。此时,可以使用zookeeper作为注册中心,B服务的六台服务在指定znode下创建子节点,而A服务调用之前先通过指定znode的路径获取B服务的任意子节点中的ip信息,然后通过ip访问。同时zookeeper动态维护这部分节点,定时利用心跳请求检查B服务的服务器状态,一旦发现某服务器无反馈,就删除节点,防止被A服务获取调用。

1.3 分布式锁

分布式锁的作用:在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时候需要获取到该锁,才能执行相应操作。
利用Zookeeper可以创建临时带序号节点的特性来实现一个分布式锁。当有一个线程访问服务器的时候会在zookeeper中创建一个具有顺序的临时节点,这时候线程会判断自己的序号是不是最小的,如果是最小的那么它就可以获得锁,从而对数据进行处理,当该线程与服务器结束会话时这个创建的临时节点也会被删除。如果不是最小的则会监听它是上一个节点,当这个节点被删除时再获取锁。注意这里每个节点都是只监听它的上一个节点即可,而不是监听序号最小的节点。因为临时节点都是带序号的,而且序号不会回退,所以只需要 监听比其小1的节点。只要比它小1的节点被清除,则它就可以 拿到资源去操作。
在这里插入图片描述

1.4 集群管理

在多台服务器组成的集群中,需要监控每台服务器的状态,一旦某台服务器挂掉了或有新的机器加入集群,集群都要感知到,从而采取相应的措施。一个主动的集群可以自动感知节点的死亡和新节点的加入,它才对更高效的提供服务。通常的做法是有台主机器定时的去获取其他机器的心跳,或其他机器定时主动汇报自己的状态,这种方式存在一定的延时,并且主机器成为单点,一旦挂掉便影响整个集群。

使用Zookeeper可以方便的实现集群管理的功能。思路如下,每个服务器启动时都向zk服务器提出创建临时节点的请求,并且使用getChildren设置父节点的观察,当该服务器挂掉之后,它创建的临时节点也被Zookeeper服务器删除,然后会触发监视器,其他服务器便得到通知。创建新节点也是同理。

2. Zookeeper存储结构

2.1数据结构

zooKeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统:
在这里插入图片描述
树形结构的每个节点都被称作为Znode,Znode节点不仅可以存储数据也可以子节点,所以一个节点既可以是目录也可以是文件。虽然Znode可以存数据但数据一般都不会太大,常用来存一些配置文件和状态信息等不会超过1M。
每个Znode由3部分组成:

  • stat:此为状态信息, 描述该Znode的版本, 权限等信息
  • data:与该Znode关联的数据
  • children:该Znode下的子节点

2.2 节点类型

(1)临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。

(2)永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

当Znode被创建的时候,客户端可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,当客户端请求创建这个节点A后,ZooKeeper会根据父节点的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。这样的节点称为顺序节点
因此节点类型有四种:

  • PERSISTENT-持久化目录节点
  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
  • EPHEMERAL-临时目录节点
  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

2.3 Zxid

致使ZooKeeper节点状态改变的每一个操作都将使节点接收到一个Zxid格式的时间戳,并且这个时间戳全局有序。也就是说,每个对节点的改变都将产生一个唯一的Zxid。如果Zxid1的值小于Zxid2的值,那么Zxid1所对应的事件发生在Zxid2所对应的事件之前。实际上,ZooKeeper的每个节点维护者两个Zxid值,为别为:cZxid、mZxid。

cZxid: 是节点的创建时间所对应的Zxid格式时间戳。

mZxid:是节点的修改时间所对应的Zxid格式时间戳。

2.4 版本号

版本号是用来记录节点数据或者是节点的子节点列表或者是权限信息的修改次数。如果一个节点的version是1,那就代表说这个节点从创建以来被修改了一次。

对节点的每一个操作都将致使这个节点的版本号增加。每个节点维护着三个版本号,他们分别为:

version:节点数据版本号

cversion:子节点版本号

aversion:节点所拥有的ACL版本号

2.5 Watch机制

ZooKeeper允许用户在指定节点上注册一些Watcher,当数据节点发生变化的时候,ZooKeeper服务器会把这个变化的通知发送给感兴趣的客户端。当客户端在ZooKeeper集群中注册了watcher(事件监听器),那么当ZooKeeper中的节点数据发生变化的时候,ZooKeeper会把这一变化的通知发送给客户端,当客户端收到这个变化通知的时候,会触发某些提前定义好的动作。一般来说,ZooKeeper会向客户端发送且仅发送一条通知。

2.6 数据控制权限

ZooKeeper中的每个节点存储的数据要被原子性的操作。ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。
zookeeper 的 ACL 通过 [scheme🆔permissions] 来构成权限列表。

1、scheme:代表采用的某种权限机制,包括 world、auth、digest、ip、super 几种。
2、id:代表允许访问的用户。
3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create©、删除权限 delete(d)、读权限 read®、写权限 write(w)、管理权限admin(a)。

3.Zookeeper集群搭建

#zookeeper3.5版本以后中有个内嵌的管理控制台是通过jetty启动,也会占用8080 端口。 1.删除jetty   2.修改zoo.cfg中的端口或者启动脚本修改端口  3.停用这个服务
admin.serverPort=8081
#ZK中的时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
#Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
#配置ZK的数据目录
dataDir=D:/Environment/ZKMQ/zookeeper/zoo-data/zookeeper1
#用于接收客户端请求的端口号
clientPort=2181
#配置ZK的日志目录
dataLogDir=D:\\Environment\\ZKMQ\\zookeeper\\zoo_log\\zookeeper_log_1\\
#ZK集群节点配置,端口号2888用于集群节点之间数据通信,端口号3888用于集群中Leader选举
server.1=192.168.123.100:2888:3888
server.2=192.168.123.101:2888:3888
server.3=192.168.123.102:2888:3888

需要在dataDir所指的目录中创建一个文件名字为myid,myid 文件由一行组成,其中仅包含该机器 id 的文本。因此,服务器 1 的myid将包含文本“1”,仅此而已。id 在 ensemble 中必须是唯一的,并且应该具有介于 1 和 255 之间的值

4.Zookeeper常用操作命令

#连接某个Zookeeper
zkCli.cmd -server 127.0.0.1:2182
#创建一个节点:辰溪  内容:test
[zk: 127.0.0.1:2182(CONNECTED) 4] create /chenxi "test"
Created /chenxi
#查看根节点下的信息
[zk: 127.0.0.1:2182(CONNECTED) 5] ls /
[activemq, chenxi, test, zookeeper]
#获取chenxi节点下的信息  
[zk: 127.0.0.1:2182(CONNECTED) 6] get /chenxi
test
#监听 chenxi节点 当节点发送改变 会通知该客户端
[zk: 127.0.0.1:2182(CONNECTED) 7] ls -w /chenxi
[]
#获取节点的权限  该节点拥有全部的权限   对应2.6章节
[zk: 127.0.0.1:2182(CONNECTED) 8] getAcl /chenxi
'world,'anyone
: cdrwa
[zk: 127.0.0.1:2182(CONNECTED) 9]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰溪0502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值