聊聊Zookeeper的Session会话超时重连
概述
简单地说,ZooKeeper的连接与会话就是客户端通过实例化ZooKeeper对象来实现客户端与服务器创建并保持TCP连接的过程。本质上,Session就是一个TCP 长连接。
会话
Session会话的作用:
- ZK Server 执行任何请求之前,都需要 Client 与 Server 先建立 Session;
- Client 提交给 Server 的任何请求,都必须关联在 Session 上;
- Session 终止时,关联在 Session 上的临时数据节点都会自动消失;
- 接受来自Server的Watcher事件通知;
Session是ZooKeeper中的会话实体,代表了一个客户端会话。其包含以下4个基本属性。
- sessionID:会话ID,用来唯一标识一个会话,每次客户端创建新会话的时候,ZooKeeper都会为其分配一个全局唯一的sessionID。
- TimeOut:会话超时时间。客户端在构造ZooKeeper实例的时候,会配置一个sessionTimeout参数用于指定会话的超时时间。ZooKeeper客户端向服务器发送这个超时时间后,服务器会根据自己的超时时间限制最终确定会话的超时时间。
- TickTime:下次会话超时时间点。为了便于ZooKeeper对会话实行“分桶策略”管理,同时也是为了高效低耗地实现会话的超时检查与清理,ZooKeeper会为每个会话标记一个下次会话超时时间点。TickTime是一个13位的long型数据,其值接近于当前时间加上TimeOut,但不完全相等。
- isClosing:该属性用于标记一个会话是否已经被关闭。通常当服务端检测到一个会话已经超时失效的时候,会将该会话的isClosing属性标记为“已关闭”,这样就能确保不再处理来自该会话的新请求了。
会话重连
当客户端和服务端之间的网络连接断开时,ZooKeeper客户端会自动进行反复的重连,直到最终成功连接上ZooKeeper集群中的一台机器。在这种情况下,再次连接上服务端的客户端有可能会处于以下两种状态之一。
- CONNECTED:如果在会话超时时间内重新连接上了ZooKeeper集群中任意一台机器,那么被视为重连成功。
- EXPIRED:如果是在会话超时时间以外重新连接上,那么服务端其实已经对该会话进行了会话清理操作,因此再次连接上的会话将被视为非法会话。
当客户端与服务端之间的连接断开后,用户在客户端可能主要会看到两类异常:CONNECTION_LOSS(连接断开)和SESSION_EXPIRED(会话过期)。
连接断开:CONNECTION_LOSS
有时会因为网络闪断导致客户端与服务器断开连接,或是因为客户端当前连接的服务器出现问题导致连接断开,我们统称这类问题为“客户端与服务器连接断开”现象,即CONNECTION_LOSS。在这种情况下,ZooKeeper客户端会自动从地址列表中重新逐个选取新的地址并尝试进行重新连接,直到最终成功连接上服务器。
会话失效:SESSION_EXPIRED
SESSION_EXPIRED是指会话过期,通常发生在CONNECTION_LOSS期间。客户端和服务器连接断开之后,由于重连期间耗时过长,超过了会话超时时间(sessionTimeout)限制后还没有成功连接上服务器,那么服务器认为这个会话已经结束了,就会开始进行会话清理。但是另一方面,该客户端本身不知道会话已经失效,并且其客户端状态还是DISCONNECTED。之后,如果客户端重新连接上了服务器,那么很不幸,服务器会告诉客户端该会话已经失效(SESSION_EXPIRED)。在这种情况下,用户就需要重新实例化一个ZooKeeper对象,并且看应用的复杂情况,重新恢复临时数据。
会话失效的情况
对于连接断开的场景下,Zk客户端会自动尝试重连其他节点;但是会话失效的场景就需要考虑了,毕竟涉及到临时节点和Watcher,那么影响就会很大的。比如注册中心或是分布式锁的应用场景。
会话失效的情况一般有如下几种情况:
- 网络原因
- JVM内存不足导致Full GC
- 磁盘内存不足
- 程序bug
为什么会说到JVM?其实这也是最容易忽略的问题,尤其是Java应用的监控没有上的情况下。首先Zookeeper本身就是一个Java应用,其内存管理是受到了JVM的内存设置限制的。因此,对于这一类托管在JVM上的应用程序,必须考虑到JVM内存设置的问题。
如何解决?
对于失效的场景,比较合适的就是增加了一个监听器;监听session expired事件,并且在事件发生的时候进行处理。什么处理?自然是客户端重新拉起zk连接会话。
package com.xiaoju.dqa.prometheus.client.zookeeper;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.zookeeper.CreateMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SessionConnectionListener implements ConnectionStateListener {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private String path;
private String data;
public SessionConnectionListener(String path, String data) {
this.path = path;
this.data = data;
}
@Override
public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState){
if(connectionState == ConnectionState.LOST){
logger.error("[负载均衡失败]zk session超时");
while(true){
try {
if(curatorFramework.getZookeeperClient().blockUntilConnectedOrTimedOut()){
curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(path, data.getBytes("UTF-8"));
logger.info("[负载均衡修复]重连zk成功");
break;
}
} catch (InterruptedException e) {
break;
} catch (Exception e){
}
}
}
}
}
参考
Zookeeper Curator 处理会话过期 Session Expired
优化hbase JVM GC 参数,避免由于JVM内存回收引发的ZooKeeper会话超时进程退出事件
zookeeper恢复了,线上微服务却全部掉线了,怎么回事?
聊聊Zookeeper的Session会话超时重连的更多相关文章
- zookeeper curator处理会话过期session expired
本文介绍在使用curator框架的时候如何handle session expire. 1.什么是zookeeper的会话过期? 一般来说,我们使用zookeeper是集群形式,如下图,client和 ...
- ZooKeeper 会话超时
1.会话概述 在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID).服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT ...
- zookeeper会话超时 链接超时的排查
1.会话概述 在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID).服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT ...
- Zookeeper中Session Timeout的那些事
前言: RDS系统致力于MySQL数据的高可用,高可靠,高性能以及在线扩展功能,实现这些特性的主要逻辑功能都运行在管理服务器上,一旦管理服务器宕机,数据库的在线扩展功能/备份功能/故障恢复功能等都无从 ...
- zookeeper设置客户端连接超时被expired
在网络环境非常差的情况下,使用zookeeper集群往往会遇到连接expired了: 客户端提示连接从ZOO_CONNECTION_STATE变为ZOO_EXPIRED_SEESION_STATE,然 ...
- Tomcat负载均衡、调优核心应用进阶学习笔记(三):LNMT nginx+tomcat、LAMT apache+tomcat、session会话保持、不错的站点
文章目录 LNMT nginx+tomcat LAMT apache+tomcat 基于mod_proxy 单节点 配置基于mod_proxy的负载均衡 基于mod_jk(需要编译安装) 单节点 配置 ...
- 两种会话状态之Session会话
什么是Session 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度. Session技 ...
- 设置Session的超时时间
设置Session的超时时间 IIS 里面有个设置 站点属性->主目录->应用程序配置->选项->启用会话状态->会话超时,可以设置. 在web.config中,设置: ...
- tomcat 会话超时设置
1.为单个WEB设置SESSION 在WEB.XML中添加 xml 代码 <session-config> <session-timeout>15</session-ti ...
- Tomcat 中会话超时的相关配置
QC同事提到似乎有时Tomcat的会话超时表现有问题,记录一下可能用到的配置. 1)超时时间的设定 tomcat的会话超时可以在多个级别上设置:tomcat实例级别.Web应用级别.s ...
随机推荐
- JVM的垃圾收集算法
介绍分代收集理论和几种垃圾收集算法的思想及其发展过程. 分代收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了 "分代收集"(Generational Collection)的理 ...
- 如何通过Java代码将添加页码到PDF文档?
页码可以清楚了解总页数.定位页数快速寻找自己所要的文段.打印时不会分不清头中尾.很多人在使用办公软件的时候就会选择PDF进行文档的保存,因为PDF在保存之后不会出现乱码甚至是格式改变的情况.在PDF中 ...
- 华为 A800-9000 服务器 离线安装MindX DL 可视化环境+监控
MindX DL Sample主要应用于企业的数据中心或超算中心机房中,针对不同的应用场景为客户提供AI深度学习端到端解决方案. 传统行业:用户无自建深度学习平台,希望能够提供简单易用.软硬件一体化的 ...
- 五月二十七日jdbc,算法以及数据库
1.ResultSetMetaData接口主要获得结果集.例如:结果集字段数量和名字通过ResultSet的getMetaData()方法获得对应对象 public class app17_20 { ...
- Vue3中无法为el-tree-select设置反选问题分析
好久没有写博客了,刚好上周遇到一个难缠问题,这里记录一下. 环境:Vue3.2.Element Plus 问题:子组件 setting.vue => 弹窗组件 Dialog => 树选择组 ...
- python:调用内置函数
问题描述:尝试下博客园如何上传GIF # hzh 每天进步一点点 # 2022/5/13 17:24 import colorama import time import os colorama.in ...
- 【Spring注解驱动】(三)servlet3.0
前言 今天是7.21日,终于是看完了..暑假在家学习是真的差点意思 1 Servlet 3.0简介 Servlet 2.0是在web.xml中配置servlet filter.listener.Dis ...
- The first week match's mistake
比赛中的补题中的一些错误 P8506 标题计数(https://www.luogu.com.cn/problem/P8506) 第一眼下去,嗯..贪了,只读到一个'#'后边跟一个空格就+1,结果wa几 ...
- AI时代下普通小程序员的想法
在我接触了一系列AI技术后,不禁产生了许多思考.我先后尝试了AI编程.AI写论文.AI写小说.AI绘画等,最近看到了一些关于AI构建虚拟世界以及Auto-GPT的AI类新闻.在这个过程中,我心头涌现出 ...
- docker-compose一键部署java开源项目
这一年干的很多事都是为了降低我的开源项目消息推送平台austin使用门槛. 如果想学Java项目的,强烈推荐我的开源项目消息推送平台Austin(8K stars) ,可以用作毕业设计,可以用作校招, ...