ZooKeeper之会话(session) zookeeper sessiontimeout
yuyutoo 2024-10-16 15:45 2 浏览 0 评论
原文链接:https://dubby.cn/detail.html?id=9027 作者:杨正
使用客户端来创建一个和zk服务端连接的句柄,这就是一个会话(session)。Session一旦建立,状态就是连接中(CONNECTING)状态,然后客户端会尝试去连接zk服务端,连接成功之后状态变成已连接(CONNECTED)。一般正常情况下只会有这两个状态。不过,还是会发生一些无法恢复的错误/故障,比如:session过期,认证失败,或者客户端关闭连接,这种情况下,session状态会变成关闭(CLOSED)状态。下图给出了zk客户顿可能的状态转换情况:
以下内容是介绍zk的特性,不过很多是结合代码来描述
为了创建一个session,代码中必须要提供一个连接字符串,连接字符串由host:port组成,用,分割,例如127.0.0.1:4545,127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002。zk客户端会随意选择一个zk服务端来尝试连接。如果这个连接失败了,或者因为某种原因断开连接了,客户端会自动尝试下一个服务端,直到连接被成功建立。
3.2.0新特性:连接字符串增加了一个chroot后缀。意思就是所有操作的节点路径都是这个路径下的相对路径(类似unix的chroot命令)。举个例子,127.0.0.1:4545/app/a,127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a,这种情况下,你访问的/foo/bar节点,其实是zk服务端的/app/a/foo/bar节点。如果你的zk服务端是多应用共享的,这个特性应该会很适合你,因为可以很清晰的隔离开各个应用的数据。
当一个session建立的时候,zk服务端会生成一个64位的数字,也就是这个session的标识(姑且称之为session id吧),zk客户端会保存这个标识。如果zk客户端因为某种原因连接到了另一个zk服务端,他会把这个session id传给新的服务端。出于安全考虑,zk服务端在创建连接时,不仅仅生成一个session id,还会同时传给zk客户端一个密码,这个session id+密码是可以被任何一个zk服务端校验的。这样,每次zk客户端重连zk服务端的时候,会同时传递session id+密码,zk服务端校验通过了才会建立连接。
为什么需要密码呢?
随便举个例子,znode的权限是和session有关联的,如果任何客户端都可以伪造session id,那这种安全性就没有意义了。
使用zk客户端创建session的一个参数是session超时时间(毫秒)。但是请注意,这个session超时时间并不是客户端可以随意设置的。zk客户端会把这个session超时时间发给服务端,服务端会返回一个他可以接受的值给客户端。标准其实就是tickTime*2 <= session timeout <= tickTime*20。
如果zk客户端和zk服务端集群断开连接之后,在session超时时间之内,重新连接上了,那么session状态重新变为connected,如果在session超时时间之内没有连接上,那么session状态会变成expired。当session断开连接的时候,最好不用自己去建立一个新的session,因为zk客户端已经帮我做了这个工作,他会自动重连的。只有一种情况需要我们手动重新创建新的session,那就是明确知道session状态为过期状态(expiration)。
session是否过期是由zk服务端集群管理的,而不是zk客户端自己管理自己是否过期。zk服务端就是根据session过期时间来判断是否过期。当zk服务端超过一定的时间没有收到来自zk客户端的心跳,zk服务端就把这个session标记为过期,然后删除这个session创建的所有临时节点,并且李克通知所有监听了这些节点的其他session。在这个时候,zk客户端处于断开连接的状态,一旦它重新连接成功了,他也会收到自己被标记为过期这一事件提醒;在还没有重新连接成功之前,这个zk客户端是不会收到过期的提醒的。
下面举个例子来形象的展示一下上面说的:
- connected:session被创建,客户端和服务端正常通信。
- ……客户端和服务端断开连接。
- disconnected:客户端和服务端失去连接。
- ……随着时间的流逝,超过了session的超时时间,客户端还没有重新连接成功。
- ……随着时间的流逝,客户端重新连接上了服务端。
- expired:最后客户端连接上了服务端,但是之前的session已经被过期了,客户端也会收到过期的事件提醒。
3.2.0 — SessionMovedException:这是一个内部异常,一般不会被应用程序接触到。这个异常发生的情况比较少见,举个例子吧,当一个客户端发一个心跳请求个服务端,但是网络延时,导致服务端没有收到,过一会后,客户端连接上了另一个新的服务端,在这之后,之前的心跳被旧的服务端收到了,这时候旧的服务端会被提醒,当前session已经被转移了,然后旧的服务端会关闭这个连接。客户端一般不会感知到这个异常,因为旧连接一般都会被关闭。但是还有一个特殊情况,两个客户端同时使用保存这的session id+密码来重新连接服务端,第一个连接成功,紧着第二个又连接成功,这会导致第一个连接被关闭,然后就是这两个客户端无限重连了。
更新服务器列表,zk客户端可以使用一个新的连接字符串来更新服务列表。这个机制会使用一个负载均衡算法来重新平衡各个客户端和服务端的连接情况,所以会导致部分客户端断开连接并重新连接到其他服务端。
举个例子,如果之前的连接字符串包含了3和host,新的连接字符串除了之前的3个host还多出了2个新的host,那么会有40%的客户端需要断开连接来连接新的3个服务端,以保持负载均衡。就意味着这40%的客户端需要断开重连。
同样的道理,如果原本有5个host,新的只有3个,也就是移除了2个,那么那移除的2个服务端对应的客户端都会被断开,需要重新连接到3个服务端上。
更多Linux后台架构资讯
更多面试技术视频资料获取:
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)