Zookeeper基础--简单用法

TOC
  1. 1. 概述
  2. 2. 数据模型
    1. 2.1. 节点信息
    2. 2.2. 节点类型
  3. 3. 安装
    1. 3.1. 安装 JDK
    2. 3.2. 安装 Zookeeper
  4. 4. Zookeeper 常用 Shell 命令
    1. 4.1. 新增节点
    2. 4.2. 更新节点
    3. 4.3. 删除节点
    4. 4.4. 查看节点和查看节点状态
    5. 4.5. 查看节点列表
    6. 4.6. 监听器
  5. 5. ACL 权限控制
    1. 5.1. 授权模式
    2. 5.2. 授予权限
    3. 5.3. 授权相关命令

概述

Zookeeper 是一个分布式协调服务的框架,用来解决分布式集群中的一致性问题。Zookeeper 本质上是一个分布式小文件存储系统,提供类似于目录树的方式存储数据,通过对数据状态变化的监控,实现基于数据的集群管理。Zookeeper 有一下应用场景:

  • 维护配置信息
  • 分布式锁服务
  • 集群管理
  • 生成分布式唯一 ID

数据模型

Zookeeper 数据节点是树状结构,树中的节点称为 znode,一个 znode 有多个子节点,变现为树状。可以使用路径来定位某个 znode,比如/xxx1/xxx2/xxx3 其中 xxx1 为根节点,xxx2 为 2 级节点,xxx3 为 3 级节点,依次类推。znode 兼具文件和目录两种特点,即像文件一样维护数据、元信息、ACL、时间戳等数据结构,又像目录一样作为路径标识的一部分。
znode 大体分为三部分:

  • 节点数据:节点 path,节点 data
  • 节点的子节点 children
  • 节点的状态:描述当前节点创建和修改记录

节点信息

1
2
3
4
5
6
7
8
9
10
11
12
13
[zk: localhost:2181(CONNECTED) 3] get /test0000000000
123
cZxid = 0x2
ctime = Fri Mar 20 15:53:30 UTC 2020
mZxid = 0x2
mtime = Fri Mar 20 15:53:30 UTC 2020
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

查看 test0000000000 节点,第一行展示的是节点的数据。

  • cZxid:数据节点创建时的事务 ID
  • ctime:数据节点创建时的时间
  • mZxid:数据节点左后一次更新时的事务 ID
  • mtime:数据节点最后一次更新时的时间
  • pZxid:数据节点的子节点最后一次被修改时的事务 ID
  • cversion:子节点的更改次数
  • dataVersion:节点数据的更改次数
  • aclVersion:节点的 ACL 的更改次数
  • ephemeralOwner:如果节点是临时节点,则表示创建节点的会话的 SessionID;如果创建的节点是持久节点,则该属性值为 0.
  • dataLength:数据内容的长度
  • numChildren:数据节点当前的子节点个数

节点类型

Zookeeper 中的节点有两种,分别是临时节点和永久节点。节点的类型在创建时即被确定,不能改变。

  • 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,也可以手动删除。Zookeeper 的临时节点不允许拥有子节点。
  • 持久化节点:该节点的生命周期不依赖于会话,并且只有在客户端执行删除操作的时候,它们才会被删除。

安装

安装 JDK

Zookeeper 依赖 JDK,因此需要先安装 JDK.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//解压JDK文件
tar -xzvf jdk-8u231-linux-x64.tar.gz
//打开.bash_profile文件
vim ~/.bash_profile

//编辑以下内容,/data/app/jdk1.8.0_231为刚刚解压的文件夹。
JAVA_HOME=/data/app/jdk1.8.0_231
export JAVA_HOME

PATH=$JAVA_HOME/bin:$PATH
export PATH

//保存退出后,使用以下命令使bash_profile文件生效
source ~/.bash_profile

1
2
3
4
5
// 查看Java是否安装成功
root@master:/data/app# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

安装 Zookeeper

1
2
3
4
5
6
7
//解压Zookeeper压缩包
tar -xzvf zookeeper-3.4.9.tar.gz
//进入Zookeeper配置文件夹
cd zookeeper-3.4.9/conf
//Zookeeper复制官方配置文件示例
cp zoo_sample.cfg zoo.cfg

zoo.cfg 配置文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# CS通信心跳时间,单位是毫秒,默认是2000毫秒。tickTime主要是客户端与服务器端或者是服务器与服务器端之间维持心跳。
tickTime=2000
# 集群中的follower服务器与leader服务器之间初始连接时能容忍的最多心跳数
initLimit=10
# 集群中flower服务器和leader服务器之间的请求和应答最多能容忍的心跳数
syncLimit=5
# 此路径存储Zookeeper数据的内存快照以及事务日志文件,因此需要修改,这里修改到Zookeeper文件夹的data文件夹中
dataDir=/data/app/zookeeper-3.4.9/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
1
2
3
4
5
6
7
8
//进入zookeeper的bin文件夹中
cd bin/
// 启动
./zkServer.sh start
// 停止
./zkServer.sh stop
// 查看状态
./zkServer.sh status

Zookeeper 常用 Shell 命令

新增节点

1
create [-s] [-e] path data # -s为有序节点, -e为临时节点

节点可以分为 4 小类,分别是:

  • 持久化节点
1
2
[zk: localhost:2181(CONNECTED) 0] create /hadoop "123456"
Created /hadoop
  • 持久化有序节点
    创建持久化有序节点,创建的节点名为指定节点名 + 自增序号
1
2
3
4
[zk: localhost:2181(CONNECTED) 0] create -s /a "aaa"
Created /a0000000002
[zk: localhost:2181(CONNECTED) 0] create -s /b "bbb"
Created /b0000000003
  • 临时节点
    创建临时节点,临时节点会在会话过期后删除
1
2
[zk: localhost:2181(CONNECTED) 0] create -e /tmp "tmp"
Created /tmp
  • 临时有序节点
1
2
[zk: localhost:2181(CONNECTED) 0] create -s -e /aa 'aaa'
Created /aa0000000005

更新节点

1
set path [version]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[zk: localhost:2181(CONNECTED) 0] get /hadoop
123456
cZxid = 0x5
ctime = Sat Mar 21 03:26:13 UTC 2020
mZxid = 0x5
mtime = Sat Mar 21 03:26:13 UTC 2020
pZxid = 0x5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] set /hadoop "654321"
cZxid = 0x5
ctime = Sat Mar 21 03:26:13 UTC 2020
mZxid = 0x16
mtime = Sat Mar 21 03:47:22 UTC 2020
pZxid = 0x5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

dataVersion 参数记录数据的版本号,每次修改数据之后,版本号也发生变化。set 命令也可以加入版本号,如果版本号不匹配,Zookeeper 会拒绝更新数据,类似于乐观锁机制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[zk: localhost:2181(CONNECTED) 0] get /hadoop
654321
cZxid = 0x5
ctime = Sat Mar 21 03:26:13 UTC 2020
mZxid = 0x16
mtime = Sat Mar 21 03:47:22 UTC 2020
pZxid = 0x5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] set /hadoop "111" 0
version No is not valid : /hadoop
[zk: localhost:2181(CONNECTED) 2] set /hadoop "111" 1
cZxid = 0x5
ctime = Sat Mar 21 03:26:13 UTC 2020
mZxid = 0x1a
mtime = Sat Mar 21 03:49:37 UTC 2020
pZxid = 0x5
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

删除节点

1
delete path [version]

和更新节点一样,delete 命令可以添加版本号,如果版本号不一致,不允许删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[zk: localhost:2181(CONNECTED) 0] get /hadoop
111
cZxid = 0x5
ctime = Sat Mar 21 03:26:13 UTC 2020
mZxid = 0x1a
mtime = Sat Mar 21 03:49:37 UTC 2020
pZxid = 0x5
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] delete /hadoop 1
version No is not valid : /hadoop
[zk: localhost:2181(CONNECTED) 2] delete /hadoop 2
[zk: localhost:2181(CONNECTED) 3] get /hadoop
Node does not exist: /hadoop

要删除节点和后代节点,可以使用递归删除:

1
rmr path

查看节点和查看节点状态

使用 get 命令可以看到节点的数据和状态。stat 命令只能查看状态,不能查看数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[zk: localhost:2181(CONNECTED) 2] get /hadoop
321
cZxid = 0x21
ctime = Sat Mar 21 03:54:30 UTC 2020
mZxid = 0x22
mtime = Sat Mar 21 03:54:41 UTC 2020
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 3] stat /hadoop
cZxid = 0x21
ctime = Sat Mar 21 03:54:30 UTC 2020
mZxid = 0x22
mtime = Sat Mar 21 03:54:41 UTC 2020
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

查看节点列表

1
2
ls path
ls2 path

使用 ls 和 ls2 命令可以查看某个节点下的所有子节点。ls2 可以返回当前节点的状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[zk: localhost:2181(CONNECTED) 6] create /hadoop/node1 "123"
Created /hadoop/node1
[zk: localhost:2181(CONNECTED) 8] create /hadoop/node2 "321"
Created /hadoop/node2
[zk: localhost:2181(CONNECTED) 9] ls /hadoop
[node2, node1]
[zk: localhost:2181(CONNECTED) 0] ls2 /hadoop
[node2, node1]
cZxid = 0x21
ctime = Sat Mar 21 03:54:30 UTC 2020
mZxid = 0x22
mtime = Sat Mar 21 03:54:41 UTC 2020
pZxid = 0x27
cversion = 2
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 2

监听器

1
2
3
get path [watch]
stat path [watch]
ls\ls2 path [watch]
  • get path watch 注册的监听器能够在节点内容发生改变时,向客户端发送通知。Zookeeper 的触发器是一次性的,触发一次后就失效。
  • stat path [watch]注册的监听器能够在节点状态发生改变时,向客户端发出通知。
  • ls\ls2 path [watch]监听器能够监听该节点下所有子节点的增加和删除操作。

ACL 权限控制

ACL 权限控制,使用 scheme:id:permission 来标识,其中:

  • 权限模式(scheme):授权的策略
  • 授权对象(id):授权的对象
  • 权限(permission 来标识):授权的权限
1
setAcl /test ip:192.168.1.1:crwda  #设置/test节点的权限到IP地址为192.168.1.1的客户端,授予增、删、改、查、管理权限。

Zookeeper 基于每个节点来设置权限,需要多每个节点设置权限。每个 znode 支持设置多种权限控制方案和多个权限。子节点不会继承父节点权限,客户端可能无权访问某个节点,但是可以访问子节点。

授权模式

模式 描述
world 只有一个用户:anyone
ip 对客户端使用 ip 地址认证
auth 使用已添加认证的用户认证
digest 使用“用户:密码”的方式认证

授予权限

权限 ACL 缩写 描述
create c 可以创建子节点
delete d 可以删除子节点
read r 可以读取节点数据以及显示子节点列表
write w 可以设置节点数据
admin a 可以设置节点访问控制列表权限

授权相关命令

命令 使用方式 描述
getAcl getAcl [path] 读取 ACL 权限
setAcl setAcl [path] [acl] 设置 ACL 权限
addauth addauth [scheme] [auth] 添加认证用户