首页 > 其他分享 >聊聊Zookeeper的Session会话超时重连

聊聊Zookeeper的Session会话超时重连

时间:2023-06-18 14:33:05浏览次数:43  
标签:超时 Zookeeper ZooKeeper 会话 Session 重连 连接 客户端

概述

简单地说,ZooKeeper的连接与会话就是客户端通过实例化ZooKeeper对象来实现客户端与服务器创建并保持TCP连接的过程。本质上,Session就是一个TCP 长连接。

会话

Session会话的作用:

  1. ZK Server 执行任何请求之前,都需要 Client 与 Server 先建立 Session;
  2. Client 提交给 Server 的任何请求,都必须关联在 Session 上;
  3. Session 终止时,关联在 Session 上的临时数据节点都会自动消失;
  4. 接受来自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,那么影响就会很大的。比如注册中心或是分布式锁的应用场景。

会话失效的情况一般有如下几种情况:

  1. 网络原因
  2. JVM内存不足导致Full GC
  3. 磁盘内存不足
  4. 程序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,ZooKeeper,会话,Session,重连,连接,客户端
From: https://www.cnblogs.com/zhiyong-ITNote/p/17489109.html

相关文章

  • 彻底搞懂cookie、session、token
    文章目录前言1.cookie2.session3.token3.1为什么要使用token3.2token详解 前言cookie、session、token为了解决什么问题:HTTP是一种无状态的协议,而服务器的业务必须是有状态的。随着在线购物网站、需要登录的网站等等,面临的问题就是要管理......
  • zookeeper 安装、配置、管理
    #########################下载下载地址:https://archive.apache.org/dist/zookeeper/这里带有bin版本的zookeeper    解压即可:tar-xzvfapache-zookeeper-3.5.8-bin.tar.gz    目录结构准备   配置:zoo.cfg  #catzoo.cfgautopurge.pu......
  • 基于Session的认证方式
    认证流程基于Session认证方式的流程是,用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话),而发给客户端的sesssion_id存放到cookie中,这样用客户端请求时带上session_id就可以验证服务器端是否存在session数据,以此完成用户的合法校验。当用户退出系统或sessi......
  • 关于Cookie Session 和Token,以及应用场景
    关于Cookie和Session(面试经常问)共同之处:cookie和session都是用来跟踪浏览器用户身份的会话方式。关于会话在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连......
  • 学习笔记之Zookeeper内部原理解析
    1.1节点类型1.2Stat结构体(1)czxid-创建节点的事务zxid每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。(2)ctime-znode被创建的毫秒数(从19......
  • ABP框架中UnitOfWorkManager.Current.SetTenantId()并不是修改AbpSession.TenantId的
    1.结论UnitOfWorkManager.Current.SetTenantId()修改的是ABP过滤器中使用的TenantId,并不会修改AbpSession.TenantId代码演示:2.关于UnitOfWorkManager.Current.SetTenantId()方法的作用前提:ABP框架是是支持多租户的,对于单数据库的多租户设计,需要通过TenantId来区分宿主和......
  • 页面会话技术介绍,什么是Cookie和Session
    页面会话技术Cookie什么是cookie:服务端保存在浏览器端的数据片段。以key/value的形式进行保存。每次请求的时候,请求头会自动包含本网站此目录下的cookie数据。网站经常使用这个技术来识别用户是否登陆等功能。用途:保存登录状态,购物车等缺点:做为请求或响应报文发送,无形中......
  • Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
    Springboot鼓励零配置的方式,帮你做好大部分重复劳动的事,好到不能再好;具体的Redis安装方法和Springboot集成Redis方法,可以去搜索相关文章或参考该文。 当做用户权限管理时,一般都设置一个session过期时间,以确保用户长时间不操作时自动退出系统。在springboot中设置該值的方法如下: 1......
  • WWDC2023 Session系列:探索XCode15新特性
    一、版本说明XCode15beta发布于2023年6月5日,可支持macOS13.3或以上版本,你可以按需下载需要的平台。二、新增特性1.代码智能提示(Codecompletion)•创建新的文件在引用时的提示首先创建一个新的文件然后,在引用的地方,输入文件首字母会立即自动弹出补全提示。......
  • 使用sessionStorage获取值和设置值 sessionStorage.setItem('key','value') sessionS
    使用sessionStorage获取值和设置值sessionStorage.setItem('key','value')sessionStorage.getItem('myname')https://www.shuzhiduo.com/A/lk5a4ZL2J1/<body><buttonid="btn1">设置值</button><buttonid="btn2&......