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:<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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352