介绍
简介: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之后计数器将溢出(导致名称“ |
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 | // -s:列出节点状态信息 |
- 参考
1 | # 列出/节点的所有子节点 |
create
在zookeeper中的某个位置创建一个节点
- 语法
1 | // -s:顺序节点,自动累加 |
- 参考
1 | # 创建节点/zoo |
delete
删除节点,只能删空节点
- 语法
1 | delete [-v version] path |
- 参考
1 | # 删除/zoo节点 |
deleteall
删除节点,可以删非空节点
- 语法
1 | deleteall path |
- 参考
1 | # 删除/zoo及其所有子节点 |
get
获取节点数据
- 语法
1 | // -w:添加watch |
- 参考
1 | # 查看/zoo/z2 的数据 |
set
设置节点数据
- 语法
1 | set [-s] [-v version] path data |
- 参考
1 | # 设置/zoo/z2 的数据 为xxx |
stat
获得节点的更新信息
- 语法
1 | // -w:添加watch |
- 参考
1 | # 查看/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 | # world 方式认证 |
使用digest的方式的时候,账号如果不存在,之后getAcl会提示Authentication is not valid
可以通过 addauth 添加对应的账号密码即可
addauth
添加账号密码
- 语法
1 | addauth scheme auth |
- 参考
1 | # 添加账号 zoo1:pwd123 |