zookeeper的特性

本文介绍 zookeeper 的一些基本概念。

会话(Session)

  • 客户端与服务端的一次会话连接,本质是 TCP 长连接;
  • 通过会话可以进行心跳检测和数据传输;
  • 接收来自服务端的 watch 事件通知
  • 可以设置超时时间

数据模型

zookeeper数据模型

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 创建一个持久节点,即使创建节点的会话关闭,该节点也不会被删除。

1
2
3
4
[zk: localhost:2181(CONNECTED) 10] create /node nodedata
Created /node
[zk: localhost:2181(CONNECTED) 11] ls /
[node, zookeeper]

临时节点

启动一个 zkCli 之后创建临时节点

1
2
3
4
[zk: localhost:2181(CONNECTED) 3] create -e /node1 node1data
Created /node1
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper, node1]

将创建临时节点的会话关闭之后,临时节点将会消失。(可以再起一个 zkCli 验证)

顺序节点

创建数据节点

1
2
3
4
5
6
[zk: localhost:2181(CONNECTED) 12] create -s /node/seq 321
Created /node/seq0000000000
[zk: localhost:2181(CONNECTED) 13] create -s /node/seq 322
Created /node/seq0000000001
[zk: localhost:2181(CONNECTED) 15] ls /node
[seq0000000000, seq0000000001]

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 形式的 authentication

  • ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个 ip 段,比如 ip:192.168.1.0/16, 表示匹配前16个 bit 的 IP 段

原文地址:https://www.cnblogs.com/shuiyj/p/13185212.html