20201226 ZooKeeper - 拉勾教育
作者:互联网
环境信息
- 教学版本:
3.4.14
- 官网最新稳定版本:
3.6.2
- 笔记版本:
3.6.2
ZooKeeper 简介
分布式系统定义及面临的问题
- ZooKeeper 最为主要的使用场景,是作为分布式系统的分布式协同服务。
- 我们将分布式系统定义为:分布式系统是同时跨越多个物理主机,独立运行的多个软件所组成系统。类比一下,分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由 n 个服务器组成起来的集群,算力是可以无限扩张的。
- 优点显而易见,人多干活快,并且互为备份。但是缺点也很明显。解决办法是在节点间做好 信息同步。
- 分布式系统的协调工作就是通过某种方式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信方式有两种:
- 通过网络进行信息共享
- 通过共享存储
ZooKeeper 如何解决分布式系统面临的问题
ZooKeeper 对分布式系统的协调,使用的是第二种方式,共享存储。即使使用共享存储,分布式应用也需要和存储进行网络通信。
注意:Slave 节点要想获取 ZooKeeper 的更新通知,需事先在关心的数据节点上设置观察点。
大多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。 ZooKeeper 解决协同问题的关键,就是在于保证分布式系统信息的一致性。
ZooKeeper 的基本概念
ZooKeeper 是一个开源的分布式协调服务,其设计目标是将那些复杂的且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一些简单的接口提供给用户使用。 ZooKeeper 是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据订阅 / 发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能
- 集群角色
- 通常在分布式系统中,构成一个集群的每一台机器都有自己的角色,最典型的集群就是 Master/Slave 模式(主备模式),此情况下把所有能够处理写操作的机器称为 Master 机器,把所有通过异步复制方式获取最新数据,并提供读服务的机器为 Slave 机器。
- 而在 ZooKeeper 中,这些概念被颠覆了。它没有沿用传递的 Master/Slave 概念,而是引入了 Leader 、 Follower 、 Observer 三种角色。 ZooKeeper 集群中的所有机器通过 Leader 选举来选定一台被称为 Leader 的机器, Leader 服务器为客户端提供读和写服务,除 Leader 外,其他机器包括 Follower 和 Observer , Follower 和 Observer 都能提供读服务,唯一的区别在于 Observer 不参与 Leader 选举过程,不参与写操作的过半写成功策略,因此 Observer 可以在不影响写性能的情况下提升集群的性能。
- 会话(Session)
- Session 指客户端会话, 一个客户端连接是指客户端和服务端之间的一个 TCP 长连接, ZooKeeper 对外的服务端口默认为 2181 ,客户端启动的时候,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够心跳检测与服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能够通过该连接接受来自服务器的 Watch 事件通知。
- 数据节点(ZNode)
- 在谈到分布式的时候,我们通常说的“节点”是指组成集群的每一台机器。然而,在 ZooKeeper 中, “节点”分为两类,第一类同样是指构成集群的机器,我们称之为机器节点;第二类则是指数据模型中的数据单元,我们称之为数据节点 —— ZNode 。 ZooKeeper 将所有数据存储在内存中,数据模型是一棵树( ZNode Tree ),由斜杠( / )进行分割的路径,就是一个 ZNode ,例如 /app/path1 。每个 ZNode 上都会保存自己的数据内容,同时还会保存一系列属性信息。
- 版本
- 刚刚我们提到, ZooKeeper 的每个 ZNode 上都会存储数据,对于每个 ZNode , ZooKeeper 都会为其维护一个叫作 Stat 的数据结构, Stat 记录了这个 ZNode 的三个数据版本,分别是 dataVersion (当前 ZNode 的版本)、 cversion (当前 ZNode 子节点的版本)、 aclVersion (当前 ZNode 的 ACL 版本)。
- Watcher(事件监听器)
- Watcher(事件监听器),是 ZooKeeper 中一个很重要的特性, ZooKeeper 允许用户在指定节点上注册一些 Watcher ,并且在一些特定事件触发的时候, ZooKeeper 服务端会将事件通知到感兴趣的客户端,该机制是 ZooKeeper 实现分布式协调服务的重要特性
- ACL(Access Control Lists)
- ZooKeeper 采用 ACL ( Access Control Lists )策略来进行权限控制,其定义了如下五种权限,其中需要注意的是, CREATE 和 DELETE 这两种权限都是针对子节点的权限控制 :
- CREATE :创建子节点的权限。
- READ :获取节点数据和子节点列表的权限。
- WRITE :更新节点数据的权限。
- DELETE :删除子节点的权限。
- ADMIN :设置节点 ACL 的权限。
- ZooKeeper 采用 ACL ( Access Control Lists )策略来进行权限控制,其定义了如下五种权限,其中需要注意的是, CREATE 和 DELETE 这两种权限都是针对子节点的权限控制 :
ZooKeeper 环境搭建
ZooKeeper 安装方式有三种,单机模式和集群模式以及伪集群模式。
- 单机模式: ZooKeeper 只运行在一台服务器上,适合测试环境;
- 集群模式: ZooKeeper 运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”
- 伪集群模式:就是在一台服务器上运行多个 ZooKeeper 实例;
单机模式搭建
-
官网下载安装文件
-
上传到服务器,解压
cd /hwj/ tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz
-
创建 data 文件夹
cd apache-zookeeper-3.6.2-bin/ mkdir data
-
修改配置文件名称
cd conf cp zoo_sample.cfg zoo.cfg
-
修改 zoo.cfg 中的 data 属性
dataDir=/hwj/apache-zookeeper-3.6.2-bin/data
-
启动 ZooKeeper 服务
# zkServer.sh 用法 ./zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd} # 常用命令 ## 启动 ./zkServer.sh start ## 停止 ./zkServer.sh stop ## 重启 ./zkServer.sh restart ## 查看状态 ./zkServer.sh status # 客户端连接 ./zkCli.sh
伪集群模式搭建
集群规划:
- 部署目录在
/hwj/zkCluster
,分别为zk01
、zk02
、zk03
- myid 文件内容分别为 1、2、3
- 占用端口分别为 12181、12182、12183
操作步骤:
-
解压并修改目录名称,将服务部署在
/hwj/zkCluster/zk01
目录 -
创建 data 和 logs 目录,在 data 目录下创建
myid
文件echo "1" > myid
-
修改配置文件
clientPort=12181 dataDir=/hwj/zkCluster/zk01/data dataLogDir=/hwj/zkCluster/zk01/data/logs # server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口 server.1=192.168.181.130:12881:13881 server.2=192.168.181.130:12882:13882 server.3=192.168.181.130:12883:13883
-
创建便捷脚本 start.sh,统一启停集群
#!/usr/bin/env bash echo "================ zk01 ================" /hwj/zkCluster/zk01/bin/zkServer.sh $1 echo "================ zk02 ================" /hwj/zkCluster/zk02/bin/zkServer.sh $1 echo "================ zk03 ================" /hwj/zkCluster/zk03/bin/zkServer.sh $1
ZooKeeper 基本使用
ZooKeeper 系统模型
ZooKeeper 数据模型 ZNode
在 ZooKeeper 中,数据信息被保存在一个个数据节点上,这些节点被称为 ZNode 。 ZNode 是 ZooKeeper 中最小数据单位,在 ZNode 下面又可以再挂 ZNode ,这样一层层下去就形成了一个层次化命名空间 ZNode 树,我们称为 ZNode Tree ,它采用了类似文件系统的层级树状结构进行管理。见下图示例:
ZNode 的类型
ZooKeeper 节点类型可以分为三大类:
- 持久性节点(Persistent)
- 临时性节点(Ephemeral)
- 顺序性节点(Sequential)
在开发中在创建节点的时候通过组合可以生成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的生命周期
- 持久节点: 是 ZooKeeper 中最常见的一种节点类型,所谓持久节点,就是指节点被创建后会一直存在服务器,直到删除操作主动清除
- 持久顺序节点: 就是有顺序的持久节点,节点特性和持久节点是一样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示其顺序。
- 临时节点: 就是会被自动清理掉的节点,它的生命周期和客户端会话绑在一起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。
- 临时顺序节点: 就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀。
事务 ID
- 首先,先了解,事务是对物理和抽象的应用状态上的操作集合。往往在现在的概念中,狭义上的事务通常指的是数据库事务,一般包含了一系列对数据库有序的读写操作,这些数据库事务具有所谓的 ACID 特性,即原子性( Atomic )、一致性( Consistency )、隔离性( Isolation )和持久性( Durability )。
- 而在 ZooKeeper 中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新等操作。对于每一个事务请求, ZooKeeper 都会为其分配一个全局唯一的事务 ID ,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些更新操作请求的全局顺序
ZNode 的状态信息
ls2
命令在新版本已被移除,使用 ls -s
替代
[zk: localhost:12181(CONNECTED) 2] ls -s /zookeeper
[config, quota]
cZxid = 0x0
ctime = Wed Dec 31 16:00:00 PST 1969
mZxid = 0x0
mtime = Wed Dec 31 16:00:00 PST 1969
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。其中 [config, quota]
是数据内容,其他的属于状态信息。
cZxid
就是 Create ZXID,表示节点被创建时的事务ID。ctime
就是 Create Time,表示节点创建时间。mZxid
就是 Modified ZXID,表示节点最后一次被修改时的事务ID。mtime
就是 Modified Time,表示节点最后一次被修改的时间。pZxid
表示该节点的子节点列表最后一次被修改时的事务 ID 。只有子节点列表变更才会更新pZxid
,子节点内容变更不会更新。cversion
表示子节点的版本号。dataVersion
表示内容版本号。aclVersion
标识 acl 版本ephemeralOwner
表示创建该临时节点时的会话sessionID
,如果是持久性节点那么值为 0dataLength
表示数据长度。numChildren
表示直系子节点数。
Watcher —— 数据变更通知
- ZooKeeper 使用 Watcher 机制实现分布式数据的发布 / 订阅功能
- 一个典型的发布 / 订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。
- 在 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。 ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher ,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
- ZooKeeper 的 Watcher 机制主要包括 客户端线程、客户端 WatcherManager 、 ZooKeeper 服务器 三部分。
- 具体工作流程为:客户端在向 ZooKeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
ACL —— 保障数据的安全
ZooKeeper 作为一个分布式协调框架,其内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于 ZooKeeper 进行构造的分布式系统的运行状态,因此,如何保障系统中数据的安全,从而避免因误操作所带来的数据随意变更而导致的数据库异常十分重要,在 ZooKeeper 中,提供了一套完善的 ACL ( Access Control List )权限控制机制来保障数据的安全。
我们可以从三个方面来理解 ACL 机制: 权限模式( Scheme )、授权对象( ID )、权限( Permission ) ,通常使用 scheme:id:permission
来标识一个有效的 ACL 信息。
权限模式: Scheme
-
IP
- IP 模式就是通过 IP 地址粒度来进行权限控制,如
ip:192.168.0.110
表示权限控制针对该 IP 地址,同时 IP 模式可以支持按照网段方式进行配置,如ip:192.168.0.1/24
表示针对192.168.0.*
这个网段进行权限控制。
- IP 模式就是通过 IP 地址粒度来进行权限控制,如
-
Digest
- Digest 是最常用的权限控制模式,要更符合我们对权限控制的认识,其使用
username:password
形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。 - 当我们通过
username:password
形式配置了权限标识后, ZooKeeper 会先后对其进行 SHA-1 加密和 BASE64 编码。
- Digest 是最常用的权限控制模式,要更符合我们对权限控制的认识,其使用
-
World
- World 是一种最开放的权限控制模式,这种权限控制方式几乎没有任何作用,数据节点的访问权限对所有用户开放,即所有用户都可以在不进行任何权限校验的情况下操作 ZooKeeper 上的数据。另外, World 模式也可以看作是一种特殊的 Digest 模式,它只有一个权限标识,即
world:anyone
。
- World 是一种最开放的权限控制模式,这种权限控制方式几乎没有任何作用,数据节点的访问权限对所有用户开放,即所有用户都可以在不进行任何权限校验的情况下操作 ZooKeeper 上的数据。另外, World 模式也可以看作是一种特殊的 Digest 模式,它只有一个权限标识,即
-
Super
- Super 模式,顾名思义就是超级用户的意思,也是一种特殊的 Digest 模式。在 Super 模式下,超级用户可以对任意 ZooKeeper 上的数据节点进行任何操作。
授权对象: ID
授权对象指的是权限赋予的用户或一个指定实体,例如 IP 地址或是机器等。在不同的权限模式下,授权对象是不同的,表中列出了各个权限模式和授权对象之间的对应关系。
权限模 式 | 授权对象 |
---|---|
IP | 通常是⼀个 IP 地址或 IP 段:例如:192.168.10.110 或 192.168.10.1/24 |
Digest | 自定义,通常是 username:BASE64(SHA-1(username:password)) 例如:zm:sdfndsllndlksfn7c= |
Digest | 只有⼀个ID : anyone |
Super | 超级用户 |
权限
权限就是指那些通过权限检查后可以被允许执行的操作。在 ZooKeeper 中,所有对数据的操作权限分为以下五大类:
- CREATE ( C ):数据节点的创建权限,允许授权对象在该数据节点下创建子节点。
- DELETE ( D ):子节点的删除权限,允许授权对象删除该数据节点的子节点。
- READ ( R ):数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等。
- WRITE ( W ):数据节点的更新权限,允许授权对象对该数据节点进行更新操作。
- ADMIN ( A ):数据节点的管理权限,允许授权对象对该数据节点进行 ACL 相关的设置操作。
ZooKeeper 命令行操作
-
客户端连接服务器
# 连接本地的zookeeper服务器 ./zkcli.sh # 连接指定的服务器 ./zkCli.sh -server ip:port
客户端操作:
ZooKeeper -server host:port -client-configuration properties-file cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path [-b batch size]
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
version
参考资料
标签:ZNode,拉勾,ZooKeeper,20201226,path,权限,节点,客户端 来源: https://www.cnblogs.com/huangwenjie/p/14191606.html