ZooKeeper详解2.基础知识

一年又一年,字节跳动 Lark(飞书) 研发团队又双叒叕开始招新生啦!
【内推码】:GTPUVBA
【内推链接】:https://job.toutiao.com/s/JRupWVj
【招生对象】:20年9月后~21年8月前 毕业的同学
【报名时间】:6.16-7.16(提前批简历投递只有一个月抓住机会哦!)
【画重点】:提前批和正式秋招不矛盾!面试成功,提前锁定Offer;若有失利,额外获得一次面试机会,正式秋招开启后还可再次投递。

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的有序节点,继续创建则会创建出user0000000003user0000000004等节点。

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细节
  1. 父节点有quota设置时子节点不允许设置
  2. 当前节点已经有quota时不允许重复设置
  3. quota的设置的其实是在/zookeeper/quota/${path}/zookeeper_limits中设置的一个znode
  4. quota中count的值包括当前节点,即如果/users有三个子节点,那么count=4
  5. quota中count的值是递归的,即如果/users/lucas还有子节点,那么该子节点也计算在/users的count中
  6. 超出quota不会报错,会打印一行WARN日志

4 权限控制

参考ZooKeeper ACL权限控制

4.1 ACL(Access Control List)简介

ACL是ZooKeeper的权限控制系统。生产环境中,一个ZooKeeper集群可能有多个客户端在连接,需要为不同的客户端分配不同znode的权限,防止误操作。ACL使用schema:id:permission来描述权限控制,其特性如下:

  1. ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
  2. 每个znode支持设置多种权限控制方案和多个权限
  3. 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
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:
# ip模式
setAcl path ip::
# auth模式
addauth digest : #添加认证用户
setAcl path auth::
# digest模式
setAcl path digest:::
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

你可能感兴趣的:(ZooKeeper详解2.基础知识)