zookeeper的特性
本文介绍 zookeeper 的一些基本概念。
会话(Session)
- 客户端与服务端的一次会话连接,本质是 TCP 长连接;
- 通过会话可以进行心跳检测和数据传输;
- 接收来自服务端的 watch 事件通知
- 可以设置超时时间
数据模型
zk 的目录结构和 Unix 系统类似,采用分层结构。树形结构中的每个节点被称为数据节点(znode)。每个 znode 都有数据类型,可以存储数据,也可以挂子节点。节点路径用斜线分隔:/Zoo/Duck,且没有相对路径。
通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化。
- 通过数据结构stat来了解数据的变化 ACL的变化和时间戳
- 数据发生变化时,版本号会递增
- 可以对Znode中的数据进行读写操作
数据节点(Znode)
- Zk 树形结构中的数据节点,用于存储数据
- 持久节点:一旦创建,除非主动调用删除操作,否则一直存储在zk上
- 临时节点:与客户端的会话绑定,一旦客户端会话失效,这个客户端创建的所有临时节点都会被移除
- SEQUENTIAL Znode:创建临时节点时,如果设置属性 SEQUENTIAL,则会自动在节点名后面追加一个整型数字
对于持久节点和临时节点,同一个znode下,节点的名称是唯一的!
zk 节点类型
- 持久节点(PERSISTENT)
- 持久顺序节点(PERSISTENT_SEQUENTIAL)
- 临时节点(EPHEMERAL)
- 临时顺序节点(EPHEMERAL_SEQUENTIAL)
持久节点
启动一个 zkCli 创建一个持久节点,即使创建节点的会话关闭,该节点也不会被删除。
|
|
临时节点
启动一个 zkCli 之后创建临时节点
|
|
将创建临时节点的会话关闭之后,临时节点将会消失。(可以再起一个 zkCli 验证)
顺序节点
创建数据节点
|
|
zk 节点状态属性
序号 | 属性 | 数据结构 | 描述 |
---|---|---|---|
1 | czxid | long | 节点被创建的Zxid值 |
2 | mzxid | long | 节点被修改的Zxid值 |
3 | pzxid | long | 子节点最近一次被修改时的事务ID |
4 | ctime | long | 节点被创建的时间 |
5 | mtime | long | 节点最后一次被修改的时间 |
6 | versoin | long | 节点被修改的版本号, |
7 | cversion | long | 节点的所拥有子节点被修改的版本号 |
8 | aversion | long | 节点的ACL被修改的版本号 |
9 | emphemeralOwner | long | 如果此节点为临时节点,那么它的值为这个节点拥有者的会话ID;否则,它的值为0 |
10 | dataLength | int | 节点数据域的长度 |
11 | numChildren | int | 节点拥有的子节点个数 |
- 通过 1、2、3:事务ID可以识别出请求的全局顺序
- 通过 6、7、8:基于CAS理论保证分布式数据原子性操作
ACL保障数据的安全
ACL 机制,表示为scheme:id:permissions
,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。zookeeper提供了如下几种机制(scheme):
world: 它下面只有一个id, 叫 anyone,
world:anyone
代表任何人,zookeeper 中对所有人有权限的结点就是属于world:anyone
的auth: 它不需要id, 只要是通过 authentication 的 user 都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password 形式的 authentication)
digest: 它对应的 id 为
username:BASE64(SHA1(password))
,它需要先通过username:password
形式的 authenticationip: 它对应的id为客户机的IP地址,设置的时候可以设置一个 ip 段,比如
ip:192.168.1.0/16
, 表示匹配前16个 bit 的 IP 段