ZooKeeper 避坑实践: Zxid溢出导致选主

news2024/11/28 2:51:08

作者:子葵

背景

线上 flink 用户使用 ZooKeeper 做元数据中心以及集群选主,一些版本的 flink 在 ZooKeeper 选主时,会重启 Job,导致一些非预期的业务损失。而 ZooKeeper 在 zxid溢出时,会主动触发一次选主,就会导致 flink Job 的非预期重启,造成业务损失。本篇从原理和最佳实践上分析和解决由于 ZooKeeper zxid 溢出导致的集群选主问题。检查 ZooKeeper Server 日志出现。

zxid lower 32 bits have rolled over, forcing re-election, and therefore new epoch start

解决方法

ZooKeeper 本身提供当前处理的最大的 Zxid,通过 stat 接口可查看到当前处理的最大的 zxid 的值,通过此值可以计算当前 zxid 距离溢出值还有多少差距。MSE 提供风险管理以及集群选主相关告警,提前预防和及时感知选主风险,避免业务损失。

通过 MSE ZooKeeper 风险管理和集群选主时间告警,预知风险。

MSE ZooKeepr 提供风险管理的能力,风险管理会定期扫描集群风险,通知用户,zxid 溢出就是集群的风险之一,当 zxid 接近溢出值之前,通过风险管理对风险的扫描,就可以看到集群zxid溢出的风险,提前做好规避。

在这里插入图片描述

风险管理会每天扫描集群的各项风险,也可以通过手动触发 一键健康检查进行集群风险诊断。

同时通过 MSE ZooKeeper 的集群选主时间告警,可以检测集群的选主时间,避免因为集群选主时间过长导致业务损失。通过告警管理中创建 MSE 告警规则进行集群选主时间的告警设置。

在这里插入图片描述

在这里插入图片描述

原因分析

什么是zxid,它是怎么产生的?

首先我们了解一下什么是 zxid,它是怎么产生的:zxid 是 ZooKeeper 中一个事务的全局唯一 id,通过 zxid 描述各个事务之间的全序关系。客户端对 ZooKeeper 内部数据的变更都是通过事务在 ZooKeeper 集群内的传播和处理完成的,因此 zxid 就是客户端对数据进行一次变更所产生的事务在全局事务中的一个唯一 id,这个 id 描述了本次变更的事务在全局事务中的位置,并且不会有两个不同的事务拥有相同的 zxid(全序关系)。

在这里插入图片描述

zxid 是一个 64bits 的数,有两个部分组成:当前选举周期(epoch,占用高32bits)以及计数部分(counter,占用低32bits),epoch 表示 leader 关系的变化,每当新的集群产生新的leader,都会产生一个新的 epoch表示当前 leader 的选举周期,ZooKeeper 集群选主成功之后保证只会有一个Leader,并且此 Leader 的 epoch 是以前没有使用过的,这就保证了只会有一个 leader 使用本次选举过程中产生的 epoch, 在此基础上,每当客户端对数据进行变更的时候,leader 对产生的事务在当前 counter 的值加一产生新的事务的 zxid,并使用此 zxid 将此事务在集群中进行同步,这样就保证了事务的全序关系。

在这里插入图片描述

为什么 zxid 溢出需要重新选主

通过研究 zxid 的组成,可以发现,当单个 epoch 中处理的事务过多,以至于当前epoch 对应的 counter 数值超过了 32bits 计数的最大值,如果继续计数 epoch 就会 +1 , 如果在未来,进行了一次选举,其他的 Server 当选了 leader,但是他产生的新 epoch 可能就会和现在 zxid 中的 epoch 重合,导致不同的事务会有相同的 zxid,破坏了事务之间的全序关系,可能导致脏数据的产生。因此 ZooKeeper 在低 32 位达到最大计数值的时候,就会主动产生一次选主,避免以上问题。

ZooKeeper 集群选主会产生什么影响

一般情况下使用 ZooKeeper 作为注册配置中心,集群选主对于客户端来说是无感知的,集群选主之后客户端会主动重连恢复,但是对于依赖于 ZooKeeper Disconnected 事件的应用,可能会受到影响,在集群选主的时候,Server会向客户端返回 Disconnected 事件,例如 Curator recipes 中 LeaderLatch 类型,在 ZooKeeper 集群选主的时候,LeaderLatch 会重新分配 Leader。

往期内容回顾

  • ZooKeeper 避坑实践:如何调优 jute.maxbuffer
  • ZooKeeper 避坑实践:SnapCount 设置不合理导致磁盘爆满,服务不可用

点击此处来查看微服务引擎产品

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复习0206

目录 一、访问修饰符 一、权限范围 二、注意事项 二、封装(面向对象的三大特征之一) 一、封装的好处 二、封装的实现步骤 三、和构造器结合 四、练习题中的细节 一、访问修饰符 一、权限范围 访问修饰符用于控制方法和属性(成员变量…

Kylin构建引擎的衍生维度

目录1. 衍生维度(derived dimension)1. 衍生维度(derived dimension) 衍生维度的构建和查询过程: 当有一张事实表和维度表如下: 我们需要以city为维度字段,sum(salary)为度量字段,进行cube的构建。因为定义了city为衍生维度字段…

C++多态(上)

文章目录1. 多态的概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同)2.5 重载、覆盖(重写)、隐藏(重定义)的对比3. C11 overri…

小程序酷炫动态登录页源码(动态水滴)

1. 页面效果 登陆页面一般都要酷炫好看一点&#xff0c;这里分享一个动态登录页面&#xff0c;页面有三个流动的小水滴。一个水滴放登录框。剩下两个水滴跳转页面和打开弹窗。 2. 代码内容 <template><view class"login-page"><u-gap height"…

【c语言技能树】文件

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

JVM堆内存详解

一、简介 JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障&#xff0c;在解决该问题之前&#xff0c;必须先了解下JAVA堆内存是怎么工作的。 JVM内存划分为堆内存和非堆内存&#xff0c;堆内存分为年轻代&#xff08;Young Generation&#xff09…

C语言基础(九)—— 复合类型(自定义类型)

1. 结构体1.1 概述数组&#xff1a;描述一组具有相同类型数据的有序集合&#xff0c;用于处理大量相同类型的数据运算。有时我们需要将不同类型的数据组合成一个有机的整体&#xff0c;如&#xff1a;一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐&…

ArkTS语法(声明式UI)

页面级变量的状态管理 装饰器装饰内容说明State基本数据类型&#xff0c;类&#xff0c;数组修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。Prop基本数据类型修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时&#xff0c;…

你真的看好低代码开发吗?

低代码开发前景如何&#xff0c;大家真的看好低代码开发吗&#xff1f;之前有过很多关于低代码的内容&#xff0c;这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年&#xff0c;研究机构Forrester Research发表的报告中提到“面向客户…

【Java基础】017 -- 面向对象进阶二(包、代码块、抽象类、接口、内部类)

目录 四、包和final 1、什么是包&#xff1f; 2、使用其它类的规则 ①、规则实现 ②、小结 3、final ①、示例代码 ②、常量 ③、练习 ④、小结 五、权限修饰符和代码块 1、权限修饰符的分类 2、权限修饰符的使用规则 3、代码块 ①、局部代码块&#xff08;写在…

对docker一部分问题的处理

对docker一部分问题的处理一、permission denied二、启动容器后又立即停止三、Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No URLs in mirrorlist一、permission denied 当要执行docker images 报错&#xff1a; Got permi…

iOS 变体包体构建

ipa变体安装包是指单设备架构单资源的下载包大小 变体包输出方案&#xff1a; 1、在xcode工程中Product->Archive 2、导出选择非Appstore方式&#xff0c;可选择Ad Hoc, Development, Enterprise 3、在用于设置开发分发选项的页面中&#xff0c;为 app 瘦身选取“All co…

第三章.神经网络的学习—梯度,手写数字识别2层神经网络的实现

第三章.神经网络的学习 3.2 梯度 梯度法使用梯度的信息决定前进的方向&#xff0c;在介绍梯度法之前&#xff0c;先介绍一下导数和偏导。 1.导数 1).公式&#xff1a; 2).代码实现&#xff1a; 注意&#xff1a; ①.h 1e-4不可以使用过小的值&#xff0c;会出现计算出错的问题…

室外定位靠卫星 室内定位又如何?

人类为了不让自己迷失在茫茫大自然中&#xff0c;先后发明罗盘、指南针等工具&#xff0c;卫星定位的问世&#xff0c;解决了“我在哪里”的问题。如今物联网是“信息化”时代的重要发展阶段&#xff0c;随着社会信息化水平的普遍提高&#xff0c;其社会的重要性日益显现。云计…

全国青少年编程等级考试scratch四级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1、运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08; &#xff09;A.列表…

Android 图形系统详解

概述 一个页面&#xff08;Activity&#xff09;显示到屏幕上主要经过一下几个流程&#xff1a; 启动 Activity → 创建 Window → WMS 注册 Window → SurfaceFlinger 创建 Surface → 合成 layer → 显示 主要涉及三个进程&#xff1a;App进程、System_server进程、SurfaceF…

常用的硬件端口中各个引脚代表的含义(持续更新)

常见接口 参考&#xff1a;https://blog.csdn.net/qlexcel/article/details/117429653 type-c 示意图 参考&#xff1a;https://blog.csdn.net/qlexcel/article/details/117431413&#xff0c;https://blog.csdn.net/HandsomeHong/article/details/119823915&#xff…

Hystrix容错组件

Hystrix简介Hystrix,英文意思是豪猪&#xff0c;全身是刺&#xff0c;看起来就不好惹&#xff0c;是一种保护机制。它是容错组件&#xff0c;Hystrix也是Netflix公司的一款组件。那么Hystix的作用是什么呢&#xff1f;具体要保护什么呢&#xff1f;Hystix是Netflix开源的一个延…

基于WebGl的智慧校园Web3D管理系统

学校是社会进步与学生成才的重要载体。随着信息化趋势的不断加强&#xff0c;构建"智慧型"校园&#xff0c;继续加强把学校作为主体的教育信息化进程&#xff0c;是教育信息化的主要构成部分。今天给大家分享一个基于 数维图 的 Sovit3D编辑器 构建的学校3D可视化场景…

BIM技巧 | Revit绘制围栏12步骤

首先简单介绍一下revit中的栏杆其实是有三部分的族组成&#xff0c;分别是&#xff1a;支柱&#xff0c;扶栏结构&#xff0c;栏杆。 所以要灵活的运用栏杆命令绘制需要的构造&#xff0c;最少要新建三个族。 第一步&#xff1a;绘制支柱族 用“公制栏杆-支柱”族样板绘制围墙…