kafka生产端和消费端的僵尸实例以及解决办法

目录

一 生产端僵尸

1.1 原因

1.2 问题

1.3解决办法

1.4 案例

1.4.1 案例1:生产者崩溃后重启 (同一 transactional.id)

1.4.2 案例2:短暂网络分区导致的脑裂

1.4.3 案例3:正确 - 解决僵尸

1.4.4 案例4:错误 - 无法解决僵尸

1.5 结论

二  消费端僵尸

2.1 原因

2.2 问题

2.3 解决办法

一 生产端僵尸

1.1 原因

一个生产者实例(producer)在发送消息过程中发生故障(如进程崩溃、网络隔离),但可能未被外部系统及时检测到。过一段时间后,该生产的新实例可能被重启(例如,在容器化环境中被调度器重启,或者运维手动重启)

1.2 问题

问题1:如果故障前的生产者实例在崩溃前可能已经成功发送了部分消息(但未完成事务提交),而新实例并不知道,它可能会重新发送这些消息,导致重复数据

问题2:脑裂问题: 在短暂的网络分区期间,可能出现两个都认为自己是“活动”的生产者实例同时向同一个分区写入数据,造成数据混乱。

1.3解决办法

1.kafka使用transaction id和producer epoch来解决生产者僵尸问题;epoch它本质上是该transactional.id的一个单调递增的序列号

2.Epoch比较只在相同 transactional.id 内有效:只有配置了相同 transactional.id 的生产者实例之间,它们的 Epoch 值才有比较的意义。Transaction Coordinator 会为新实例分配更高的 Epoch,并通知 Broker 拒绝任何携带旧 Epoch 的写入请求(针对该 transactional.id)。

也即:新启动的实例必须使用与旧实例完全相同的 transactional.id。这是 Epoch 比较和隔离机制生效的前提条件。

3.不同 transactional.id = 完全独立: 如果两个生产者实例使用不同的 transactional.id,无论它们的 Epoch 值是多少(即使其中一个为 1,另一个为 100),它们都会被 Kafka 视为两个完全独立、互不相干的生产者。Broker 不会对它们进行Epoch比较或相互隔离。它们可以同时向同一个分区发送消息(尽管可能因 Leader 处理顺序导致消息交叉),但 Kafka 不保证它们之间的顺序或原子性。

1.4 案例

1.4.1 案例1:生产者崩溃后重启 (同一 transactional.id)

旧实例崩溃,事务可能处于中间状态(消息已发送但未提交)。

新实例启动,向 Transaction Coordinator 初始化事务。

Transaction Coordinator 分配一个更高的新 Epoch (e.g., old=1, new=2),并隔离旧Epoch=1。

Transaction Coordinator 中止由旧实例启动的未完成事务(标记为 ABORT),确保那些部分写入的消息不会被消费者读取(在 read_committed 隔离级别下)。

新实例(Epoch=2)开始新的事务。它不会重复发送旧实例可能已发送过的消息,因为应用逻辑知道事务未提交,需要重新处理业务逻辑并发送新消息。

如果旧实例“僵尸复活”并尝试发送消息,Broker 会检查其 Epoch=1 < 当前最新 Epoch=2,拒绝写入。

1.4.2 案例2:短暂网络分区导致的脑裂

两个实例(可能是由于网络分区误判)都认为自己是活跃的,使用同一个 transactional.id。

其中一个实例(假设是重启后的新实例)成功联系到 Transaction Coordinator,获得了更高的 Epoch。

Transaction Coordinator 隔离了旧 Epoch。

当网络恢复时,持有旧 Epoch 的实例的任何写入请求都会被 Broker 拒绝(InvalidProducerEpoch)。

只有持有最新 Epoch 的实例的写入有效,避免了数据冲突。

1.4.3 案例3:正确 - 解决僵尸

生产者 A (Instance 1): transactional.id = "prod-app-1", Epoch = 1 (由 TC 分配)。

生产者 A 崩溃。

生产者 A (Instance 2 - 新实例) 启动,配置 transactional.id = "prod-app-1"。

Transaction Coordinator (TC) 检测到 "prod-app-1" 的新会话。

TC 为 "prod-app-1" 分配 新的 Epoch = 2。

TC 通知相关 Broker:对于 "prod-app-1",最新 Epoch 是 2,拒绝 Epoch <= 1 的请求。

如果旧实例 (Instance 1) 的进程“僵尸复活”并尝试发送消息 (携带 Epoch=1),Broker 会检查:"prod-app-1" 的当前最新 Epoch=2 > 请求中的 Epoch=1 → 拒绝写入 (InvalidProducerEpoch)。

新实例 (Instance 2) 使用 Epoch=2 可以正常写入。

1.4.4 案例4:错误 - 无法解决僵尸

生产者 A (Instance 1): transactional.id = "prod-app-1", Epoch = 1。

生产者 A 崩溃。

生产者 A (Instance 2 - 新实例) 启动,但错误地配置了 transactional.id = "prod-app-1-backup" (一个不同的 ID)。

TC 将 "prod-app-1-backup" 视为一个全新的、独立的生产者。

TC 为 "prod-app-1-backup" 分配 新的 Epoch = 1 (或其他初始值,与 "prod-app-1" 的 Epoch 无关)。

Broker 记录:

对于 "prod-app-1": 最新 Epoch = 1 (对应旧僵尸实例)。

对于 "prod-app-1-backup": 最新 Epoch = 1 (对应新实例)。

如果旧实例 (Instance 1) 的进程“僵尸复活”并尝试发送消息 (携带 transactional.id="prod-app-1", Epoch=1),Broker 检查:"prod-app-1" 的最新 Epoch=1 == 请求中的 Epoch=1 → 允许写入。

新实例 (Instance 2) 使用 "prod-app-1-backup", Epoch=1 也可以写入。

结果:两个实例同时写入相同的分区,造成数据混乱。Fencing 机制完全失效,因为新实例没有使用相同的 transactional.id 来“声明接管”。其实本质上是两个不同的transaction id,是两个独立的事务,并不相关,至于写入相同分区的相同内容可以使用去重,幂等机制来解决。

1.5 结论

transactional.id, Producer Epoch, 和 Kafka 事务协议共同构成了 Kafka 保障生产者高可用、防止僵尸实例破坏数据一致性的基石。

DeepSeek

二  消费端僵尸

2.1 原因

已经从物理上或逻辑上失效(如进程崩溃、网络隔离、长时间 GC 停顿、负载过高无响应)但 Kafka 集群(特别是 Group Coordinator)暂时还未将其识别为失效并从消费者组中移除的消费者实例 

2.2 问题

分区分配不均衡/浪费: 新启动的健康消费者无法分配到这些僵尸实例"霸占"的分区,导致部分分区无人消费,消息堆积。

2.3 解决办法

1.心跳机制和超时:健康的消费者会按照 心跳机制(heartbeat.interval.ms )的间隔定期向消费组内的协调者( Group Coordinator) 发送心跳。如果连续两次发送的心跳的间隔超时(超过session.timeout.ms),协调者它就判定该消费者已经死亡(失效)。

2.再平衡:再平衡会将原本分配给僵尸实例的分区重新分配给组内存活的其他健康消费者,解决消息堆积问题。

3.给拉取消费消息的方法poll()处理消费卡顿问题设置规定时间( max.poll.interval.ms)

如果消费者在规定的时间内( max.poll.interval.ms) 时间内没有再次调用 poll(),Group Coordinator 会认为该消费者处理能力不足或卡住了。Group Coordinator 会主动将该消费者从组中移除,触发再平衡

4.监控告警:及时进行人工干预。

https://chat.deepseek.com/a/chat/s/6e3234e3-fd76-4000-9326-01780a2fdb48

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

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

相关文章

国产电科金仓数据库金仓KES V9 2025:AI时代的数据库融合标杆

国产电科金仓数据库金仓KES V9 2025&#xff1a;AI时代的数据库融合标杆 在AI技术迅猛发展的今天&#xff0c;企业数据管理面临着前所未有的挑战&#xff1a;异构数据库兼容难题、多数据模型融合需求、高并发场景性能瓶颈、跨中心容灾压力……这些痛点如同数据流转的大问题&am…

【STM32】关于STM32F407写Flash失败问题的解决办法

问题描述 在使用正点原子的STM32F407写flash例程时&#xff0c;发现STMFLASH_Write函数没办法写入数据到flash&#xff0c;原始代码输入下&#xff1a; 随后对每一行代码的结果进行分析&#xff0c;发现87行的“FLASH_ProgramWord(WriteAddr,*pBuffer)”返回值是7&#xff0c;一…

CUDA与RISC-V的融合:打破架构霸权,重塑AI计算未来

当x86和Arm统治数据中心十余年后,一家GPU巨头正悄悄将十亿颗RISC-V核心嵌入其系统。如今,它决定拆除CPU架构的围墙。 2025年7月,上海张江科学会堂。英伟达硬件工程副总裁Frans Sijstermanns在第五届RISC-V中国峰会上宣布:英伟达正式启动CUDA向RISC-V架构的移植工作。 这个…

微信二维码扫描登录流程详解

二维码扫描登录流程细节&#xff08;项目经验&#xff09; 1&#xff1a; 获取二维码信息 PC会优先存放服务器生成的唯一密钥&#xff1a; 比如 source、secret 以密文形式存储大致发送字段&#xff1a; sourcesecretmac(mac 地址) 服务器生成 二维码信息&#xff1a;二维码字符…

日本上市IT企业|8月125日将在大连举办赴日it招聘会

株式会社GSD的核心战略伙伴贝斯株式会社&#xff0c;将于2025年8月25日在大连香格里拉大酒店商务会议室隆重举办赴日技术人才专场招聘会。本次招聘会面向全国范围内的优秀IT人才&#xff0c;旨在为贝斯株式会社东京本社长期发展招募优质的系统开发与管理人才。招聘计划&#xf…

Python 数据分析与可视化:从基础到进阶的技术实现与优化策略

数据分析与可视化是数据科学领域的核心技能,Python 凭借其丰富的库生态和灵活的编程范式,成为该领域的首选工具。本文将系统讲解 Python 数据分析与可视化的技术栈实现,从基础操作到性能优化,结合实战场景提供可复用的解决方案。 数据分析核心库技术解析 Pandas 数据处理…

Rust Web 全栈开发(十):编写服务器端 Web 应用

Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用创建成员库&#xff1a;webappmodelshandlersrouterserrorsmodsvrstaticteachers.htmlregister.htmlbootstrap.m…

每日面试题11:JVM

深入理解JVM&#xff1a;Java的“心脏”如何驱动程序运行&#xff1f;为什么需要JVM&#xff1f;你是否想过&#xff0c;为什么用Java写的程序&#xff0c;能在Windows、Linux、macOS上“无缝运行”&#xff1f;为什么开发者无需为不同操作系统重写代码&#xff1f;这背后的核心…

Linux网络信息(含ssh服务和rsync)

73.telnet&#xff1a;测试端口连通性用法&#xff1a;telnet 主机名或IP 端口号测试目标主机的指定端口是否开放&#xff0c;检查网络服务连通性。eg&#xff1a;telnet www.baidu.com 80# 说明&#xff1a;# - 如果连接成功&#xff0c;显示 "Connected to ..."。…

【PTA数据结构 | C语言版】我爱背单词

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 作为一个勤奋的学生&#xff0c;你在阅读一段英文文章时&#xff0c;是否希望有个程序能自动帮你把没有背过的生词列出来&#xff1f;本题就请你实现这个程序。 输入格式&#xff1a; 输入第 1 行给…

如何使用电脑连接小米耳机(红米 redmi耳机)

如何使用电脑连接小米&#xff08;红米 redmi&#xff09;耳机Redmi耳机连接电脑的具体步骤如下注意事项和常见问题解决方法&#xff1a;Redmi耳机连接电脑的具体步骤如下 打开耳机仓盖&#xff1a; 首先&#xff0c;打开Redmi耳机的充电仓盖&#xff0c;但不需要取出耳机。进…

排序算法—交换排序(冒泡、快速)(动图演示)

目录 十大排序算法分类​编辑 冒泡排序 算法步骤&#xff1a; 动图演示&#xff1a; 性能分析&#xff1a; 代码实现&#xff08;Java&#xff09;&#xff1a; 快速排序&#xff08;挖坑法&#xff09; 算法步骤&#xff1a; 动图演示&#xff1a; 性能分析&#xff1…

2023 年 5 月青少年软编等考 C 语言八级真题解析

目录 T1. 道路 思路分析 T2. Rainbow 的商店 思路分析 T3. 冰阔落 I 思路分析 T4. 青蛙的约会 思路分析 T1. 道路 题目链接:SOJ D1216 N N N 个以 1 ∼ N 1 \sim N 1∼N 标号的城市通过单向的道路相连,每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数…

【vue-4】深入理解 Vue 3 中的 v-for 指令

Vue.js 作为现代前端框架的代表之一&#xff0c;其模板指令系统提供了强大的数据绑定和渲染能力。其中&#xff0c;v-for 指令是 Vue 中最常用且最重要的指令之一&#xff0c;它允许我们基于数据源循环渲染元素或组件。在 Vue 3 中&#xff0c;v-for 保留了一贯的简洁语法&…

《R for Data Science (2e)》免费中文翻译 (第1章) --- Data visualization(1)

写在前面 本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn …

界面组件DevExpress WPF中文教程:Grid - 如何完成节点排序和移动?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【Prometheus+Grafana篇】监控通过Keepalived实现的MySQL HA高可用架构

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

k8s:利用kubectl部署postgis:17-3.5

1.离线环境CPU:Hygon C86 7285 32-core Processor 操作系统&#xff1a;麒麟操作系统 containerd&#xff1a;1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey&#xff1a;3.1.10 Harbor:2.13.1 Postgis:17-3.52.创建并执行postgresql-headless.yaml2.1创建apiVersion: v1…

Mysql(存储过程)

目录 介绍 特点 存储过程创建 系统变量(不重要) 用户变量 局部变量 if 判断 参数&#xff08;in, out, inout) case while repeat loop 游标和条件处理程序-handler 存储函数 为了防止以后忘记&#xff0c;反复去看视频浪费时间&#xff0c;特写一篇 介绍 存储过程…

Effective Python 第14条: 用sort方法的key参数来表示复杂的排序逻辑

一、引言&#xff1a;Python排序功能的重要性 在Python开发中&#xff0c;排序功能是一个常见的需求。无论是处理数据、优化算法&#xff0c;还是提升用户体验&#xff0c;排序都是不可或缺的一部分。Python的列表内置了sort方法&#xff0c;提供了灵活的排序功能。然而&#…