百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

ZooKeeper之会话(session) zookeeper sessiontimeout

yuyutoo 2024-10-16 15:45 4 浏览 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客户端是不会收到过期的提醒的。

下面举个例子来形象的展示一下上面说的:

  1. connected:session被创建,客户端和服务端正常通信。
  2. ……客户端和服务端断开连接。
  3. disconnected:客户端和服务端失去连接。
  4. ……随着时间的流逝,超过了session的超时时间,客户端还没有重新连接成功。
  5. ……随着时间的流逝,客户端重新连接上了服务端。
  6. 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后台架构资讯

更多面试技术视频资料获取:

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: