Theory
1. 数据模型
类似Unix目录结构的路径,每个路径成为Znode。
- Znode可以存储数据,数据限制在1MB以内
- 路径必须是完整路径,不支持正则元符号匹配
- /zookeeper是一个保留路径,用来保存管理信息,如配额。
- 临时节点。当客户端的会话断开时,就会删除的节点。
- 持久节点。永久保存在服务器上的节点。
- 顺序节点。在创建节点的时候指定了顺序号标识,那么ZK服务器就会创建一个单调递增的数字给此节点,由此节点的父节点维护这个节点的最大值。
2. 事务ID
Zk中的事务:能够改变ZK服务器状态的操作。包括节点创建于删除、数据节点内容更新和客户端会话创建与失效等。
分配一个全局的64位数字。
3. 节点状态信息
my_data
cZxid = 0xa #Created ZXID,表示该数据节点被创建时的事务ID
ctime = Sat Oct 29 00:26:24 PDT 2016 #Created Time,创建时间
mZxid = 0xa #Modified ZXID,表示该节点最后一次被更新时的事务ID
mtime = Sat Oct 29 00:26:24 PDT 2016 #Modified Time,修改时间
pZxid = 0xa #表示该节点的子节点列表最后一次被修改时的事务ID。内部变更不会影响该值。
cversion = 0 #子节点的版本号
dataVersion = 0 #数据版本号
aclVersion = 0 #节点的ACL版本号
ephemeralOwner = 0x0 #创建该临时节点的会话ID。如果节点为持久节点,则值为0
dataLength = 7 #数据的长度
numChildren = 0 #子节点的个数
3. ACL
每个Znode都可以设置一个Acl列表。
权限模式:Scheme
- digest:用户名,密码。通常是{ username:BASE64(SHA-1(username:password)) }
- super:超级用户,此模式下用户可以对数据做任何操作。
- ip:ip地址,地址段。如192.168.0.1/24。
- world:最开放的。world:anyone
授权对象:ID
不同的模式对应不同的授权对象。
ACL权限
- CREATE:create
- READ:get*
- WRITE:set
- DELETE:delete
- ADMIN:setACL
4. Watcher
服务端向客户端推送数据的变更通知。
- 只会触发一次,客户端需要重复注册才会收到更多的通知。
- 一次处理流程:客户端注册Watcher,服务端处理Watcher,客户端回调Watcher。
- 由Watcher接口定义了标准的处理流程,一般需要自己实现此接口。
- WatchedEvent定义了三个数据:KeeperState,EventType,Path,分别是连接状态,数据变更的类型,节点路径。
可应用Watcher的接口
exists
触发时机:节点创建、删除、变更数据时。
getData
触发时机:节点删除、变更数据时
getChildren
触发时机:子节点创建、删除时以及节点被删除时。
5. Session
- 客户端发起的tcp长连接,通过心跳检测。
- 自动故障切换,所有的会话状态仍然有效。
会话状态
CONNECTING,CONNECTED,RECONNECTING,RECONNECTED,CLOSE。
属性
- sessionID:标识唯一一次会员。
- timeOut:会话超时时间。
- tickTime:下次会话超时时间。
- isClosing:是否已经被关闭
6. Database
- ZKDatabase,内存数据库,负责管理ZK的所有会话,DataTree存储和事务日志。
- ZKDB会定时向磁盘dump快照数据。
- ZK的数据存储是通过DataTree实现的,是一棵树。最小的数据单元是DataNode,即DataTree上面的节点。