目录
⑤ ZooKeeper 数据模型 znode 结构详解
数据模型
在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端,执行 "ls /" 命令显示:
$ ls /
$ ls /zookeeper
$ ls /zookeeper/quota
Znode 的状态属性
cZxid | 创建节点时的事务ID |
---|---|
ctime | 创建节点时的时间 |
mZxid | 最后修改节点时的事务ID |
mtime | 最后修改节点时的时间 |
pZxid | 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid) |
cversion | 子节点版本号,子节点每次修改版本号加1 |
dataversion | 数据版本号,数据每次修改该版本号加1 |
aclversion | 权限版本号,权限每次修改该版本号加1 |
ephemeralOwner | 创建该临时节点的会话的sessionID。(**如果该节点是持久节点,那么这个属性值为0)** |
dataLength | 该节点的数据长度 |
numChildren | 该节点拥有子节点的数量(只统计直接子节点的数量) |
⑥ Zookeeper session 基本原理
客户端与服务端之间的连接是基于 TCP 长连接,client 端连接 server 端默认的 2181 端口,也就是 session 会话。
从第一次连接建立开始,客户端开始会话的生命周期,客户端向服务端的ping包请求,每个会话都可以设置一个超时时间。
Session 的创建
sessionID: 会话ID,用来唯一标识一个会话,每次客户端创建会话的时候,zookeeper 都会为其分配一个全局唯一的 sessionID。zookeeper 创建 sessionID 类 SessionTrackerImpl 中的源码。
Timeout:会话超时时间。客户端在构造 Zookeeper 实例时候,向服务端发送配置的超时时间,server 端会根据自己的超时时间限制最终确认会话的超时时间。
TickTime:下次会话超时时间点,默认 2000 毫秒。可在 zoo.cfg 配置文件中配置,便于 server 端对 session 会话实行分桶策略管理。
isClosing:该属性标记一个会话是否已经被关闭,当 server 端检测到会话已经超时失效,该会话标记为"已关闭",不再处理该会话的新请求。
Session 的状态
下面介绍几个重要的状态:
-
connecting:连接中,session 一旦建立,状态就是 connecting 状态,时间很短。
-
connected:已连接,连接成功之后的状态。
-
closed:已关闭,发生在 session 过期,一般由于网络故障客户端重连失败,服务器宕机或者客户端主动断开。
会话超时管理(分桶策略+会话激活)
zookeeper 的 leader 服务器再运行期间定时进行会话超时检查,时间间隔是 ExpirationInterval,单位是毫秒,默认值是 tickTime,每隔 tickTime 进行一次会话超时检查。
ExpirationTime 的计算方式:
ExpirationTime = CurrentTime + SessionTimeout; ExpirationTime = (ExpirationTime / ExpirationInterval + 1) * ExpirationInterval;
在 zookeeper 运行过程中,客户端会在会话超时过期范围内向服务器发送请求(包括读和写)或者 ping 请求,俗称心跳检测完成会话激活,从而来保持会话的有效性。
会话激活流程:
激活后进行迁移会话的过程,然后开始新一轮:
⑦ Zookeeper 客户端基础命令使用
zookeeper 命令用于在 zookeeper 服务上执行操作。
首先执行命令,打开新的 session 会话,进入终端。
$ sh zkCli.sh
下面开始讲解基本常用命令使用,其中 acl 权限内容在后面章节详细阐述。
ls 命令
ls 命令用于查看某个路径下目录列表。
格式:
ls path
- path:代表路径。
ls2 命令
ls2 命令用于查看某个路径下目录列表,它比 ls 命令列出更多的详细信息。
格式:
ls2 path
- path:代表路径。
get 命令
get 命令用于获取节点数据和状态信息。
格式:
get path [watch]
- path:代表路径。
- [watch]:对节点进行事件监听。
stat 命令
stat 命令用于查看节点状态信息。
格式:
stat path [watch]
- path:代表路径。
- [watch]:对节点进行事件监听。
create 命令
create 命令用于创建节点并赋值。
格式:
create [-s] [-e] path data acl
- [-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点。
- path:指定要创建节点的路径,比如 /runoob。
- data:要在此节点存储的数据。
- acl:访问权限相关,默认是 world,相当于全世界都能访问。
set 命令
set 命令用于修改节点存储的数据。
格式:
set path data [version]
- path:节点路径。
- data:需要存储的数据。
- [version]:可选项,版本号(可用作乐观锁)。
delete 命令
delete 命令用于删除某节点。
格式:
delete path [version]
- path:节点路径。
- [version]:可选项,版本号(同 set 命令)。
⑧ Zookeeper 四字命令
zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提交相应的命令。
安装 nc 命令:
$ yum install nc # centos 或 $ sudo apt install netcat # ubuntu
四字命令格式:
echo [command] | nc [ip] [port]
ZooKeeper 常用四字命令主要如下:
四字命令 | 功能描述 |
---|---|
conf | 3.3.0版本引入的。打印出服务相关配置的详细信息。 |
cons | 3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。 |
crst | 3.3.0版本引入的。重置所有连接的连接和会话统计信息。 |
dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。 |
envi | 打印出服务环境的详细信息。 |
reqs | 列出未经处理的请求 |
ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。 |
stat | 输出关于性能和连接的客户端的列表。 |
srst | 重置服务器的统计。 |
srvr | 3.3.0版本引入的。列出连接服务器的详细信息 |
wchs | 3.3.0版本引入的。列出服务器watch的详细信息。 |
wchc | 3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。 |
wchp | 3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。 |
mntr | 3.4.0版本引入的。输出可用于检测集群健康状态的变量列表 |
参考官方链接:ZooKeeper: Because Coordinating Distributed Systems is a Zoo
四字命令使用
stat 命令
stat 命令用于查看 zk 的状态信息,实例如下:
$ echo stat | nc 192.168.3.38 2181
ruok 命令
ruok 命令用于查看当前 zkserver 是否启动,若返回 imok 表示正常。实例如下:
$ echo ruok | nc 192.168.3.38 2181
dump 命令
dump 命令用于列出未经处理的会话和临时节点。实例如下:
$ echo dump | nc 192.168.3.38 2181
conf 命令
conf 命令用于查看服务器配置。实例如下:
$ echo conf | nc 192.168.3.38 2181
cons 命令
cons 命令用于展示连接到服务器的客户端信息。实例如下:
$ echo cons | nc 192.168.3.38 2181
envi 命令
envi 命令用于查看环境变量。实例如下:
$ echo envi | nc 192.168.3.38 2181