【Kafka进阶】-- unclean.leader.election.enable参数的内涵
一、背景
近期,我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机,导致 log 文件损坏,重启 kafka 失败,最后导致某个 topic 的分区不可用,本文对此做了简单的分析、解决和复现参考,以此为记录,供各位参考。
二、分析、解决
(1)初次启动时异常节点输出的日志
Feb 10 10:53:20 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[6867]: [2023-02-10 10:53:20,632] WARN Found a corrupted index file due to requirement failed: Corrupt index found, index file (/data2/kafka/data/ncuser_user--1/00000000000170016370.index) has non-zero size but the last offset is 170016370 which is no larger than the base offset 170016370.}. deleting /data2/kafka/data/ncuser_user--1/00000000000170016370.timeindex, /data2/kafka/data/ncuser_user--1/00000000000170016370.index, and /data2/kafka/data/ncuser_user--1/00000000000170016370.txnindex and rebuilding index... (kafka.log.Log)Feb 10 10:53:20 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[6867]: [2023-02-10 10:53:20,632] INFO Loading producer state from snapshot file '/data2/kafka/data/ncuser_user--1/00000000000170016370.snapshot' for partition ncuser_user--1 (kafka.log.ProducerStateManager)(2)参考:https://www.cnblogs.com/felixzh/p/11174439.html,进行数据删除后,异常节点输出的日志
Feb 10 13:41:05 kafka-1.nc.node.prod-1.services.dev run_kafka.sh[18889]: [2023-02-10 13:41:05,662] WARN Found an orphaned index file, /data2/kafka/data/nc-5/00000000004114316599.timeindex, with no corresponding log file. (kafka.log.Log)其他节点输出的日志
Feb 10 14:04:09 kafka-2.nc.node.prod-1.services.dev run_kafka.sh[111352]: [2023-02-10 14:04:09,086] ERROR [ReplicaFetcher replicaId=135, leaderId=137, fetcherId=0] Current offset 415494641 for partition nc-21 out of range; reset offset to 415548539 (kafka.server.ReplicaFetcherThread)(3)最终参考:https://blog.csdn.net/Javajiaojiaozhe/article/details/108003887 调整了参数,然后重启数据损坏的 kafka broker 节点,才使得问题得以解决
调整参数为:unclean.leader.election.enable=true (确保分区可从非 ISR 中选举 leader)
后期彻底解决:升级 kafka 的版本为较新版本(如 2.8.0),公司使用的版本过老,存在许多 bug。
三、总结
在 kafka 1.x 版本中,处于安全和可靠的考虑,有不少参数过于保守。所以用户需要按需调整
1、将 broker 参数 unclean.leader.election.enable 设置为 true(确保分区可从非 ISR 中选举 leader)2、将 broker 参数 default.replication.factor 设置为 3(提高高可用,但会增大集群的存储压力,可后续讨论)3、将 broker 参数 min.insync.replicas 设置为 2(这么做可确保 ISR 同时有两个,但是这么做会造成性能损失,是否有必要?因为我们已经将 unclean.leader.election.enable 设置为 true 了)问题是解决了,但需要思考一些问题,以便我们能更好地理解 kafka。
(1)什么是 LEO、LSO、HW、AR和 ISR?
1、LEO(Log End Offset):日志末端位移值或末端偏移量,表示日志下一条待插入消息的位移值。举个例子,如果日志有10条消息,位移值从0开始,那么,第10条消息的位移值就是9。此时,LEO = 10。2、LSO(Log Stable Offset):这是Kafka事务的概念。如果你没有使用到事务,那么这个值不存在(其实也不是不存在,只是设置成一个无意义的值)。该值控制了事务型消费者能够看到的消息范围。它经常与Log Start Offset,即日志起始位移值相混淆,因为有些人将后者缩写成LSO,这是不对的。在Kafka中,LSO就是指代Log Stable Offset。3、HW(High watermark):高水位值,这是控制消费者可读取消息范围的重要字段。一个普通消费者只能“看到”Leader副本上介于Log Start Offset和HW(不含)之间的所有消息。水位以上的消息是对消费者不可见的。
AR(Assigned Replicas):AR是topic 被创建后,分区创建时被分配的副本集合,副本个数由副本因子决定。举例: AR 的副本在 ISR 副本集中
集群有 4台 kafka broker: 207、208、209、210
$ kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 4 --partitions 3 --topic isr_test
ISR(In-Sync Replicas):Kafka中特别重要的概念,指代的是AR中那些与Leader保持同步的副本集合。在AR中的副本可能不在ISR中,但Leader副本天然就包含在ISR中。
举例: AR 的副本不在 ISR 副本集中
集群有 4台 kafka broker: 134、135、137、138
$ kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 2 --partitions 3 --topic isr_test
(2)unclean.leader.election.enable的内涵是?
从 kafka 1.x的官方解释如下:
https://kafka.apache.org/10/documentation.html

指示是否使不在ISR集中的复制体作为最后手段被选为领导者,即使这样做可能导致数据丢失。需要结合 AR(Assigned Replicas)和 ISR (In Sync Replicas)来理解这个参数。以这个 topic 为例

在 134 和 138 节点都下线的情况下, 138 节点的 follower2( 134 节点) 副本落后 leader 副本很多,并且也不在 leader (135节点)副本和 follower1 (135节点)副本所在的ISR集合之中。
follower2 副本正在努力的追赶 leader 副本以求迅速同步,并且能够加入到 ISR 中。但是很不幸的是,此时他(138)的 ISR中的所有副本都突然下线,只留下 partition0 和 partition1。
此时 follower2 副本(134节点)还在,就会进行新的选举,但在选举之前首先要判断 unclean.leader.election.enable 参数的值。
1、如果 unclean.leader.election.enable=false,那么就意味着非ISR中的副本不能够参与选举,此时无法进行新的选举,此时整个分区处于不可用状态。2、如果 unclean.leader.election.enable=true,那么可以从非ISR集合(135 和 137 节点)中选举 follower 副本成为新的leader。产生新的 leader 后,随着时间的推进,新的 leader 副本从客户端收到了新的消息,此时,原来的leader副本恢复,成为了新的follower副本,准备向新的leader副本同步消息,但是它发现自身的LEO比leader副本的LEO还要大。
限制条件:Kafka 中有一个准则,follower副本的 LEO 是不能够大于 leader 副本的,所以新的 follower 副本就需要截断日志至leader副本的 LEO 处。
那么新的 follower 副本需要删除一部分消息,之后才能与新的leader副本进行同步。之后新的 follower 副本和新的leader副本组成了新的ISR集合。
(3)异常复现
请参考:https://developer.aliyun.com/article/918789
相关文章:
【Kafka进阶】-- unclean.leader.election.enable参数的内涵
一、背景近期,我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机,导致 log 文件损坏,重启 kafka 失败,最后导致某个 topic 的分区不可用,本文对此做了简单的分析、解决和复现参考,以此为记…...
基于redis实现分布式锁
前言 我们的系统都是分布式部署的,日常开发中,秒杀下单、抢购商品等等业务场景,为了防⽌库存超卖,都需要用到分布式锁。 分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或…...
C#开发的OpenRA动态加载插件DLL里的类实现
C#开发的OpenRA动态加载插件DLL里的类实现 由于这款游戏的设计是为了开源设计, 并且可以让不同个人或团体实现自己的游戏, 那么每个人实现的代码是不一样的,算法也是不一样的。 并且可能也拿不到代码一起编译生成一套运行的代码。 这时候,就要考虑使用动态加载类的功能。 意…...
网站代理是什么?有什么需要注意的?
如今,网站代理已经成为一种不可或缺的经营方式。无论是企业还是个人,都需要通过代理来获得更多的流量和市场份额。 一、网站代理的优势 网站代理的优势在于能够为您提供更加专业、周到的服务。这些优势包括:1.丰富的内容资源,能…...
动态库和静态库的区别
什么是库文件 一般来说,一个程序,通常都会包含目标文件和若干个库文件。经过汇编得到的目标文件再经过和库文件的链接,就能构成可执行文件。库文件像是一个代码仓库或代码组件的集合,为目标文件提供可直接使用的变量、函数、类等…...
C/C++路径去除前缀
在做一些日志输出的工作时,想要获取当前文件名,而不是冗长的文件路径。路径获取往往和各家os底层函数优化。C/C标准中定义了一些预处理宏,可以帮助我们获取文件路径。我们希望能够在编译期而不是在运行期做这个事情,避免额外的性能…...
Vue2之Vue-cli应用及组件基础认识
Vue2之Vue-cli应用及组件基础认识一、Vue-cli1、单页面应用程序2、vue-cli介绍3、安装和使用4、创建项目4.1 输入创建项目4.2 选择第三项,进行自主配置,按回车键即可4.3 选择自己需要的库4.4 选择Vue的版本4.5 选择CSS选择器4.6 选择Babel、ESLint、etc等…...
C 学习笔记 —— 声明、定义、初始化
文章目录声明定义初始化定义和初始化的区别静态变量初始化自动变量初始化声明 说明符表达式列表 int a; char j, k l;定义 一般的情况下,我们把建立空间的声明称之为定义,而把不需要建立存储空间的声明称之为声明。 int tern 1; //定义int main() {…...
机械狗控制算法
一. MIT Cheetah特点 1.驱动器 Cheetah 2采用了定制的本体感受驱动器设计,具有高冲击缓解、力控制和位置控制能力。这种设计使其能够自主跳过障碍物,并以6m/s的高速跳跃,但其运动范围有限,只能进行矢状面运动。 Cheetah 3采用高扭…...
向量与矩阵 导数和偏导数 特征值与特征向量 概率分布 期望方差 相关系数
文章目录向量与矩阵标量、向量、矩阵、张量向量范数和矩阵的范数导数和偏导数特征值和特征向量概率分布伯努利分布正态分布(高斯分布)指数分布期望、⽅差、协⽅差、相关系数期望方差协⽅差相关系数向量与矩阵 标量、向量、矩阵、张量 标量(…...
记录--前端实现登录拼图验证
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 不知各位朋友现在在web端进行登录的时候有没有注意一个变化,以前登录的时候是直接账号密码通过就可以直接登录,再后来图形验证码,数字结果运算验证,…...
【Go语言基础】Go语言中的map集合详细使用(附带源码)
文章目录Go语言中的map集合1-1 定义1-2 map遍历1-3 map集合删除1-4 map是引用类型Go语言中的map集合 Go 语言提供了内置类型 map集合,它将一个值与一个键关联起来,可以使用相应的键检索值。 map是一种集合,可以像遍历数组或切片那样去遍历它…...
C++11 lambda
Lambda 介绍 Lambda 函数也叫匿名函数, 是C 11中新增的特性; 1. Lambda函数的好处 如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么将他们重构成 lambda 表达式。 Lambda函数使代码变得更加紧凑、更加结构化和更富有表现…...
【新】华为OD机试 - 分苹果(Python)
分苹果 题目 AB两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二级制加法计算 并且不计算进位12+5=9(1100+0101=9), B的计算规则是十进制加法, 包括正常进位,B希望在满足A的情况下获取苹果重量最多 输入苹果的数量和每个苹果重量 输出满足A的情况下…...
Python 模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。 模块能定义函数&#…...
gdb调试功能从零到会(Linux详解)
目录 👀 1.安装gdb 👀2.判断是否安装成功 👀3.改成debug方式发布。 👀 4.gdb功能简介 前言 gdb是Linux 下功能全面的调试工具。gdb支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在Linux环境软件…...
【C语言学习笔记】:数组、指针相关面试题
无特殊说明情况下,下面所有题s目都是linux下的32位C程序。 「1、计算以下sizeof的值。」 char str1[] {a, b, c, d, e}; char str2[] "abcde";char *ptr "abcde";char book[][80]{"计算机应用基础","C语言","C程…...
go语言环境配置 项目启动
一 安装go语言 go语言各个版本之间兼容性比较差。所以可能你需要安装固定的版本 1 安装最新版的go brew install go2 查看go可以安装的版本 brew search go3 安装指定版本的go brew install go1.134 查看安装的go语言的版本 go version5 查看go的安装路径 which go || w…...
Springboot 使用插件 自动生成Mock单元测试 Squaretest
缘起 很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。 有时候工期相对紧张,就优先开发功能,测试功能,然后再去补单元测试。 但是编写单元测试又比较浪费时间,有没有能够很大…...
「JVM 执行引擎」栈架构的字节码的解释执行引擎
JVM 执行引擎在执行 Java 代码时有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择; HotSpot 实际的实现中,模版解释器工作时,并不是按照概念模型中进行机械式计…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
