Session是Zookeeper的一个重要的抽象。有序的保证,ephemeral znode,watch都与session紧紧关联。
session的跟踪机制也是很重要的一块。
ZooKeeper server的一个重要任务就是跟踪并维护这些session。运行于standalone模式下的单独的server会维护所有的session,而在quorum模式下由leader来维护。leader和standalone模式的server实际上跑着相同的session tracker(可以参考SessionTracker类和SessionTrackerImpl类)。follower仅仅是简单的把client提交的session信息转发到leader(参考LearnerSessionTracker类)。
为了保活(keep alive)session,server需要接收到session的心跳。心跳的形式可以是一个新的请求或者显式的ping消息(参考LearnerHandler.run())。两种情况下,server通过更新session的超时时间来touch session(参考SessionTrackerImpl.touchSession())。在quorum模式下,leader发送一个ping消息给它的learner,learner返回自从last PING之后的一个session列表。leader每隔半个tick就会发送一个ping给learner。所以,如果一个tick被设置成2秒,那么leader每隔一秒就会发送一个ping。
对于session的过期有2个重要的要点。一个称为expiry queue的数据结构(参考ExpiryQueue类)用来维护session的过期。这个数据结构使用bucket来维护session,每一个bucket对应一个时间范围,这个范围内的session会过期,leader每次会让一个bucket的session过期。为了决定哪一个bucket的session过期,如果有的话。当下一个deadline到来时,一个线程会检查这个expiry queue来找出要过期的bucket。这个线程在deadline到来之前处于sleep状态,当它被唤醒时,它会取出expiry queue的一批session,让它们过期。当然取出的这批数据可能是空的。
为了维护这些bucket,leader把时间分成一些片段,以expirationInterval为单位进行分割,并把每个session分配到它的过期时间对应的bucket里。更具体的说,是对下面的表达式进行计算,当session的过期时间更新时,根据结果来决定它属于哪一个bucket。
(expirationTime / expirationInterval + 1) * expirationInterval
举个例子来说明,比如expirationInterval为2,session的超时时间为10。那么这个session分配到bucket 12中((10/2+1)*2)。注意当我们touch这个session时这个超时时间会增加,所以我们要把这个session移动到其他的bucket中来推迟过期。
使用bucket的模式来管理的一个主要原因是为了减少让session过期这项工作的系统开销。一个生产环境中的ZooKeeper机器可能会有数千个client,对应着数千个session。在这种场景下要细粒度的检查session过期是不合适的。如果expirationInterval短的话,那么检查session过期的粒度会不错。目前是一个tick,相当于1秒钟。
相关推荐
自己整理的ZooKeeper学习笔记,适合刚刚接触ZooKeeper的人学习
zookeeper学习笔记
3天精通zookeeper视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程内容: zookeeper简介 zookeeper数据模型 zookeeper单机安装 zookeeper常用shell命令 zookeeper的Acl权限控制 zookeeper...
如果在创建znode时Flag设置为EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据...
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,...有了这些数据结构和原语还不够,因为我们的ZooKeeper是工作在一个分布式的环境下,我们的服务是通过消息以网络的形式发送给我们的分布式应
java ZooKeeper学习笔记\ZooKeeper原理、运用
zookeeper 学习资料 中篇
zookeeper学习用Demo,包含zookeeper的各种使用案例 zookeeper学习用Demo,包含zookeeper的各种使用案例
zookeeper学习知识点, 脑图
Zookeeper的搭建、底层原理以及Java客户端的操作,如:zkclient,curator等
自己学习zookeeper时的用过学习资料,很不全,但都是这么过来的。
Zookeeper学习笔记
zookeeper学习视频
zookeeper一站式学习资料包含国内首部Zookeeper从入门到精通+搜索引擎等一条龙学习资料以及视频讲解包含笔记代码资源
Zookeeper学习 Zookeeper是一个由Java编写并开源的,为分布式系统提供协调服务的框架. Zookeeper概述 Zookeeper最早起源于雅虎研究院的一个小组.当时研究人员发现,在雅虎内部的很多系统基本都依赖一个类似的系统来...
zookeeper 学习资料 下篇
zookeeper 学习资料 上篇
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
基于 Zookeeper部署微服务,实现前后端分离,提高开发效率。
主要介绍了zookeeper 的概述,特点,作用,角色,安装,shell命令