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
英文地址,請注明出處:http://en.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;提供了靈活的排序功能。然而&#…