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

【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端进行登录的时候有没有注意一个变化,以前登录的时候是直接账号密码通过就可以直接登录,再后来图形验证码,数字结果运算验证&#xff0c…...

【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 实际的实现中,模版解释器工作时,并不是按照概念模型中进行机械式计…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...