Zookeeper
概述
ZooKeeper 是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper 通过其简单的架构和 API 解决了这个问题。
分布式简介
分布式应用正在运行的一组系统称为集群,而在集群中运行的每台机器被称为节点。分布式应用有两部分, Server(服务器) 和 Client(客户端) 应用程序。服务器应用程序实际上是分布式的,并具有通用接口,以便客户端可以连接到集群中的任何服务器并获得相同的结果。 客户端应用程序是与分布式应用进行交互的工具。
ZooKeeper 本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树种 的节点进行有效管理。从而来维护和监控你存储的数据的状态变化。将通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。诸如:统一命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列(sub/pub)、分布式锁、分布式协调等功能。
Zookeeper中的角色
-
Leader: ZooKeeper 集群工作的核心 事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务的调度者。 对于 create,setData,delete 等有写操作的请求,则需要统一转发给 leader 处理,leader 需要决定编号、执行操作,这个过程称为一个事务。
-
Follower: 处理客户端非事务(读操作)请求即接收客户端请求并返回结果,转发事务请求给 Leader,在选主过程中参与投票,此外,针对访问量比较大的 zookeeper 集群,还可以新增观察者角色
-
Observer: 观察者角色,观察ZooKeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器处理 不会参与任何形式的投票只提供服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力,简单的说就是为了拓展系统,提高读取速度。
ZooKeeper当中的主从与主备:
-
主从:主节点少,从节点多,主节点分配任务,从节点具体执行任务
-
主备:主节点与备份节点,主要用于解决我们主机节点挂掉以后,如何选出来一个新的主节点的问题,保证我们的主节点不会宕机
-
很多时候,主从与主备没有太明显的分界线,很多时候都是一起出现
层次命名空间
Zookeeper的文件系统是一个树形结构,其节点称为znode。在’/'根目录下,有两个逻辑命名空间config 和 workers 。
-
config 命名空间用于集中式配置管理,workers 命名空间用于命名。
-
在 config 命名空间下,每个znode最多可存储1MB的数据。这与UNIX文件系统相类似,除了父znode也可以存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为 ZooKeeper数据模型。
Znode兼具文件和目录两种特点。既像文件一样维护着数据长度、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。每个Znode由三个部分组成:
-
stat:此为状态信息,描述该Znode版本、权限等信息。
-
data:与该Znode关联的数据
-
children:该Znode下的节点
-
版本号 - 每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。
-
操作控制列表(ACL) - ACL基本上是访问znode的认证机制。它管理所有znode读取和写入操作。
-
时间戳 - 时间戳表示创建和修改znode所经过的时间。它通常以毫秒为单位。ZooKeeper从“事务ID"(zxid)标识znode的每个更改。Zxid 是唯一的,并且为每个事务保留时间,以便你可以轻松地确定从一个请求到另一个请求所经过的时间。
-
数据长度 - 存储在znode中的数据总量是数据长度。最多1MB。
节点类型
Znode被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。
-
持久节点 - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
-
临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
-
顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。
Zookeeper的安装
首先在Apache官网找到版本,截止到2022/1/21,目前最新稳定版为3.6.3,链接如下:
https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
1在/opt/目录下
使用wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
下载安装包
2使用tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz解压
3使用mv apache-zookeeper-3.6.3-bin.tar.gz zookeeper进行改名
4在zookeeper目录下使用mkdir data 新建一个data目录
5在zookeeper/conf中,有一个zoo_sample.cfg,使用cp zoo_sample.cfg zoo.cfg进行复制
6使用 vi zoo.cfg进行修改
dataDir = /path/to/zookeeper/data
7 在bin目录下运行zkServer.sh start
得到如下消息证明无误
$ JMX enabled by default
$ Using config: /Users/../zookeeper-3.4.6/bin/../conf/zoo.cfg
$ Starting zookeeper ... STARTED
再输入zkCli.sh
开启命令行模式
8最后如要退出输入zkServer.sh stop
CLI命令行熟悉部分命令
在命令行中可以执行操作:
客户端启动,你可以执行以下操作:
- 创建znode
[zk: localhost:2181(CONNECTED) 6] create /node1
Created /node1
-
监视znode的变化
当指定的znode或znode的子数据更改时,监视器会显示通知。你只能在 get 命令中设置watch。
命令:get /path [watch] 1 -
设置数据
[zk: localhost:2181(CONNECTED) 1] set /node1 "set param"
- 获取数据
[zk: localhost:2181(CONNECTED) 2] get /node1
set param
- 创建znode的子节点
[zk: localhost:2181(CONNECTED) 3] create /node1/childnode1 "child"
Created /node1/childnode1
- 列出znode的子节点
[zk: localhost:2181(CONNECTED) 3] create /node1/childnode1 "child"
Created /node1/childnode1
- 检查状态
[zk: localhost:2181(CONNECTED) 0] stat /node1
cZxid = 0x4
ctime = Fri Jan 21 18:07:17 CST 2022
mZxid = 0x7
mtime = Fri Jan 21 18:09:06 CST 2022
pZxid = 0x8
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
- 移除/删除znode
如果用delete只能删除没有子节点的znode
[zk: localhost:2181(CONNECTED) 5] delete /node1/childnode1
由于才疏学浅,难免有错漏之处,还望不吝赐教。
本文地址转载请注明:https://blog.csdn.net/elapse_/article/details/122629112
Reference:
概念几乎都复制了W3C的Zookeeper教程,链接:https://www.w3cschool.cn/zookeeper/