事务ID
Znode的创建删除,更改内容等都是作为zookeeper的事务进行执行的。
对于每一个事务请求,zookeeper都会为其分配一个全局唯一的事务ID,从ID可以识别出事务的全局顺序。
节点特性
czxid:create zxid,数据节点创建时的事务ID
mzxid:modified zxid,节点最后更新时的事务ID
ctime:create time
mtime:modified zxid
version :节点版本号
cversion:子节点版本号
aversion:acl版本号
enumChildren:子节点数量
pzxid:子节点修改的最后事务id
版本:表示对数据节点内容,子节点,acl的修改次数
当创建时都为0
每个数据节点都有三个版本:
version:当前数据节点内容的版本号
cversion:当前数据子节点的版本号
aversion:当前节点的acl版本号
版本的作用:充当乐观锁的写入校验。用CAS的方式。
Watcher:数据变更的通知
当客户端在zookeeper上注册后,会在客户端生成回调函数,当触发监听任务时,zookeeper通知客户端,客户端执行watchermanager的回调函数。
客户端的视角创建会话
以下是一次 ZooKeeper 会话创建的详细过程,以客户端的视角为主:
-
客户端启动: 客户端应用启动,并创建一个ZooKeeper客户端实例。
-
Watcher对象注册: 客户端可以注册Watcher对象,用于在特定事件发生时接收通知。Watcher对象负责处理与会话相关的事件,如连接建立、节点变更等。
-
建立连接: 客户端调用createSession()操作来连接到ZooKeeper集群。在这个过程中,客户端选择一个服务器进行连接。
-
ClientCnxn: 一旦连接建立,将创建一个ClientCnxn对象,代表客户端与服务器之间的连接。该对象处理底层的TCP连接和数据传输。
-
Session ID 和密码分配:如果是客户端的第一次连接,或者之前的会话已经过期,服务器会为客户端分配一个唯一的 Session ID。同时,服务器会生成与该 Session ID 相关联的会话密码(Session Password)。
-
SendThread: 客户端的SendThread负责向服务器发送请求,包括创建Session、读取、写入等操作。这个线程处理所有的网络通信。
-
EventThread: 客户端的EventThread用于处理从服务器返回的事件(Event)。这包括连接状态的改变、节点变更等。Watcher对象将在这里收到通知。
-
Watch事件和通知: 如果客户端注册了Watcher对象,当与会话相关的事件发生时,服务器将生成相应的事件(Event),并通过EventThread传递给客户端。这样,客户端能够得知会话中的状态变化。
-
心跳检测: 会话期间,客户端和服务器之间定期发送心跳以保持连接的活跃。
-
会话超时处理: 如果客户端未在规定的会话超时时间内发送心跳,或者由于其他原因导致通信中断,服务器将终止会话。此时,相关的Watcher对象将收到会话超时的通知。
服务器