Zookeeper中Session Timeout的那些事

2023-11-11

前言:

RDS系统致力于MySQL数据的高可用,高可靠,高性能以及在线扩展功能,实现这些特性的主要逻辑功能都运行在管理服务器上,一旦管理服务器宕机,数据库的在线扩展功能/备份功能/故障恢复功能等都无从谈起。然而,之前RDS系统管理服务器却是单点服务,为了保证整个系统的稳定性,管理服务器需要实现高可用,结合当前主流的高可用方案,决定使用Zookeeper来实现服务的高可用。

 

 

基本设计方案原理:

如下图所示,管理服务器A B C会在zk的root节点上注册临时序列节点/root/manager000000001 /root/manager000000002 /root/manager0000000003,序列最小的节点会被选为leader对外提供服务,其他节点作为热备节点随时准备升为leader。在此图中,A是leader,B C是standby。一旦A服务器因为某些原因宕机,zk就会将该服务器注册的临时节点移除掉,然后通知所有其他节点B C,B C会选出序列号最小的节点作为新的leader对外提供服务,此时B就会被选为新主。

 

 

 

 

血案现场:

会有这么一种比较特殊的场景需要考虑,比如当前leader是A BC都是备机。假如A和zk集群之间的网络出现了异常,A会收到一个连接状态被持久化为Disconnected的event,但是ZK Server并没有在这时移除A注册的临时节点,所以理论上A还是leader直至session timeout,session timeout后zk会将A注册的临时节点移除掉,然后通知B C选出新的leader,显而易见,B因为序列号小会成为新的leader。但是问题来了,session timeout的时候A的客户端并没有接收到任何notification,换句话说,它依然会认为自己是leader,这个时候就出现了这样的场景,A认为自己是leader,而B同样会认为自己是leader,即同时出现两个leader对外提供服务的情况。这很显然是不合理的,但如何深入地理解并解决这个问题呢?

 

 

个人认为理解并解决这个问题需要理解下面三个子问题:

1. 理解Zookeeper中Session的含义以及Connection Loss和Session Expired的关系

2. 理解Zookeeper中Session为什么由Server维护,而不由Client维护

3. 理解作为leader的A在整个流程中应该如何转变自己的角色,来避免脑裂

 

对zookeeper中Connection Loss和Session Expired的理解

 

 

Session是指当Client创建一个同Server的连接时产生的会话。连接Connected之后Session状态就开启,Zookeeper服务器和Client采用长连接方式(Client会不停地向Server发送心跳)保证session在不出现网络问题、服务器宕机或Client宕机情况下可以一直存在。因此,在正常情况下,session会一直有效,并且ZK集群上所有机器都会保存这个Session信息。

 

在ZK中,很多数据和状态都是和会话绑定的,一旦会话失效,那么ZK就开始清除和这个会话有关的信息,包括这个会话创建的临时节点和注册的所有Watcher。

 

一旦网络连接因为某种原因断开或者zk集群发生宕机,ZK Client会马上捕获到这个异常,封装为一个ConnectionLoss的事件,然后启动自动重连机制在地址列表中选择新的地址进行重连。重连会有三种结果:

(1)在session timeout时间内重连成功,client会重新收到一个syncconnected的event,并将连接重新持久化为connected状态

(2)超过session timeout时间段后重连成功,client会收到一个expired的event,并将连接持久化为closed状态

(3)一直重连不上,client将不会收到任何event

很显然,无论重连成功与否,在session timeout那个重要的时间点,ZK Client是接收不到任何ZK Server清理临时节点的信息的。这也就导致ZK会通知了B C节点A已经不再是Leader,A自身却没有接收到这样的信息,依旧对外提供服务,进而产生脑裂的问题。

 

Zookeeper中Session为什么由Server维护,而不由Client维护

 

可能很多朋友看了上面的讨论就会想为什么ZK Client不维护Session信息,如果这样做了,ZK Client就会在Session Timeout时得到相应的通知。

 

好,现在假如这样实现了,看看会发生什么。设想有这么一种真实场景,某个连接的Session Timeout是15s,ZK集群因为未知原因发生宕机,5min之后集群恢复成功。在Session Timeout时,ZK Client确实可以知道Session失效,然后做降主操作,但是ZK Server却不知道Session已经失效,也就不会通知其他节点选出新的Leader,此时整个系统实际上处于没有Leader的状态。即使5min之后重连成功,因为旧Session对应的临时节点没有被清理且序号最小,ZK依然会认为Leader是该临时节点,而实际上该临时节点对应不到任何的ZK Client,所以这种情况下系统依然选不出Leader。

 

可见,如果由Client维护Session,在某些场景下(网络异常或者集群宕机时间超过Session Timeout),由于逻辑问题根本选不出Leader。

 

因此这种方案是不可行的。

 

那能不能从应用层面避免脑裂问题呢?带着问题进入下个部分。

 

避免脑裂问题:作为leader的A在整个流程中应该如何转变自己的角色

 

因为ZK本身的设计使得这种场景下没有一个完美的解决方案,可以考虑采用退化的方案进行处理。

 

A在接收到DisConnected事件后就降主,不对外提供服务。然后等待接下来的发生的事情,首先可能发生的事件是在Session Timeout时间段内重连成功得到SyncConnected事件,这时A可以重新升级为主,对外提供服务。如果这段时间内没有重连成功,ZK Server在Session Timeout时会将A注册的临时节点移除,并通知B和C A已经停止对外服务了,需要选出新的leader。因为A自己已经降主了,所以在选出新leader后也不会出现多主现象。如果A在Session Timeout时间段外重连又成功了,那此时肯定新的leader已经选出来了,A需要重新注册作为新的备机候选。

 

可以使用如下的流程图解释这个过程:

这种应用层面的方案在一定程度上解决了脑裂问题,但是会出现一段时间系统无Leader的情况,持续时间最长为Session超时时间。

 

 

总结:

结合上述分析,可以针对Session Timeout的问题得出一个应用层面的解决方案,即Client分阶段转变角色方案。如下图所示,箭头上方红色标示表示Client所处不同阶段,箭头下方蓝色标示表示Client在不同阶段的角色转变。

 

 

 

http://www.besttest.cn/blog/43.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zookeeper中Session Timeout的那些事 的相关文章

  • java.lang.reflect.InvocationTargetException

    产生原因 1 包冲突 有重复包或者缺少包 2 项目jdk和部署jdk版本不一样 导致InvocationTargetException异常信息返回一个空值 没有调用invoc里的重写消息方法 3 映射文件发生改变 对于不同原因的解决 1 包
  • zookeeper介绍

    1 简介 Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目 它主要是用来解决分布式应用中经常遇到的一些数据管理问题 如 统一命名服务 状态同步服务 集群管理 分布式应用配置项的管理等 Zookeeper 作为一个
  • Spark学生答题情况分析

    目录 1 流程分析 2 业务模块划分 3 创建模块包结构 4 准备Kafka主题 4 1 测试发送数据到Kafka 5 需求 5 1 代码实现 6 需求 6 1 准备模型 直接训练并使用 6 2 代码实现 7 学生答题情况离线分析 7 1
  • 链路追踪Sleuth入门

    前言 在一个大型的分布式项目中存在各种各样的模块调用 每个模块负责不同的功能 组合成系统 在这种架构下的系统 一次请求往往会调用到许许多多的微服务 这样的跨度对于维护也是存在一定的问题 1 如何快速发现问题 2 如何判断故障影响范围 3 如
  • 【Dubbo】Dubbo(二)简单实践

    Dubbo 二 实践 安装注册中心 下载zookeeper 在zookeeper路径下新增date文件夹存储数据 conf路径下新增zoo cfg 编辑zoo cfg 修改数据目录dataDir为新增的data文件夹 其他与zoo samp
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • Zookeeper报错Will not attempt to authenticate using SASL解决办法

    Will not attempt to authenticate using SASL unknown error 经过查资料 这个问题与zookeeper里面的zoo cfg配置有关 在程序填写的zookeper的路径 一定与zoo cf
  • 五:Zookeeper分布式一致性协议ZAB源码剖析

    目录 ZAB协议介绍 消息广播 崩溃恢复 数据同步 ZAB写数据源码流程图 整个Zookeeper就是一个多节点分布式一致性算法的实现 底层采用的实现协议是ZAB ZAB协议介绍 ZAB 协议全称 Zookeeper Atomic Broa
  • zookeerp安装与配置

    1 zookeeper官网 https zookeeper apache org 2 找到download 然后打开的页面打开archive 版本页面不选择内测或者公测版本 选择一个稳定的 然后下载下来 解压 进入红框目录 在红框目录打cm
  • Dubbo高级应用-服务治理

    目录 1 dubbo admin 2 7 x版本安装部署 1 1 下载源码 1 2 部署访问 2 路由规则 2 1 Dubbo API配置 2 2 管理控制台配置 3 规则动态配置 3 1 应用粒度 3 2 服务粒度 4 服务降级 5 集群
  • 【zookeeper】raft 共识算法 动画演示 网站

    1 概述 地址 https cyberdak github io thesecretlivesofdatacn raft
  • Eureka与Zookeeper的区别

    著名的CAP 理论指出 一个分布式系统不可能同时满足 C 一致性 A 可用性 和 P 分区容错性 由于分区容错性在是分布式系统中必须要保证的 因此我们只能在 A 和 C 之间进行权衡 在此 Zookeeper 保证的是 CP 而 Eurek
  • etcd 集群搭建及常用场景分析

    概述 etcd 是一个分布式一致性k v存储系统 可用于服务注册发现与共享配置 具有以下优点 简单 相比于晦涩难懂的paxos算法 etcd基于相对简单且易实现的raft算法实现一致性 并通过gRPC提供接口调用 安全 支持TLS通信 并可
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务

    一 环境准备 主机名称 主机IP 节点 集群内通讯端口 选举leader clinet端提供服务 端口 docker0 192 168 1 100 node 0 2888 3888 2181 docker1 192 168 1 101 no
  • ZooKeeper(六)权限管理机制

    一 ZooKeeper权限管理机制 1 1 权限管理ACL Access Control List ZooKeeper 的权限管理亦即ACL 控制功能 使用ACL来对Znode进行访问控制 ACL的实现和Unix文件访问许可非常相似 它使用
  • Spring-boot+Dubbo(直连模式)

    Spring boot Dubbo 直连模式 Demo 这里应该有很多人会问 直连模式 什么鬼啊 一般情况下我们进行微服务开发时 都是通过zookeeper等注册中心来实现服务的提供和引用的 那直连模式没啥用啊 其实不然 直连模式大有用处
  • [分布式] zookeeper集群与kafka集群

    目录 一 Zookeeper 概述 1 1 Zookeeper定义 1 2 Zookeeper 工作机制 1 3 Zookeeper 特点 1 4 Zookeeper 数据结构 1 5 Zookeeper 应用场景 1 6 Zookeepe
  • zookeeper 搭建教程(完整版)

    zookeeper 搭建教程 完整版 1 解压zookeeper文件 root master tar zxvf opt software apache zookeeper 3 5 7 bin tar gz C opt module 修改文件
  • Nacos、ZooKeeper和Dubbo的区别

    Nacos ZooKeeper和Dubbo是三个不同的分布式系统组件 它们之间有以下几点区别 功能定位 Nacos主要提供服务发现 配置管理和服务治理等功能 而ZooKeeper主要是分布式协调服务 提供了分布式锁 分布式队列等原语 Dub
  • 【Docker安装部署Kafka+Zookeeper详细教程】

    Docker安装部署Kafka Zookeeper Docker拉取镜像 Docker拉取zookeeper的镜像 docker pull zookeeper Docker拉取kafka的镜像 docker pull wurstmeiste

随机推荐

  • Unity2019.1中文技术手册离线版

    使用离线版优质 系统化的教程 经验文档 参考手册 为开发者节省时间 提高效率 解压后打开UnityDocumentation 2019 1 Manual index html 需要的自取 下载地址 https pan baidu com s
  • linux 下 驱动与设备的名字 主副设备号的区别

    proc devices目录 cat proc devices Character devices 1 mem 4 dev vc 0 4 tty 5 dev tty 5 dev console 5 dev ptmx 7 vcs 10 mis
  • element tiptap安装报错Duplicate use of selection JSON ID cell

    刚开始报错搜了一下说找到node modules tiptap extensions node modules 把最后的 node modules 目录名字修改为 node modules 管用 然后第二天打开项目又报错 后来又报错找到文档
  • failed for get of /hbase/hbaseid, code = CONNECTIONLOSS, retries = 1

    我正在尝试将Spark应用程序与hbase连接 以下是我给的配置 val conf HBaseConfiguration create conf set hbase master localhost 16010 conf setInt ti
  • mac电脑怎么打开终端

    有时候需要输入命令 说是要打开终端 那么mac电脑怎么打开终端 3种方法来在Mac电脑上打开终端 这篇文章将教你如何在macOS系统上使用 启动台 聚焦搜索 或 访达 程序来打开终端 方法 1 使用启动台 打开启动台 如图所示 找到其他 如
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence

    项目场景 python的execjs执行接js报编码错误 UnicodeDecodeError gbk codec can t decode byte 0xae in position 163 illegal multibyte seque
  • centos7在使用docker安装redis

    为什么要docker安装redis 实际工作中用了redis都是工具查询 可没有对redis的安装和配置涉及到 特地简单研究下 对redis内部的一些基本操作产生了一些兴趣 docker安装redis 1 docker 搜索redis do
  • 【金融工程实验】【matlab】使用candle函数画日均k线图

    使用candle函数画日均k线图 要求 数据 数据读入 数据处理 显示图形 本实验为课程设计需求 要求 下载一支股票2020年2月 3月的日线数据 并用MATLAB绘制日K线图 要求绘制5日均线和20日均线 数据 使用海王星软件导出的股票数
  • 控制工程专业英语词汇

    电路 中文 英文 电路 网络 Network 电路 Circuitry 电阻器 Resistor 电感器 Inductor 电容器 Capacitor 晶体管 Transistor 半导体 Semiconductor 晶体 Crystal
  • C语言EasyX_2018中的putimage(x, y, w, h, img, x1, y1)函数

    putimage x y w h img x1 y1 函数一共有六个参数 以下解释来自EasyX 2018的帮助文件 这个函数的几个重载用于在当前设备上绘制指定图像 绘制图像 void putimage int dstX 绘制位置的 x 坐
  • 自定义R语言中表头上下横线的线条类型和线条粗细

    自定义R语言中表头上下横线的线条类型和线条粗细 在R语言中 可以使用tab add hline函数来添加表格的水平线条 其中包括表头上下的横线 本文将详细介绍如何使用tab add hline函数来自定义表头上下横线的线条类型和线条粗细 首
  • js网络图片转base64

    先拿到一张图片地址 var imgUrl https www callmysoft com static index images image dgital 20creativity png 第一种方式 利用canvas canvas to
  • C 、C++ 、Java、Python、JavaScript数据类型对比介绍

    C C Java Python JavaScript数据类型对比介绍 C C Java Python JavaScript数据类型对比如下 C语言 静态类型语言 需要在声明变量时指定类型 基本数据类型包括 整型 int 通常分为有符号 si
  • 跳槽被问离职原因怎样回答能显出高情商?

    对于员工跳槽 原因很简单 要么是收入不高 要么是得到不公平待遇 心里委屈 这真是直击离职者内心 但是 当我们重新找工作 准备跳槽的时候 面试官很可能就会问你 你离职的原因是什么 跳槽被问离职原因怎样回答能显出高情商 广西事业单位招聘整理了如
  • 【C++】Boost库简介

    参考 https blog csdn net f110300641 article details 81865545 https www boost org doc libs 1 80 0 more getting started wind
  • 【100%通过率 】【华为OD机试c++/python】天然蓄水库【 2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天然蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正
  • puppet—批量部署mysql5.7+httpd[包含启动]

    httpd install pp class httpd install package httpd name gt httpd ensure gt installed httpd service pp class httpd servic
  • 基于ARM的温度采集系统设计

    摘要 本设计是基于嵌入式技术作为主处理器的温度采集系统 利用S3C44B0x ARM微处理器作为主控CPU 辅以单独的数据采集模块采集数据 实现了智能化的温度数据采集 传输 处理与显示等功能 并讨论了如何提高系统的速度 可靠性和可扩展性 并
  • 关于app退出的问题,完美退出方式

    实际开发中会有很多关于app的退出问题 我个人比较常见的有两种 一 双击退出 比如说我们在首页的时候需要一个双击退出的方法 点击第一次手机的返回键时提示 再点一次退出应用 之类的话语 我们可以这样做 对重写onKeyDown方法 当他第一次
  • Zookeeper中Session Timeout的那些事

    前言 RDS系统致力于MySQL数据的高可用 高可靠 高性能以及在线扩展功能 实现这些特性的主要逻辑功能都运行在管理服务器上 一旦管理服务器宕机 数据库的在线扩展功能 备份功能 故障恢复功能等都无从谈起 然而 之前RDS系统管理服务器却是单