常规操作之zookeeper

Zookeeper 简介

分布式协调框架,维护一个类似于文件管理系统的数据结构在根节点以下创建应用或服务所需节点(ZNode),节点分为四种:persisent(持久化节点,客户端断开连接后不会自动删除)、persisent-sequential(持久化顺序编号节点,断开连接后zookeeper会给该节点名称进行顺序编号)、ephemral(临时节点,客户端断连后就会自动删除)、ephemeral-sequential(临时有序节点,)。
另外Zookeeper也支持监听通知机制,当节点发生变化后会通知客户端。

Zookeeper 数据结构

ZooKeeper拥有一个层次的命名空间,这个和标准的文件系统非常相似,如下图所示。

在这里插入图片描述在这里插入图片描述

从图中我们可以看出ZooKeeper的数据模型,在结构上和标准文件系统的非常相似,都是采用这种树形层次结构,ZooKeeper树中的每个节点被称为—Znode。和文件系统的目录树一样,ZooKeeper树中的每个节点可以拥有子节点。但也有不同之处:

引用方式

Zonde通过路径引用,如同Unix中的文件路径。路径必须是绝对的,因此他们必须由斜杠字符来开头。除此以外,他们必须是唯一的,也就是说每一个路径只有一个表示,因此这些路径不能改变。在ZooKeeper中,路径由Unicode字符串组成,并且有一些限制。字符串"/zookeeper"用以保存管理信息,比如关键配额信息。

Znode结构

ZooKeeper命名空间中的Znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。图中的每个节点称为一个Znode。 每个Znode由3部分组成:
  ① stat:此为状态信息, 描述该Znode的版本, 权限等信息
  ② data:与该Znode关联的数据
  ③ children:该Znode下的子节点
  ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等等。这些数据的共同特性就是它们都是很小的数据,通常以KB为大小单位。ZooKeeper的服务器和客户端都被设计为严格检查并限制每个Znode的数据大小至多1M,但常规使用中应该远小于此值。

Znode元数据信息

(实现中Zxid是一个64为的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个 新的epoch。低32位是个递增计数。 (2) 版本号)
(1)czxid:create ZXID,数据节点被创建时的事务Id
(2)mzxid:modified ZXID,该节点最终一次更新的事务ID
(3)ctime:create time,该节点的创建时间
(4)mtime:modified time,该节点最后一次更新时间
(5)pzxid:该节点的子节点列表最后一次修改时的事务Id,只有子节点列表修改的时候才会更新,子节点内容被修改的时候不会被更新
(6)cversion:子节点版本号,当前节点的子节点每次变化增加1
(7)dataVersion:节点内的数据被修改的时候版本号自动会自动加一,初始化为0
(8)ephemeral:创建临时节点会话的sessionId,如果当前节点为持久节点则为0
(9)dataLength:数据节点内容长度
(10)numChildren:当前节点的子节点个数

数据访问

ZooKeeper中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
  ACL操作列表

权限简写解释
CREATEC创建子节点
DELETED删除子节点
WRITEW更新当前节点信息
READR读当前节点和子节点信息
ADMINA允许授权对象对当前节点进行ACL相关设置操作

节点类型

ZooKeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
  ① 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
  ② 永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

顺序节点

当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如"0000000001")。当计数值大于232-1时,计数器将溢出。

监控机制

触发器

客户端可以在节点上设置watch,我们称之为监视器。当节点状态发生改变时(Znode的增、删、改)将会触发watch所对应的操作。当watch被触发时,ZooKeeper将会向客户端发送且仅发送一条通知,因为watch只能被触发一次,这样可以减少网络流量。
  
ZooKeeper所管理的watch可以分为两类:
① 数据watch(data watches):getData和exists负责设置数据watch
② 孩子watch(child watches):getChildren负责设置孩子watch

我们可以通过操作返回的数据来设置不同的watch:
① getData和exists:返回关于节点的数据信息
② getChildren:返回孩子列表
因此
① 一个成功的setData操作将触发Znode的数据watch
② 一个成功的create操作将触发Znode的数据watch以及孩子watch
③ 一个成功的delete操作将触发Znode的数据watch以及孩子watch

针对创建watch的三种操作触发的操作范围也不同:
① exists操作上的watch,在被监视的Znode创建、删除或数据更新时被触发。
② getData操作上的watch,在被监视的Znode删除或数据更新时被触发。在被创建时不能被触发,因为只有Znode一定存在,getData操作才会成功。
③ getChildren操作上的watch,在被监视的Znode的子节点创建或删除,或是这个Znode自身被删除时被触发。可以通过查看watch事件类型来区分是Znode,还是他的子节点被删除:NodeDelete表示Znode被删除,NodeDeletedChanged表示子节点被删除。

Watch由客户端所连接的ZooKeeper服务器在本地维护,因此watch可以非常容易地设置、管理和分派。当客户端连接到一个新的服务器时,任何的会话事件都将可能触发watch。另外,当从服务器断开连接的时候,watch将不会被接收。但是,当一个客户端重新建立连接的时候,任何先前注册过的watch都会被重新注册。

可视图化工具

1.IDEA zookeeper插件
2.ZooInspector
3.zookeeper内置zk客户端(/apache-zookeeper-3.5.6-bin/bin/zkCli.sh)

zk命令

  • get path 获取数据

  • stat path 获取该节点信息:

    • (1)czxid. 节点创建时的zxid.
    • (2)mzxid. 节点最新一次更新发生时的zxid.
    • (3)ctime. 节点创建时的时间戳.
    • (4)mtime. 节点最新一次更新发生时的时间戳.
    • (5)dataVersion. 节点数据的更新次数.
    • (6)cversion. 其子节点的更新次数.
    • (7)aclVersion. 节点ACL(授权信息)的更新次数.
    • (8)ephemeralOwner. 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点, 请看后面的讲述.
    • (9)dataLength. 节点数据的字节数.
    • (10)numChildren. 子节点个数.
  • ls2 path get和stat结合

  • create [-s -e] path data

    • -e临时节点
    • -s持久化节点,同时对一个节点增加数据会自动按顺序增加节点目录
    • data数据
  • set path data [version] 修改节点数据信息,但是每次更新会给增加该节点元数据中版本号和最近更新时间,如果version对不上当前版本号那修改就会报错,version=-1表示更新忽略版本号

  • delete path [version] 删除数据,version效果同上

  • stat path [watch] 对目标节点设置触发器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值