Zookeeper:存储模型
跳到导航
跳到搜索
关于
ZooKeeper提供的名称空间与标准文件系统的名称空间非常相似:
- 名称是由斜杠(/)分隔的路径元素序列。
- ZooKeeper命名空间中的每个节点都由一个路径标识。
与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以有与其关联的数据以及子节点:这就像有一个文件系统,允许一个文件也成为一个目录。
- (ZooKeeper被设计用来存储协调数据:状态信息、配置、位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节的范围内。)
我们使用znode这个术语来清楚地说明我们所说的ZooKeeper数据节点。
- znode维护一个stat结构,其中包含数据更改、ACL更改和时间戳的版本号,以允许缓存验证和协调更新。每次znode的数据更改时,版本号都会增加。例如,每当客户机检索数据时,它也会接收数据的版本。
- 存储在命名空间中每个znode上的数据是原子读写的。Reads获取与znode相关的所有数据字节,write替换所有数据。每个节点都有一个访问控制列表(ACL),限制谁可以做什么。
- ZooKeeper也有短暂节点的概念。只要创建znode的会话处于活动状态,这些znode就存在。当会话结束时,znode被删除。
下图描述了用于内存表示的ZooKeeper文件系统的树结构:【???】
在图中,首先有一个由“/”分隔的znode。在根目录下,有两个逻辑命名空间:
- config 命名空间:用于集中式配置管理;
- 在 config 命名空间下,每个znode最多可存储1MB的数据。这与UNIX文件系统相类似,除了父znode也可以存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为 ZooKeeper 数据模型。
- workers 命名空间:用于命名。
Znode
每个znode由一个名称标识,并用路径(/)序列分隔。
Znode 兼具文件和目录两种特点:既像文件一样维护着数据长度、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。
每个Znode由三个部分组成:
- stat:此为状态信息,描述该Znode版本、权限等信息:
- 版本号:每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。
- 当多个zookeeper客户端尝试在同一znode上执行操作时,版本号的使用就很重要。
- 操作控制列表(ACL):ACL基本上是访问znode的认证机制。
- 它管理所有znode读取和写入操作。
- 时间戳:时间戳表示创建和修改znode所经过的时间。通常以毫秒为单位。
- ZooKeeper用“事务ID”(zxid)标识znode的每个更改:Zxid 是唯一的,并且为每个事务保留时间,以便你可以轻松地确定从一个请求到另一个请求所经过的时间。
- 数据长度:存储在znode中的数据总量是数据长度。
- 最多可以存储 1 MB 的数据。
- 版本号:每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。
- data:与该Znode关联的数据。
- children:该Znode下的节点。
Znode的类型
Znode被分为以下类型:
- 持久节点(persistent):即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。
- 默认情况下,除非另有说明,否则所有znode都是持久的。
- 临时节点(ephemeral):客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。
- 因此,只有临时节点不允许有子节点。
- 如果临时节点被删除,则下一个合适的节点将填充其位置。
- 临时节点在leader选举中起着重要作用。【???】
- 顺序节点(sequential):当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将 10 位的序列号附加到原始名称来设置znode的路径。
- 例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为 0000000002。
- 如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。
- 顺序节点可以是持久的或临时的。
- 顺序节点在锁定和同步中起重要作用。【???】
Znode 的状态属性
命令行终端执行 get 命令显示节点的属性,如下:
$ get /runoob
其中,各项属性含义如下:
属性 | 含义 |
---|---|
cZxid | 创建节点时的事务ID |
ctime | 创建节点时的时间 |
mZxid | 最后修改节点时的事务ID |
mtime | 最后修改节点时的时间 |
pZxid | 表示该节点的子节点列表最后一次修改的事务ID。
|
cversion | 子节点版本号,子节点每次修改版本号加1 |
dataversion | 数据版本号,数据每次修改该版本号加1 |
aclversion | 权限版本号,权限每次修改该版本号加1 |
ephemeralOwner | 创建该临时节点的会话的sessionID。
|
dataLength | 该节点的数据长度 |
numChildren | 该节点拥有子节点的数量(只统计直接子节点的数量) |
节点特性
- 同一级节点 key 名称是唯一的。
- 创建节点时,必须要带上全路径。
- session 关闭,临时节点清除。
- 自动创建顺序节点。
- watch 机制,监听节点变化。
- 事件监听机制类似于观察者模式,watch 流程是客户端向服务端某个节点路径上注册一个 watcher,同时客户端也会存储特定的 watcher,当节点数据或子节点发生变化时,服务端通知客户端,客户端进行回调处理。
- 特别注意:监听事件被单次触发后,事件就失效了。
- delete 命令只能一层一层删除。
- 新版本可以通过 deleteall 命令递归删除。
- rmr 命令用于递归删除。
这些节点特性的存在使 zookeeper 开发出不同的场景应用,如:
- 数据发布/订阅
- 负载均衡
- 分布式协调/通知
- 集群管理
- 集群管理
- master 管理
- 分布式锁(临时节点)
- 分布式队列