本文为笔者学习 ZooKeeper 笔记,主要内容来自于 ZooKeeper 官网文档的翻译。
前序笔记
ZooKeeper快速启动
ZooKeeper 简介
ZooKeeper有一个层次命名空间,非常像分布式文件系统。唯一的区别是,名称空间中的每个节点都可以拥有数据以及子节点。这就像一个允许文件同时作为目录的文件系统。到节点的路径总是表示为规范的、绝对的、斜杠分隔的路径;没有相对参照。任何 unicode 字符都可以在路径中使用,受以下约束:
- 空字符(\u0000)不能作为路径名的一部分。(这将导致与 C 语言绑定出现问题。)
- 以下字符不能使用,因为它们不能很好地显示:\u0001 ~ \u001F 和 \u007F ~ \ u009F。
- 不能包含以下字符:\ud800 ~ uF8FF、\uFFF0 ~ uFFFF。
- “.” 字符可以作为另一个名称的一部分,但是 “.” 和 “…” 不能单独用来指示路径上的节点,因为ZooKeeper不使用相对路径。以下语句无效:”/ a / b / . / c” 或 “c / a / b / . . /”。
- 关键字 “zookeeper” 被保留。
1. Znodes
ZooKeeper树中的每个节点都称为 znode 。
每个 Znode 主要维护了以下信息
-
path:在 ZooKeeper 中,每个节点都可以通过一个唯一的路径进行标识 -
childNode:每个节点可以创建若干子节点 -
type: ZooKeeper提供了不同种类的节点以满足实际使用需求,ZooKeeper 提供了以下节点类型
-
PERSISTENT: 持久节点,ZooKeeper创建的节点默认为持久节点 -
EPHEMERAL: ZooKeeper也有临时节点的概念。只要创建临时节点的会话保持活动,这些节点就会存在。当会话结束时,znode被删除。临时节点不允许有子节点。可以使用getEphemerals() api检索当前会话的临时节点列表。
-
SEQUENTIAL:创建时可以在路径上加上序号作为后缀。适合用于分布式锁、分布式选举等场景。序号为有符号的int (4bytes)),因此会出现溢出,格式为十位数,不足十位数的用 0 填充,该序号由父节点维护
-
CONTAINER:(3.6.0新增)容器节点是特殊用途的znode,用于leader、lock等。当容器的最后一个子元素被删除时,该容器将成为将来某个时候服务器删除的候选对象。在容器节点中创建字节的时,可能会抛出 KeeperException.NoNodeException 异常 -
TTL:(3.6.0新增)当创建PERSISTENT或PERSISTENT_SEQUENTIAL 节点时,您可以选择为znode设置一个以毫秒为单位的TTL。如果znode没有在TTL中修改,并且没有子节点,那么它将成为将来某个时候被服务器删除的候选节点。
- 注意:TTL节点必须通过 system 属性启用,因为它们在默认情况下是禁用的。如果没有配置 system 属性的情况下创建TTL节点,服务器将抛出 KeeperException.UnimplementedException.
-
stat:当前节点的状态信息,主要包括以下信息:
- czxid:创建当前节点的事务 ID
- mzxid:最近修改当前节点的事务 ID
- pzxid :最近导致子节点变更的事务 ID
- ctime:创建当前节点的时间
- mtime:最近修改当前节点的时间
- version:当前节点数据的更改次数(版本号)
- cversion:当前节点字节的的更改次数
- aversion:当前节点 ACL 更改次数
- ephemeralOwner:临时节点所属的会话 ID ,如果当前节点不是临时节点,则该项为 0
- dataLength:当前节点数据长度
- numChildren:当前节点的子节点数
-
data:与当前节点关联的数据。
- ZooKeeper 最初的设计理念是管理协调数据,而不是用于通用数据库或大型对象存储。 节点中的数据一般为配置、状态信息、集合(rendezvous)等协调服务的信息。这些数据相对较小:以千字节(kb)为单位。ZooKeeper 客户端和服务器都进行完整性检查,以确保znodes的数据少于1M,但是平均数据应该比 1M 少得多。对相对较大的数据进行操作将导致某些操作比其他操作花费更多的时间,并会影响某些操作的延迟。通常处理这种大数据的模式是将其存储在大容量存储系统上,如 NFS 或 HDFS ,并在ZooKeeper中存储指向存储位置的指针。
- 存储在名称空间中每个znode上的数据是原子式读写的。读操作获取与znode关联的所有数据字节,写操作替换所有数据。
-
ACL即Access Control List:访问控制列表,用于控制 ZooKeeper 节点的访问操作权限 -
watches:客户端可以在 znodes 上设置监控。watch 是一次性的。对该 znode 的更改会触发 watch,然后 watch 就被清除。当一个watch触发时,ZooKeeper向客户端发送一个通知。
在分布式应用程序工程中,节点可以指通用主机、服务器、集群中的成员、客户端进程等。在ZooKeeper文档中,
- znodes 指的是数据节点;
- Servers 是指组成ZooKeeper服务的机器;
- Quorum peers 指的是组成一个集合的服务器;
- client 是指使用ZooKeeper服务的任何主机或进程。
|