zookeeper session tracker机制分析
2015-07-22 15:51
260 查看
说到zookeeper session管理 ,免不了要问
什么是session?
session id/session是如何产生的?
session 信息如何存储?
本文以session tracker线程【详见SessionTrackerImpl】的运行机制作为主线,并尝试解答一些相关问题
产生的值会存入nextSessionId属性,以后一旦有新的连接(session)产生,就会nextSessionId++
可见产生session需要两个元素,一个是sessionid,一个是timeout
timeout由客户端确定,但必须在服务器规定的最大的timeout(ticktime*20)和最小的timeout(ticktime*2)之间
如果客户端没有指定sessionid,那么就会产生一个新的session【详见ZooKeeperServer.createSession】,否则会reopen【详见ZooKeeperServer.reopenSession】
sessionid的产生上面解释过了
一个重要的数据结构sessionsWithTimeout存放sessionid和timeout的映射
另一个重要的数据结构sessionsById存放sessionid和SessionImpl实例的映射
根据当前时间和timeout计算本session 的expireTime即tickTime
一个重要的数据结构sessionSets 存放过期时间和一组session实例(相同过期时间)的映射的建立及维护
session实例的tickTime的确定
可见SessionTrackerImpl这个线程会一直轮询的清除过期session
每次轮询都会比较currentTime和nextExpirationTime,如果还未到nextExpirationTime,就等,否则往下走
将sessionSets中的以nextExpirationTime为key的那组session移出
遍历session,从sessionsById移除session,并调用相关的过期处理(下面会讲)
调整下载比较的时间,即nextExpirationTime += expirationInterval;
设置request.hdr,这个很重要,
在FinalRequestProcessor.processRequest会有相应的处理
一旦某个session关闭,与session相关的EPHEMERAL类型的节点都得清除
并且通过调用sessionTracker.setSessionClosing将session设置为关闭,使得后续此session上的请求无效
分别对sessionsById、sessionsWithTimeout、sessionSets进行处理
如果某个session timeout为60s,如果空闲了30s,意味着还能空闲30s,此时服务重启,那么此session的timeout又变为60s
具体算法为
time为System.currentTimeMillis() + timeout
expirationInterval默认为ticktime
SessionTrackerImpl有3个重要的数据结构sessionsById、sessionSets、sessionsWithTimeout,其中sessionsWithTimeout会被持久化
SessionTrackerImpl提供了几个常用的API
createSession
addSession
touchSession
removeSession
checkSession
setOwner
dumpSessions
什么是session?
session id/session是如何产生的?
session 信息如何存储?
本文以session tracker线程【详见SessionTrackerImpl】的运行机制作为主线,并尝试解答一些相关问题
1)session基础
在介绍session tracker线程之前先回答几个问题1.1) 什么是session?
zookeeper中session意味着一个物理连接,客户端connect成功之后,会发送一个connect型请求,此时就会有session 产生(下面会具体讲)1.2)sessionid是如何产生的?
在SessionTrackerImpl实例化的时候就会调用下面的函数【详见SessionTrackerImpl.initializeNextSession】1.3)session是如何产生的?
接到一个连接类型的请求【详见ZooKeeperServer.processConnectRequest】1.3.1)确定session的timeout和id
【详见SessionTrackerImpl.createSession】timeout由客户端确定,但必须在服务器规定的最大的timeout(ticktime*20)和最小的timeout(ticktime*2)之间
如果客户端没有指定sessionid,那么就会产生一个新的session【详见ZooKeeperServer.createSession】,否则会reopen【详见ZooKeeperServer.reopenSession】
sessionid的产生上面解释过了
1.3.2)实例化session及相关关系存放
【详见SessionTrackerImpl.addSession】另一个重要的数据结构sessionsById存放sessionid和SessionImpl实例的映射
1.3.3)确定session实例的tickTime及sessionSets关系维护
【详见SessionTrackerImpl.touchSession】一个重要的数据结构sessionSets 存放过期时间和一组session实例(相同过期时间)的映射的建立及维护
session实例的tickTime的确定
2)session tracker线程的机制
在zookeeper服务体系中,专门有一个线程(session tracker)维护session【详见SessionTrackerImpl.run】,重要代码如下每次轮询都会比较currentTime和nextExpirationTime,如果还未到nextExpirationTime,就等,否则往下走
将sessionSets中的以nextExpirationTime为key的那组session移出
遍历session,从sessionsById移除session,并调用相关的过期处理(下面会讲)
调整下载比较的时间,即nextExpirationTime += expirationInterval;
3) session维护相关问题
3.1)清除session如何实现?
【详见ZooKeeperServer.close】3.1.1)构造一个Request实例
3.1.2)调用PrepRequestProcessor.processRequest放入submittedRequests队列
3.1.3)PrepRequestProcessor线程的处理
在FinalRequestProcessor.processRequest会有相应的处理
一旦某个session关闭,与session相关的EPHEMERAL类型的节点都得清除
并且通过调用sessionTracker.setSessionClosing将session设置为关闭,使得后续此session上的请求无效
3.1.4)SessionTrackerImpl相关数据结构的清理
【详见SessionTrackerImpl.removeSession】3.2)session owner咋回事?
如果不是在集群环境,即没有LearnerHandler线程,session 的owner就是一个常量实例ServerCnxn.me3.3)sessionsWithTimeout这个数据结构的用途?
sessionsWithTimeout存放的是sessionid和timeout,此数据结构会和ZKDatabase中相通,会被持久化如果某个session timeout为60s,如果空闲了30s,意味着还能空闲30s,此时服务重启,那么此session的timeout又变为60s
3.4)touch session是干吗的?
每次一旦该session有请求,就会touch,意味着session的过期时间变为(基本等于当前时间+timeout)具体算法为
expirationInterval默认为ticktime
3.5)check session是干吗的
基本上所有的事务型操作,都会调用用来验证当前请求的session是否关闭,owner是否正确4)小结
SessionTrackerImpl作为一个单独的线程专门处理过期sessionSessionTrackerImpl有3个重要的数据结构sessionsById、sessionSets、sessionsWithTimeout,其中sessionsWithTimeout会被持久化
SessionTrackerImpl提供了几个常用的API
createSession
addSession
touchSession
removeSession
checkSession
setOwner
dumpSessions
相关文章推荐
- [geeksforgeeks] Bottom View of a Binary Tree
- jeecms修改后台路径
- POJ 3252 Round Numbers (简单数位DP)
- html中from表单enctype值
- HDU 2089 不要62(数位DP·记忆化搜索)
- SQL行转列(case when then )
- sharedPreferences保存用户参数设置和参数的回显
- 常用Hbase Shell
- 7.21多校——5289RMQ_st + 二分搜索 + 单调队列——Assignment
- wpf 时间控件加今天 按钮
- (实验小结)主从配置不同步的解决(小白踩雷点)
- iOS开发UI篇—iOS开发中三种简单的动画设置
- 【暴力搜索】【动态规划】[NOIP 1999]邮票面值设计
- 采用首次适应算法的动态分区分配模拟
- 黑马程序员————Java基础日常笔记---IO其他流
- RelativeLayout的常用属性
- delphi中pos和Ansipos函数的区别
- 小胖说事32-----iOS关于block使用的5点注意事项
- 用timer控件实现sleep效果
- Unity3D 5.0版本 加载dll报错, 换用4.5 版本可以正确运行与导出(x86版本)