ZooKeeper详解2.基础知识
2019-03-07 本文已影响15人
卢卡斯哔哔哔
1 ZooKeeper的结构
1.1 数据模型
image.png- 可以把Zookeeper理解为一个高可用的文件系统,但是它没有文件和文件夹的概念,只有一个叫做znode的节点。znode即是数据的容器,也是其他节点的容器(即是一个可以存储数据的文件夹)。我们用父节点和子节点的关系来表示组和成员的关系,那么一个节点代表一个组,组节点下的子节点代表组内的成员。如上图所示。
- ZooKeeper包含一个树形的数据模型,每一个节点称为znode。一个znode中包含了存储的数据和ACL(Access Control List)。
- ZooKeeper的设计适合存储少量的数据,并不适合存储大量数据,所以znode的存储限制最大不超过1M。
- znode的访问操纵是原子性的:客户端访问一个znode时,要么获得全部数据,要么什么也得不到;写操作时,要么写入全部数据,要么什么也写不进去。,ZooKeeper能够保证写操作只会成功和失败,绝对不会出现只写入了一部分数据的情况。
- 我们可以通过path来定位znode,就像Unix系统定位文件一样,使用斜杠来表示路径。但是znode的路径只能使用绝对路径,而不能识别
../
或./
这样的路径。 - 节点的名称是由Unicode字符组成的,除了zookeeper这个字符串,我们可以任意命名节点。
1.2 znode的类型
znode一共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ehpemeral_sequential)
持久节点
- 持久节点可以用来保存数据,即使该节点的创建者消失,持久节点中的信息也不会丢失;
- 持久节点只能通过delete来删除。
临时节点
- 当创建该znode的客户端因为超时或主动关闭时临时节点消失
- 也可以通过delete删除节点
有序节点
一个有序节点被分配为一个单调递增的整数,比如通过create -s /user 0
会创建一个user0000000002
的有序节点,继续创建则会创建出user0000000003
、user0000000004
等节点。
1.3 znode的属性
一个znode不仅可以保存值,还有很多属性来表示其性质,如下所示:
# 该path的对应的值
123
# 创建节点时的事务id
cZxid = 0x5f
# 创建节点时的时间戳
ctime = Wed Mar 06 16:54:38 CST 2019
# 最近一次修改的事务id
mZxid = 0x61
# 最近一次修改的时间戳
mtime = Wed Mar 06 16:54:52 CST 2019
# 子节点列表最后一次被修改的事务id
pZxid = 0x5f
# 子节点的版本号,子节点发生变化子节点版本递增
cversion = 0
# 当前节点数据的版本号,如果数据修改版本号会递增
dataVersion = 1
# 权限版本号,权限发生变化时权限版本号递增
aclVersion = 0
# 临时节点的拥有着,拥有者断开时自动消失
ephemeralOwner = 0x100073f79100005
# 数据长度
dataLength = 3
# 子节点个数
numChildren = 0
2 增删改查
增:create [-s] [-e] path data acl
- [-s]是可选参数,表示是否是有序节点
- [-e]是可选参数,表示是否是临时节点
- acl是权限控制参数,下面会详细讲解
- path和data相当于是key的value
删:delete path [version]
- delete path会删除某个节点
- delete只能用于删除不包含子节点的节点
- 如果带上[version]参数,则要求[version]必须和当前的dataVersion一致,否则会删除失败。
删:rmr path
- rmr可以删除含有子节点的节点
改:set path data [version]
- 设定某一个path为某一个值data
- 每次修改path其dataVersion(数据版本)都会自增
- 如果带上[version]参数,则该参数必须和修改之前的dataVersion一致,否则会修改失败
version No is not valid : /user
查:get path [watch]
- 用于查看一个path的值
- [watch]后面会详细解释
查:ls path [watch]
- 用于查看该path下的所有子节点,跟linux的ls相似
- [watch]后面会详细解释
查:ls2 path [watch]
- 用于查看该path下的所有子节点及其状态,相当于是ls和stat的结合
查:stat path
- 查看节点状态
3 quota命令
quota的意思是限额,可以限制一个path上子节点的个数或者path上的数据长度。
增:setquota -n|-b val path
-n val:设置子节点个数最大为值为val
-b val:设置节点数据长度的最大值val
删:delquota [-n|-b] path
跟setquota中的含义一致,删除path上的quota
查:listquota path
列出改path上的quota信息。
[zk: localhost:2181(CONNECTED) 19] listquota /users
# quota对应的znode的位置
absolute path is /zookeeper/quota/users/zookeeper_limits
# quota设置的值:count表示子节点最大数,bytes表示数据长度最大值
# 为-1表示没有限制
Output quota for /users count=5,bytes=-1
# 当前节点的状态:count的值包括本节点
Output stat for /users count=4,bytes=16
quota细节
- 父节点有quota设置时子节点不允许设置
- 当前节点已经有quota时不允许重复设置
- quota的设置的其实是在
/zookeeper/quota/${path}/zookeeper_limits
中设置的一个znode - quota中count的值包括当前节点,即如果/users有三个子节点,那么count=4
- quota中count的值是递归的,即如果/users/lucas还有子节点,那么该子节点也计算在/users的count中
- 超出quota不会报错,会打印一行WARN日志
4 权限控制
4.1 ACL(Access Control List)简介
ACL是ZooKeeper的权限控制系统。生产环境中,一个ZooKeeper集群可能有多个客户端在连接,需要为不同的客户端分配不同znode的权限,防止误操作。ACL使用schema:id:permission
来描述权限控制,其特性如下:
- ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
- 每个znode支持设置多种权限控制方案和多个权限
- 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
Schema与id
权限模式 | id | 描述 |
---|---|---|
world | 只有一个id:anyone | 默认方式,所有人都可以访问 |
ip | 一个IP地址 | 通常是一个IP地址或是IP段,例如“192.168.122.112” |
auth | 不需要id | 只要是通过authentication的user都有权限 |
digest | username:BASE64(SHA1(password)) | 使用“用户名:密码”方式认证 |
super | 在这种scheme情况下,对应的id可以做任何事情 |
权限
权限 | ACL简写 | 描述 |
---|---|---|
CREATE | c | 可以创建子节点 |
DELETE | d | 可以删除子节点(仅下一级节点) |
READ | r | 可以读取节点数据及显示子节点列表 |
WRITE | w | 可以设置节点数据 |
ADMIN | a | 可以设置节点访问控制列表权限 |
4.2 命令
setAcl path acl
设置znode的权限
# world模式
setAcl path world:anyone:<acl>
# ip模式
setAcl path ip:<ip>:<acl>
# auth模式
addauth digest <user>:<password> #添加认证用户
setAcl path auth:<user>:<acl>
# digest模式
setAcl path digest:<user>:<password>:<acl>
getAcl path
查看path的权限
[zk: localhost:2181(CONNECTED) 0] getAcl /
'world,'anyone
: cdrwa
addauth scheme auth
添加用户权限
5 其他命令
- history:显示历史命令列表
- redo cmdno:重新执行history中的指令
- close:关闭连接
- connect host:port:连接服务器
- quit:退出客户端
- printwatches on|off:设置和显示监视状态
- sync path:强制同步
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port