当前位置: 首页 > news >正文

zookeeper如何管理客户端与服务端之间的链接?(zookeeper sessions)

zookeeper客户端与服务端之间的链接用zookeeper  session表示。

zookeeper session有三个状态:

CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, CLOSED, AUTH_FAILED,

NOT_CONNECTED(start时的状态)

1、CONNECTING 

    表明客户端正在与服务端建立连接。当客户端的句柄正在建立时,在java中,也就是ZkClient对象在创建后,到与服务端建立起真正链接的过程中,zookeeper的session状态是connecting。

2、CONNECTED 

    表明客户端与服务端已经建立链接。

3、CLOSE

    表明客户端与服务端之间的链接已经关闭。

当以下四种事件发生时,session的状态就会发生改变。

1、当session处于CONNECTING状态,客户端请求被加入到连接请求队列CONNECTING requests queue,执行成功后,会触发CONNECTED EVENTsession状态为CONNECTED

2、当session处于CONNECTING状态,但是客户端与服务端尝试连接的过程中权限校验不通过,触发AUTH_FAILED event,客户端请求返回AUTH_FAILED,连接建立结束。

3、当连接已经建立,session处于CONNECTED状态时,服务端突然出现故障或其他因素导致链接失效,触发DISCONNECTED event,返回CONNECT_LOSS。客户端重新将请求加入到连接请求队列CONNECTING requests queue,session状态重新变为CONNECTING。此时客户端有两个选择:

       重新向zookeeper集群中的其他服务器发起连接,成功则触发CONNECTED event,session状态变为CONNECTED,不断尝试直到超时则会造成session timeout,触发SESSION_EXPIRED event,请求返回SESSION_EXPIRED ,同时session状态修改为CLOSE

      或者,客户端直接请求关闭连接,返回CONNECTION LOSS,session状态变为CLOSE

整个过程如下图所示:

State transitions

zookeeper 客户端与服务端建立链接时有三个参数,一个是地址串,一个是超时时间timeout,一个是监听器。

地址参数表明客户端向哪个zookeeper server发起连接请求。 

当你使用多个zookeeper server地址时,多个地址用逗号隔开,比如“127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002”,zookeeper客户端会随机连接到某个server上,如果连接失败,客户端会不断连接到其他server地址上,直到成功。

 zkClient = new ZooKeeper("127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002", 2000,null);

当链接建立时,客户端所处的路径便是zookeeper server的根节点"/“。我们知道zookeeper没有相对路径的说法,客户端访问的所有节点都需要是绝对路径。那假设我们的配置信息分开发环境env和生产环境prod。开发环境的配置信息放在/env节点下,生产环境的配置放在/prod下。我们在开发时访问zookeeper的任何节点都需要加上前缀/env或者/prod。这样太麻烦了也容易出错。

于是zookeeper提供了一种方法,让我们可以在链接建立之后,访问的所有节点都相对于某个路径。

我们在连接地址串后面加上地址,比如:

        zkClient = new ZooKeeper("127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/env", 2000,null);

 那么当链接建立后,我们访问getData("/a"),实际上访问的是"/env/a”节点。

zookeeper session建立后,服务端会返回一个64位的session id 与针对这个session id设立的密码给客户端。当客户端所连接的这个服务端出现故障导致DISCONNECT event发生后,客户端将会尝试和其他服务端建立链接。客户端会将之前保存的session id与密码发送给新连接的服务端,以保证会话数据和原来一样。

timeout超时时间

session 的超时时间由zookeeper集群自己管理。超时时间是指当session建立后,客户端多长时间没有与服务端进行交互(包括维持连接的心跳也没有)时,集群认为session失效。zookeeper集群会删除这个会话,并且删除这个会话建立的所有临时节点,同时通知所有监听这些临时节点的zookeeper客户端,当然,对于这个这个被删除会话的客户端而言,在它重新连接上zookeeper集群之前它是收不到这个通知的,毕竟如果这个客户端是正常的,那么它就会和zookeeper集群保持心跳以维持会话。会话超时说明这个客户端断开了链接,哪怕zookeeper集群的功能再强大,它也通知不到这个已经失去联系的客户端。

 timeout时间最小是ticktime的两倍时间,最长是20倍。当客户端设置timeout值小于两倍ticktime时,zookeeper server实际返回的是ticktime的两倍时间。

当客户端所连接的server下线时,只要在timeout时间内,客户端能自动重连上zookeeper集群中的其他server,那么会话就能够保持。

zookeeper推荐由zookeeper客户端去负责重连的事情,直到请求返回session expired,此时我们再在自己的程序里去建立一个新的会话。而不是监听到所连接的server下线就立马去建立新的session,那样容易会发生“羊群效应”,也就是当server下线后,所有之前与这个服务端连接的客户端同时申请建立新的会话,会对zookeeper集群造成很大的压力。

SessionMovedException

这是一个内部异常,一般而言来说,客户端不会见到这个异常。当客户端向server A发起请求时,由于网络原因,在请求到达server时客户端就因为长时间没有收到响应而认为A已经下线,进而向server B建立会话。此时请求到达server A,A检测到会话已经转移,就会关闭与这个客户端的tcp链接。这一切都是由zookeeper在内部完成的,正常情况下客户端不会看到这个错误。

当有两个客户端在重建同一个链接时,其中一个客户端建立起的链接会因为另一个客户端建立起同样的链接而失效,从而重新建立链接。不断反复建立,失效,建立,失效,陷入一个死循环中。

在zookeeper3.5.0后加入一个local session概念。

zookeeper的session的建立与关闭是十分消耗性能的。因为在zookeeper中,所有的写操作都要在法定人数的server端操作成功才会同步到所有server。这是zookeeper的写瓶颈所在。另外,假设zookeeper集群的连接客户端非常多,而客户端仅仅只是连接Observer ZooKeeperServer 去读取数据并不涉及写操作时,只建立本地会话能够大大提升性能。

因此在3.5.0后引入一个local session(本地会话)的概念。local session只存在于与客户端连接的server中。

local session有以下特点:

localSessionsUpgradingEnabled 被禁用时,即local session不允许被升级为全局会话,那么:

1、local session不能建立临时节点

2、当会话丢失时,客户端并不能向集群的其他server重建同样的会话。因此local session只存在于之前所连接的server中。但是,这并不意味着当tcp链接断开后,客户端就只能新建一个session了。只要在timeout时间内,客户端重新连接上同一个server,那么session也能够得到保持。

3、local session的信息只由被连接的server维护,并不会通知到集群leader,同样的,session的状态信息也不会被持久化到磁盘。

4、心跳维持、过期和其他session状态由当前的server维护。

为什么要禁用?

  • 在想要处理大量客户端的大型部署中,我们知道客户端通过观察者进行连接,而观察者应该仅是本地会话。因此,这更像是防止有人意外创建大量临时节点和全局会话的防护措施。

localSessionsUpgradingEnabled 启用时,即local session允许被升级为全局会话,那么local session发生以下情况时会被自动升级为global session(全局会话):

1、当local session创建一个临时节点时,local session会先升级为global session再行创建。为什么创建临时节点就要升级为全局会话呢?原因是临时节点的创建在很大程度上取决于全局会话。从数据一致性的角度出发,那么当local session创建临时节点时,不同节点的数据就会不一致。从管理的角度出发,临时节点的删除依赖于集群中的leader。leader需要知道session的生命周期以便当session结束时能够删除临时节点,但是local session并不被leader知晓。

如果请求升级,则将会话从本地集合中删除,同时保留相同的会话ID。

当客户端请求与服务端A建立session时,服务端A会发送session id和password给客户端,同时提交一个createSession给leader。如果在客户端收到返回数据而leader未接收到createSession时,客户端断开连接重连上服务端B,此时服务端B会拿着客户端给的session id发送一个验证包给leader。如果在验证数据包到达之前leader提交了由A发出的CreateSession,则客户端将可以连接。否则,客户端将使会话过期,因为法定人数尚未得知该会话。此时,如果客户端也尝试再次连接回A,则该会话已从本地会话跟踪器中删除。因此,A将需要将验证数据包发送给领导者。处理过程与B相同。

因果一致性

Zookeeper是否满足因果一致性,需要看客户端的编程方式。

  • 不满足因果一致性的做法

1. A进程向Zookeeper的/z写入一个数据,成功返回

2. A进程通知B进程,A已经修改了/z的数据

3. B读取Zookeeper的/z的数据

4. 由于B连接的Zookeeper的服务器有可能还没有得到A写入数据的更新,那么B将读不到A写入的数据

相关文章:

zookeeper如何管理客户端与服务端之间的链接?(zookeeper sessions)

zookeeper客户端与服务端之间的链接用zookeeper session表示。 zookeeper session有三个状态: CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, CLOSED, AUTH_FAILED, NOT_CONNECTED(start时的状态) 1、CONNECTING 。 表明客户…...

【Java多线程】7——阻塞队列线程池

7 线程池 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~&#x…...

同步复位和异步复位的优缺点

同步复位 优点:能确保电路是100%的; 同步复位可以综合处更小的触发器; 可以保证复位只发生在有效时钟边沿,过滤掉复位信号毛刺; 内部逻辑产生的复位信号,采用同步复位可以有效过滤掉毛刺。 缺点&#xff1a…...

Code Review(代码审查)

代码审查是软件开发生命周期的重要组成部分。它能显著提高开发人员的代码质量。 这个过程就像写一本书。作者写好了内容,出版社编辑对其进行了校审,所以没有出现任何错误,例如将“你”与“你的”混淆。这个案例中,代码审查是阅读…...

《拆解一切问题》如何成为解决难题的高手 - 三余书屋 3ysw.net

拆解一切问题:如何成为解决难题的高手 今天给大家分享的这本书叫做《拆解一切问题》,标题看起来确实有点虚,在没有读这本书之前,会让人感觉似乎只要读完学会书中的内容,就可以解决一切问题了。但事实上这种认识是误解…...

matlab——基于三维激光扫描点云的树冠体积计算方法

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 针对树冠形状不规则,树冠体积难以测量和计算的问题,提出一种基于三…...

如何在jupyter使用新建的虚拟环境以及改变jupyter启动文件路径。

对于刚刚使用jupyter的新手来说,经常不知道如何在其中使用新建的虚拟环境内核,同时,对于默认安装的jupyter,使用jupyter notebook命令启动 jupyter 以后往往默认是C盘的启动路径,如下图所示,这篇教程将告诉…...

Exception in thread “main“ com.fasterxml.jackson.databind.JsonMappingException:

问题:jaskson反序列化超出最大长度 Caused by: com.fasterxml.jackson.core.exc.StreamConstraintsException: String length (5043456) exceeds the maximum length (5000000) 场景:前端传递过大base64 原因: jaskon默认已经限制了最大长…...

第三十九章 保护与 IRIS 的 Web 网关连接

文章目录 第三十九章 保护与 IRIS 的 Web 网关连接配置 Web 网关的连接安全最低连接安全性(不推荐)简单的用户名/密码验证 第三十九章 保护与 IRIS 的 Web 网关连接 本页介绍用于保护从 Web Gateway 到 IRIS 的连接的选项。与 IRIS 的 Web 网关连接可以…...

java数据结构与算法刷题-----LeetCode127. 单词接龙

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 广度优先双分裂蛇 广度优先双分裂蛇 解题思路:时间复…...

pytorch中的torch.nn.Linear

torch.nn.Linear是pytorch中的线性层,应该是最常见的网络层了,官方文档:torch.nn.Linear。 torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone)其中,in_features表示输入的维度;out_featu…...

03-MySQl数据库的-用户管理

一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …...

知乎:多云架构下大模型训练,如何保障存储稳定性?

知乎,中文互联网领域领先的问答社区和原创内容平台,2011 年 1 月正式上线,月活跃用户超过 1 亿。平台的搜索和推荐服务得益于先进的 AI 算法,数百名算法工程师基于数据平台和机器学习平台进行海量数据处理和算法训练任务。 为了提…...

JWFD流程图转换为矩阵数据库的过程说明

在最开始设计流程图的时候,请务必先把开始节点和结束节点画到流程图上面,就是设计器面板的最开始两个按钮,先画开始点和结束点,再画中间的流程,然后保存,这样提交到矩阵数据库就不会出任何问题,…...

GT收发器第一篇_总体结构介绍

文章目录 前言GT收发器介绍 前言 之前写过一篇简单介绍GT的文章https://blog.csdn.net/m0_56222647/article/details/136730026,可以先通过这篇文章对整体进行简单了解一下。 GT收发器介绍 参考xilinx手册ug476 对于7系列的FPGA,共有3个系列&#xf…...

[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示

文章目录 工程效果重要代码完整代码参考 工程效果 载入图片,并在左侧显示原始图片、二值化图片和灰度图片。 双击左侧的图片控件,可以在右侧的大控件中,显示双击的图片。 初始画面: 载入图片: 双击左侧的第二个控件…...

centos7.5 安装gitlab-ce (Omnibus)

一、安装前置依赖 # 安装基础依赖 $ sudo yum -y install policycoreutils openssh-server openssh-clients postfix# 启动 ssh 服务 & 设置为开机启动 $ sudo systemctl enable sshd & sudo systemctl start sshd二、安装gitlab rpm包 # 下载并执行社区版脚本 curl …...

深入理解MapReduce:从Map到Reduce的工作原理解析

当谈到分布式计算和大数据处理时,MapReduce是一个经典的范例。它是一种编程模型和处理框架,用于在大规模数据集上并行运行计算任务。MapReduce包含三个主要阶段:Map、Shuffle 和 Reduce。 ** Map 阶段 ** Map 阶段是 MapReduce 的第一步&am…...

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用 类的定义格式 类的实例化 this引用 什么是this引用? this引用…...

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中,笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样,它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类,那么人形机器人的未来会有非常大的发展空…...

MySQL MHA高可用数据库

文章目录 MySQL MHA高可用数据库搭建MySQL MHA模拟故障故障修复: MySQL MHA高可用数据库 MHA(MySQL High Availability)是一个开源的高可用解决方案,用于实现MySQL主从复制集群的故障自动切换。MHA的主要目的是确保MySQL数据库集…...

LVS(Layout versus schematic)比的是什么?

概述 LVS不是一个简单地将版图与电路原理图进行比较的过程,它需要分两步完成。第一步“抽取”,第二步“比较”。首先根据LVS提取规则,EDA 工具从版图中抽取出版图所确定的网表文件;然后将抽取出的网表文件与电路网表文件进行比较…...

从0开始搭建基于VUE的前端项目(三) Vuex的使用与配置

准备与版本 vuex 3.6.2(https://v3.vuex.vuejs.org/zh/)概念 vuex是什么? 是用作 【状态管理】的 流程图如下 state 数据状态,成员是个对象 mapState 组件使用this.$store.state.xxx获取state里面的数据 getters 成员是个函数,方便获取state里面的数据,也可以加工数据 ma…...

python统计分析——双样本均值比较

参考资料:python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时,有两种情况必须区分开。在第一种情况中,同一对象在不同时候的两个记录值进行相互比较。例如,用学生们进入初中时的身高和他们一年后的身高&…...

三台电机的顺启逆停

1,开启按钮输入信号是 电机一开始启动,5秒回电机2启动 ,在5秒电机三启动 关闭按钮输入时电机3关闭 ,5秒后电机2关闭 最后电机一关闭 2,思路开启按钮按下接通电机1 并且接通定时器T0 定时器T0 到时候接通电机2 并且开…...

彩虹外链网盘界面UI美化版超级简洁好看

彩虹外链网盘,是一款PHP网盘与外链分享程序,支持所有格式文件的上传,可以生成文件外链、图片外链、音乐视频外链,生成外链同时自动生成相应的UBB代码和HTML代码,还可支持文本、图片、音乐、视频在线预览,这…...

企业微信知识库:从了解到搭建的全流程

你是否也有这样的疑惑:为什么现在的企业都爱创建企业微信知识库?企业微信知识库到底有什么用?如果想要使用企业微信知识库企业应该如何创建?这就是我今天要探讨的问题,感兴趣的话一起往下看吧! | 为什么企业…...

【华为OD机试C++】合并表记录

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例1示例2代码描述 数据表记录包含表索引index和数值value(int范围的…...

uniapp中使用u-popup组件导致的弹框下面的页面可滑动现象

添加代码: touchmove.stop.prevent"()>{}"...

数字孪生|山海鲸可视化快速入门

哈喽,你好啊,我是雷工! 今天继续学习山海鲸可视化软件,以下为学习记录。 (一)新建项目 1.1、打开软件后,默认打开我的项目界面,初次打开需要注册,可以通过手机号快速注册。 点击“新建”按钮,新建一个项目。 1.2、根据项目需要选择一个快捷的项目模板,填写项目名称…...

全美网站建设/网站优化排名方案

测试使用操作系统为Win10 x64 1.下载 前往官网下载MySQL Server(https://dev.mysql.com/downloads/mysql/) 下载完成后解压到自定义目录 2.设置环境变量 3.执行初始化命令 以管理员身份在mysql的bin命令下执行mysqld --initialize --console 执行成功后会给mysql的root用户分配…...

马云将来淘汰的十个行业网站建设/百度识图网页入口

聚合类 聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的: 一.所有成员是public的 二.没有定义任何构造函数 三.没有类内初始值 四.没有基类,也没有virtual函数 如&…...

苹果网站用什么做的/中国十大电商培训机构

解决报告 http://blog.csdn.net/juncoder/article/details/38136193 题目传送门 题意: n头m个机器,求最大匹配。 ps 一分钟前刚做了POJ1469 直接改了输入输出就交了,题意全然一样,,,sad ,代码传…...

在线做txt下载网站/2022新闻大事件摘抄

1、 段机制启动、页机制未启动:逻辑地址->段机制处理->线性地址物理地址 段机制和页机制都启动:逻辑地址->段机制处理->线性地址->页机制处理->物理地址 段机制和页机制实际上是一种映射关系...

wordpress网站投放广告/百度推广后台登陆首页

#!/bin/bash# 说明:站点添加工具[独立代码、数据库]# 日期:2012-03-31 22:31:21 [6]# 用法: x dn.ext# 补充:mpm-itk、vsftpd、mysql#    需要手动删除mysql数据库、vsftpd用户# buildhttpdpwd buildmysqlpwd 用于根据域名计算密码# 作者&…...

江苏省省建设集团网站/品牌策划与推广方案

假设我们有三个表,A表,B表,C表.其数据量分别为100,200,300条记录.并且假设每次都是完全遍历所有数据才找到结果(其实一般情况下不会真的需要完全遍历完才能找到结果),并且假设不考虑索引,当然,就算不排除这些因素,结果比例还是一样的,只是数据大小上有点不一样.并且假设每次查询…...