zookeeper-doc-介绍

介绍

简介:Apache ZooKeeper是一种用于分布式应用程序的高性能协调服务。提供一种集中式信息存储服务。
特点:数据存在内存中,类似文件系统的树形结构(文件和目录),高吞吐量和低延迟,集群高可靠。
作用:基于zookeeper可以实现分布式统一配置中心、服务注册中心,分布式锁等功能的实现;

  • ZooKeeper数据加载在内存中,这意味着ZooKeeper可以获得高吞吐量和低延迟数。
  • 以读取为主的工作负载中,它尤其快。
  • 操作的Znode的数据大小限制1M。

数据结构

zk的数据结构简单。类似Unix文件系统树形结构,每个目录称为Znode节点,但是又不同于文件系统,既可以做目录拥有子节点,又可以做文件存放数据。

数据结构

数据结构
  • 类似unix文件系统,以 / 为根

  • 区别:节点可以包含与之关联的数据以及子节点 (既是文件也是文件夹)

  • 节点的路径总是表示为规范的、绝对的、斜杠分隔的路径。

  • 名称唯一,命名规范

  • 节点类型:持久、顺序、临时、临时顺序

  • 节点数据构成

Zookeeper数据信息

属性 描述
Zxid ZooKeeper中的每次更改操作都对应一个唯一的事务id,称为Zxid,它是一个全局有序的戳记,如果zxid1小于zxid2,则zxid1发生在zxid2之前。
Version numbers 版本号,对节点的每次更改都会导致该节点的版本号之一增加。这三个版本号是dataVersion(对znode数据的更改次数)、cversion(对znode子节点的更改次数)和aclVersion(对znode ACL的更改次数)。
Ticks 当使用多服务器ZooKeeper时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的2倍)间接公开;如果客户端请求的会话超时小于最小会话超时,服务器将告诉客户端会话超时实际上是最小会话超时。
Real time ZooKeeper除了在znode创建和修改时将时间戳放入stat结构之外,根本不使用Real time或时钟时间

节点元数据信息

属性 描述
cZxid 创建该节点的zxid
ctime 该节点的创建时间
mZxid 该节点的最后修改zxid
mtime 该节点的最后修改时间
pZxid 该节点的最后子节点修改zxid
cversion 该节点的子节点变更次数
dataVersion 该节点的数据被修改的次数
aclVersion 该节点的ACL变更次数
ephemeralOwner 临时节点所有者回话ID,非临时节点为0
dataLength 该节点数据长度
numChildren 子节点数

节点类型

节点 描述 参考
持久节点 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。 create /app1 666
临时节点 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。 create -e /app2 888
顺序节点 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。这个计数器对于父znode是惟一的。计数器的格式为%010d——即填充为0(0)的10位数字(计数器采用这种格式是为了简化排序),即“<路径> 0000000001”。注意:用于存储下一个序列号的计数器是由父节点维护的带符号int(4字节),当增加到2147483647之后计数器将溢出(导致名称“-2147483648”)。 create -s /app1/cp 888
临时顺序节点 create -e -s /app1/ 888

ACL权限

ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda。
这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:

  • world:只有一个用户:anyone,代表所有人(默认)
  • auth:使用已添加认证的用户认证(任何通过验证的用户)
  • digest:使用“用户名:密码”方式认证
  • ip:使用Ip地址认证

使用[scheme:id:permissions]来表示acl权限

会话机制

数据结构

数据结构
  • 一个客户端连接一个会话,由zk分配唯一会话id;
  • 客户端以特定的时间间隔发送心跳以保持会话有效; tickTime
  • 超过会话超时时间未收到客户端的心跳,则判定客户端死了;(默认2倍tickTime)
  • 会话中的请求按FIFO顺序执行。

watch监听机制

客户端可以在znodes上设置watch ,watch是一次性的,当znode更改时,将触发并删除watch,如果还想要继续监听,需要重新设置watch。

当触发watch时,客户端会收到一个数据包,说明znode的更改。

  • 监听方式

    • data watch:监听数据变更
    • child watch:监听子节点变化
  • 触发方式

    • Created event: Enabled with a call to exists.
    • Deleted event: Enabled with a call to exists, getData, and getChildren.
    • Changed event: Enabled with a call to exists and getData.
    • Child event: Enabled with a call to getChildren.
  • 特性

    • 一次性触发:watch触发后即被删除。要持续监控变化,则需要持续设置watch;
    • 有序性:客户端先得到watch通知,后才会看到变化结果
    • 顺序一致性(Sequential Consistency):保证客户端操作是按顺序生效的;
    • 原子性(Atomicity):更新成功或失败。没有部分结果。
    • 单个系统映像:无论连接到哪个服务器,客户端都将看到相同的内容
    • 可靠性:数据的变更不会丢失,除非被客户端覆盖修改。
    • 及时性:保证系统的客户端当时读取到的数据是最新的。
  • 注意事项
    • watch是一次性触发器;如果您获得了一个watch事件,并且希望得到关于未来更改的通知,则必须设置另一个watch。
    • 因为watch是一次性触发器,并且在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个更改。
    • 一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists 、getData都有效,但只会调用watch一次。

命令

help

列出所有命令的用法

ls

列出节点

  • 语法
1
2
// -s:列出节点状态信息
ls [-s] [-w] [-R] path
  • 参考
1
2
3
4
5
# 列出/节点的所有子节点
ls /

# 列出/zook节点的所有子节点
ls /zook

create

在zookeeper中的某个位置创建一个节点

  • 语法
1
2
3
// -s:顺序节点,自动累加
// -e:临时节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
  • 参考
1
2
3
4
5
6
7
8
# 创建节点/zoo
create /zoo

# 创建节点 /zoo/z1
create /zoo/z1

# 创建节点 /zoo/z2 zz2,值为zz2
create /zoo/z2 zz2

delete

删除节点,只能删空节点

  • 语法
1
delete [-v version] path
  • 参考
1
2
# 删除/zoo节点
delete /zoo

deleteall

删除节点,可以删非空节点

  • 语法
1
deleteall path
  • 参考
1
2
# 删除/zoo及其所有子节点
deleteall /zoo

get

获取节点数据

  • 语法
1
2
// -w:添加watch
get [-s] [-w] path
  • 参考
1
2
# 查看/zoo/z2 的数据
get /zoo/z2

set

设置节点数据

  • 语法
1
set [-s] [-v version] path data
  • 参考
1
2
# 设置/zoo/z2 的数据 为xxx
set /zoo/z2 xxx

stat

获得节点的更新信息

  • 语法
1
2
// -w:添加watch
stat [-w] path
  • 参考
1
2
# 查看/zoo/z2 的信息
stat /zoo/z2

removewatches

移除节点的watch

  • 语法
1
removewatches path [-c|-d|-a] [-l]

getAcl

查看节点的acl权限

  • 语法
1
getAcl [-s] path

setAcl

设置节点的acl权限

  • 语法
1
setAcl [-s] [-v version] [-R] path acl
  • 参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# world 方式认证
setAcl /zoo1 world:anyone:crwa

# auth方式认证
setAcl /zoo1 auth::cdrwa
setAcl /zoo1 auth:用户1:用户2..:cdrwa

# ip方式认证
setAcl /zoo1/ip ip:192.168.0.1:cdrwa

# digest方式认证
# 现在linux计算密文
echo -n zoo2:123456 | openssl dgst -binary -sha1 | openssl base64
# x29VSS2Kvpo7dFiVY7jH/opzc98=
setAcl /zoo2 digest:zoo2:x29VSS2Kvpo7dFiVY7jH/opzc98=:cdrwa

使用digest的方式的时候,账号如果不存在,之后getAcl会提示Authentication is not valid
可以通过 addauth 添加对应的账号密码即可

addauth

添加账号密码

  • 语法
1
addauth scheme auth
  • 参考
1
2
# 添加账号 zoo1:pwd123
addauth digest zoo1:pwd123