会话机制
会话概念
zookeeper的连接与会话就是客户端通过实例化Zookeeper对象来实现客户端与服务端创建并保持TCP连接的过程
会话状态
在zookeeper客户端与服务端成功完成连接创建后,就创建了一个会话,zookeeper会话在整个运行期间的生命周期中,会在不同的会话状态中之间进行切换
状态分为CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE
会话属性
- sessionID:会话ID,唯一标识一个会话
- TimeOut:会话超时时间,客户端配置超时时间
- TickTime:下次会话超时时间点,便于实行”分桶策略”管理,大致为当前时间+TimeOut
- isClosing:标记一个会话是否已经被关闭,超时失效时,服务端对此标记
Watch机制
zookeeper实现分布式进程的状态(znode的Data、Children)共享时,基于性能的考虑采用了类似的异步非阻塞的主动通知模式即Watch机制,使得分布式进程之间的“共享状态通信”更加实时高效
客户端可以在znodes进行监听。znode的变化会触发这个监听器然后清除它。当一个监听器被触发的时候,zookeeper会给客户端发送一个通知
一次性触发器:客户端在Znode设置了Watch时,如果Znode内容发生改变,那么客户端就会获得Watch事件
发送至客户端:Watch事件是异步发送到Client,zookeeper可以保证客户端发送过去的更新顺序是有序的
设置watch的数据内容:znode改变有很多种方式,例如:节点创建,节点删除,节点改变,子节点改变等等。zookeeper维护了两个Watch列表,一个节点数据Watch列表,另一个是子节点Watch列表。
运行机制
1、Watch是轻量级的,其实就是本地JVM的Callback,服务器端只是存了是否有设置了Watcher的布尔类型。
2、在服务端,在FinalRequestProcessor处理对应的Znode操作时,会根据客户端传递的watcher变量,添加到对应的ZKDatabase(org.apache.zookeeper.server.ZKDatabase)中进行持久化存储,同时将自己NIOServerCnxn做为一个Watcher callback,监听服务端事件变化
3、Leader通过投票通过了某次Znode变化的请求后,然后通知对应的Follower,Follower根据自己内存中的zkDataBase信息,发送notification信息给zookeeper客户端
4、Zookeeper客户端接收到notification信息后,找到对应变化path的watcher列表,挨个进行触发回调。
设置观察操作
- 设置观察的操作:exists,getChildren,getData
- 触发观察的操作:create,delete,setData
节点ACL & 节点信息
zookeeper提供控制节点访问权限的功能,用于有效的保证zookeeper中数据的安全性。避免误操作而导致系统出现重大事故。
操作权限:CREATE / READ / WRITE / DELETE / ADMIN
身份认证方式:world(所有人)、auth(认证通过用户)、digest(用户名密码)、ip(IP地址认证)
cversion :子节点的版本号
aclVersion:表示acl的版本号,修改节点权限
dataVersion:表示的是当前节点数据的版本号
czxid:节点被创建时的事务ID
mzxid:节点最后一次被更新的事务ID
pzxid:当前节点下的子节点最后一次被修改时的事务ID
选举机制
zookeeper的节点有两种类型,持久节点跟临时节点。
临时节点有个特性,就是如果注册这个节点的机器失去连接(通常是宕机),那么这个节点会被zookeeper删除。
选主过程:
- 在服务器启动的时候,去zookeeper特定的一个目录下注册一个临时节点(这个节点作为master,谁注册了这个节点谁就是master)
- 注册的时候,如果发现该节点已经存在,则说明已经有别的服务器注册了(也就是有别的服务器已经抢主成功),那么当前服务器只能放弃抢主,作为从机存在。
- 抢主失败的当前服务器需要订阅该临时节点的删除事件,以便该节点删除时(也就是注册该节点的服务器宕机了或者网络断了之类的)进行再次抢主操作。
- 从机具体需要去哪里注册服务器列表的临时节点,节点保存什么信息,根据具体的业务不同自行约定。选主的过程,其实就是简单的争抢在zookeeper注册临时节点的操作,谁注册了约定的临时节点,谁就是master。
参考:
https://www.cnblogs.com/felixzh/p/5869212.html
https://www.cnblogs.com/leesf456/p/6103870.html
https://blog.csdn.net/z69183787/article/details/53023578
https://blog.csdn.net/wuhenzhangxing/article/details/52936040
https://www.cnblogs.com/nevermorewang/p/5611807.html