ZNode
ZNode是ZK树形结构的一个节点,它可以包含或者不包含数据。
ZK提供了如下API,用于操作ZNode。
- create path data
- delete path data
- exists path
- getdata path
- putdata path data
- getChildren path
ZK客户端通过建立一个Session会话,来连接ZK服务,通过这些API来操作ZNode。
ZNode模式
- PERSISTENT-持久化节点:创建这个节点的客户端在与zookeeper服务的连接断开后,这个节点也不会被删除(除非您使用API强制删除)。
- PERSISTENT_SEQUENTIAL-持久化顺序编号节点:当客户端请求创建这个节点A后,zookeeper会根据parent-znode的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当客户端与zookeeper服务的连接断开后,这个节点也不会被删除。
- EPHEMERAL-临时znode节点:创建这个节点的客户端在与zookeeper服务的连接断开后,这个节点就会被删除。ephemeral模式可以用于检测master或者worker是否挂掉。ephemeral模式的节点也可以被主动删除。
- EPHEMERAL_SEQUENTIAL-临时顺序编号znode节点:当客户端请求创建这个节点A后,zookeeper会根据parent-znode的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当创建这个节点的客户端与zookeeper服务的连接断开后,这个节点被删除
zNode的结构
节点的属性
每个znode都包含了一系列的属性,通过命令get,我们可以获得节点的属性。
get /module1/app2
app2
cZxid = 0x20000000e
ctime = Thu Jun 30 20:41:55 HKT 2016
mZxid = 0x20000000e
mtime = Thu Jun 30 20:41:55 HKT 2016
pZxid = 0x20000000e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
版本号
对于每个znode来说,均存在三个版本号:
- dataVersion :数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据)。
- cversion :子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。
- aclVersion ACL的版本号
以数据版本号来说明ZooKeeper中版本号的作用。每一个znode都有一个数据版本号,它随着每次数据变化而自增。ZooKeeper提供的一些API例如setData和delete根据版本号有条件地执行。多个客户端对同一个znode进行操作时,版本号的使用就会显得尤为重要。例如,假设客户端C1对znode /config写入一些配置信息,如果另一个客户端C2同时更新了这个znode,此时C1的版本号已经过期,C1调用setData一定不会成功。这正是版本机制有效避免了数据更新时出现的先后顺序问题。在这个例子中,C1在写入数据时使用的版本号无法匹配,使得操作失败。图2描述了这个情况。
事务ID
对于ZooKeeper来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生。
需要指出的是,zxid对于整个ZooKeeper都是唯一的,即使操作的是不同的znode。
cZxid :Znode创建的事务id。
mZxid :Znode被修改的事务id,即每次对znode的修改都会更新mZxid。
在集群模式下,客户端有多个服务器可以连接,当尝试连接到一个不同的服务器时,这个服务器的状态要与最后连接的服务器的状态要保持一致。ZooKeeper正是使用zxid来标识这个状态,图3描述了客户端在重连情况下zxid的作用。当客户端因超时与S1断开连接后,客户端开始尝试连接S2,但S2延迟于客户端所识别的状态。然而,S3的状态与客户端所识别的状态一致,所以客户端可以安全连接上S3
WatchedEvent
WatchedEvent代表watcher到的事件,它包含发生了什么事件,ZooKeeper的当前连接状态以及产生事件的ZNode路径。
- KeeperState
- EventType
- path
KeeperState
- Disconnected
- SyncConnected
- AuthFailed
- ConnectedReadOnly
- SaslAuthenticated
- Expired
- Unknown(已废弃)
- NoSyncConnected(已废弃)
EventType
EventType包含五种状态:
- None
- NodeCreated
- NodeDeleted
- NodeDataChanged
- NodeChildrenChanged
其中后四种用于表示ZNode的状态或者数据变更,而None则用于会话的状态变更