kafka部分partition的leader=-1修复方案整理

ops/2024/9/20 1:17:43/ 标签: kafka, 分布式

kafka部分partition的leader=-1修复方案整理

  • 1. 背景说明
  • 2. 修复测试
    • 2.1 创建正常的topic并验证生产和消费
    • 2.2 停止kafka模拟leader=-1
    • 2.3 修复parition
    • 2.4 修复完成验证生产消费是否恢复
  • 3. 疑问和思考
    • 3.1 kafka在进行数据消费时,如果有partition的leader=-1,进行数据生产和消费时,kafka是否会自动剔除对应的parition?
  • 4. 参考文档

1. 背景说明

部分环境发现,支撑kafka部分topic的被设置成单副本。当出现单机故障时,部分topic-partition出现leader=-1,对应的partition无法正常读写数据。特别是kafka内置的topic __consumer_offsets,__consumer_offsets 是记录topic的消费组数据消费的相关信息,如果出现了该问题,就会导致部分topic的消费组无法正常进行数据消费。

本文记录在工作中遇到的一次修复经历,并进行整理

2. 修复测试

2.1 创建正常的topic并验证生产和消费

  1. 获取kafka的配置zk链接信息,以及leader=-1的topic-partition、和每个kafka的id
# 获取kafka的id
cd /usr/local/services/kafka_2.11-1.1.1
cat config/server.properties |grep broker.id

在这里插入图片描述

# 获取kafka的zk地址
cd /usr/local/services/kafka_2.11-1.1.1
cat config/server.properties |grep zookeeper

在这里插入图片描述

  1. 创建一个单parition,4副本的topic,便于后续测试
# 创建topic
./bin/kafka-topics.sh --create --zookeeper $zk --topic test5 --replication-factor 4 --partitions 1

在这里插入图片描述

  1. 验证topic的读写情况
# 控制台1,创建数据消费者
./bin/kafka-console-consumer.sh --topic test5 --group test5 --bootstrap-server localhost:9092 --from-beginning# 控制台2,创建数据生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test5

在这里插入图片描述

kafkaleader1_46">2.2 停止kafka模拟leader=-1

  1. 停止部分kafka节点,使得__consumer_offsets的partition:41为-1(正好记录test5的数据消费信息)
# 停止相关kafka节点的计划任务
crontab -e# 停止相关kafka进程ps -ef|grep kafkakill -9
# 获取zk信息
# 检查集群的topic信息
cd /usr/local/services/kafka_2.11-1.1.1
zk=xx.xx.xx.xx:2181/kafka
bin/kafka-topics.sh --zookeeper $zk --describe|grep __consumer_offsets

在这里插入图片描述

  1. 继续测试test5的数据生产和消费,此时test5无法消费数据
    在这里插入图片描述

2.3 修复parition

  1. 由于__consumer_offsets的partition:41(test5的消费记录保存在该paritition中)单副本,并且对应的节点已经宕机,因此不能通过调整副本的方式进行修复。需要调整zk中的元数据,重新给__consumer_offsets的partition:41配置isr和leader,让它恢复正常
# 获取zk信息
cd /usr/local/services/kafka_2.11-1.1.1
zk=xx.xx.xx.xx:2181/kafka# 登录zk节点,并进入zk
cd /data/zookeeper-3.4.14/bin
./zkCli.sh# 获取__consumer_offsets的partition:41的配置信息
get /kafka/brokers/topics/__consumer_offsets/partitions/41/state# 调整__consumer_offsets的partition:41的配置信息,选择0作为leader
set /kafka/brokers/topics/__consumer_offsets/partitions/41/state {"controller_epoch":15,"leader":0,"version":1,"leader_epoch":177,"isr":[0]}get /kafka/brokers/topics/__consumer_offsets/partitions/41/state

在这里插入图片描述

在这里插入图片描述

# 登录0号kafka节点,进一步调整replica信息,调整为0
cd /usr/local/services/kafka_2.11-1.1.1vim replication-factor.json 
{"version":1,"partitions":[{"topic":"__consumer_offsets","partition":41,"replicas":[0],"log_dirs":["any"]}]}
# 执行调整命令
./bin/kafka-reassign-partitions.sh --zookeeper $zk --reassignment-json-file replication-factor.json --execute# 查看调整进度
./bin/kafka-reassign-partitions.sh --zookeeper $zk --reassignment-json-file replication-factor.json --verify

说明调整完成,此时应该是leader:0 ,replica: [0], isr: [0]

# 获取zk信息
# 检查集群的topic信息
cd /usr/local/services/kafka_2.11-1.1.1
zk=xx.xx.xx.xx:2181/kafka
bin/kafka-topics.sh --zookeeper $zk --describe|grep __consumer_offsets

在这里插入图片描述

2.4 修复完成验证生产消费是否恢复

  1. 继续验证topic的生产和消费,已经恢复正常
# 控制台1,创建数据消费者
./bin/kafka-console-consumer.sh --topic test5 --group test5 --bootstrap-server localhost:9092 --from-beginning# 控制台2,创建数据生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test5

在这里插入图片描述

3. 疑问和思考

kafkapartitionleader1kafkaparition_137">3.1 kafka在进行数据消费时,如果有partition的leader=-1,进行数据生产和消费时,kafka是否会自动剔除对应的parition?

不会。

在这里将kafka的topic-parition设置成2种类型。

  • 业务topic,业务数据进行生产和消费
  • 内置topic __consumer_offsets,记录业务topic的消费的offset信息

两者逻辑相同。

数据进行生产时,会通过的方式 hash(key) / partition数量(也可以指定partition)到对应的partition, 消费者跟对应的paritition对应才能保证数据在paritition内有序。

如果kakfa在进行hash时需要考虑partition的leader=-1的情况,对应的hash规则会发生调整,对应的数据消费端也需要进行调整,整体的影响较大,因此kafka没有进行这样的考虑。而是要求在创建topic时能够进行要求多副本,并且通过监控运维等手段及时发现leader=-1的partition,并及时修复。

4. 参考文档

暂无


http://www.ppmy.cn/ops/7873.html

相关文章

分布式与集群区别

1、提供服务是否相同 分布式:不同的机器上部署的是不同的服务模块,对外提供不同的服务 集群:不同机器上部署的是同样的模块,对外提供同样的服务 2、目的 分布式:分解任务,用来应对高并发。 集群&#…

【java毕业设计】 基于Spring Boot+mysql的绩效考核管理系统设计与实现(程序源码)-绩效考核管理系统

基于Spring Bootmysql的绩效考核管理系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于Spring Bootmysql的绩效考核管理系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获…

react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善

1、已经定义好的全部的路由配置,需要是这种格式的,可以再加上关于icon的内容. const routerMap [{path: /home,breadcrumbName: Home,},{path: /page1,breadcrumbName: Page 1,children: [{path: /page1/page101,breadcrumbName: Page 101,children: […

代码学习记录49---单调栈

随想录日记part49 t i m e : time: time: 2024.04.20 主要内容:今天开始要学习单调栈的相关知识了,今天的内容主要涉及:柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

社区论坛小圈子小程序源码系统:自定义小程序管理社区圈子软件圈子系统系统开发-做社区圈子丨圈子论坛社区交友系统开源版小程序源码丨

简述 移动互联网的快速发展,微信小程序作为一种新型的应用形态,已经深入到人们的生活中。特别是对于社区论坛类应用,小程序版本可以更好地满足用户快速、便捷获取信息的需求。下面给大家分享一款社区论坛小圈子小程序源码系统。 在这个信息…

【剪映专业版】17高质量视频如何导出

视频课程:B站有知公开课【剪映电脑版教程】 1.导出 目的:导出高质量的视频 如果没有音频及字幕的情况下,音频导出和字幕导出为灰色 2.视频导出 超清:1080P 注意:如果原始素材的分辨率为小于1080P,如果导…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

研究生,该学单片机还是plc。?

PLC门槛相对较低,但是在深入学习和应用时,仍然有很高的技术要求。我这里有一套单片机入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习单片机,不妨点个关注,给个评论222,私信22&am…

写一个函数实现:将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放)之解法改写

#include<stdio.h> void change(int *p){ int i,j,temp; int *pmax,*pmin; // 初始化最大值和最小值的指针 pmaxp; pminp; // 遍历矩阵&#xff0c;寻找最大和最小值 for(i0;i<5;i) for(ji;j<5;j) { if(*pm…

nginx开启basic认证

basic认证也叫做http基本认证&#xff0c;防止恶意访问 首先用在线网站生成一个叫做htpasswd的账号密码文件。 将生成结果复制到/etc/nginx/htpasswd文件中 在server的location中配置 server { listen 80; server_name a.com;location / { root html;index index.…

UE5 C++ 对项目工程的再认识

一.Intermediate 中间文件Intermediate&#xff0c;涉及到反射。胶水文件&#xff0c;与代码产生关联。通过Generate生成出来。 1.C#编译出第三方文件&#xff1a; 反射文件 头文件关联&#xff0c;UHT里的文件.h cpp的关联&#xff0c;UE将所有的cpp放到 gen.cpp里,实现自动关…

Python第四次作业

主程序 import MyTriangles1 float(input("请输入边长1:")) s2 float(input("请输入边长2:")) s3 float(input("请输入边长3:"))r MyTriangle.isvalid(s1, s2, s3) if r:a MyTriangle.area(s1, s2, s3)print("面积为&#xff1a;&quo…

es6编程风格

目录 1、变量let和常量const 2、静态字符串与动态字符串 3、解构赋值&#xff08;数组&#xff0c;对象&#xff09; 4、对象 5、数组 6、函数 7、Map结构 8、class类 9、模块 10、ESLint的使用 1、变量let和常量const ES6 提出了两个新的声明变量的命令&#xff1a;…

数据结构--图

图 1.图的基本介绍 1&#xff09;图的定义&#xff1a; 图(Graph)G由两个集合V和E组成&#xff0c;记为G(V, E)&#xff0c;其中V是顶点的有穷非空集合&#xff0c;E是V中顶点偶对的有穷集合&#xff0c;这些顶点偶对称为边。V(G)和E(G)通常分别表示图G的顶点集合和边集合&a…

javascrip中的class

在JavaScript中&#xff0c;class是一种用于创建对象的模板或蓝图。它是ES6引入的一种语法糖&#xff0c;用于简化对象的创建和继承过程。下面是一个示例代码&#xff0c;详细说明了JavaScript中class的使用&#xff1a; javascript class Animal { constructor(name, age) …

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示&#xff1a;Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas&#xff0c;Kotlin&#xff08;b&#xff09; 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView&#xff0c;Kotlin&#xff08;a&#xff09;-…

Linux配置腾讯云yum源(保姆级教学)

1. 备份原有的 yum 源配置文件 例如&#xff1a; mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 下载腾讯云的 yum 源配置文件 例如&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/…

python爬虫(Selenium案列)第二十四

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

go处理json

在 Go 中&#xff0c;你可以使用内置的 encoding/json 包来处理 JSON 格式数据。该包提供了函数和类型&#xff0c;使你能够将 JSON 数据解析为 Go 对象&#xff08;反序列化&#xff09;或将 Go 对象转换为 JSON 数据&#xff08;序列化&#xff09;。 下面是一些常见的 JSON…

ubuntu22安装宝塔面板

方法一&#xff1a;运行安装宝塔命令 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装成功后&#xff0c;需到服务器管理后台的安全组中配置新规则&#xff0c;放行宝塔面板的端口&#xff08;以阿…