溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何從一個生產(chǎn)上的錯誤看kafka的消費(fèi)再均衡問題

發(fā)布時間:2021-12-15 09:09:30 來源:億速云 閱讀:129 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)如何從一個生產(chǎn)上的錯誤看kafka的消費(fèi)再均衡問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

問題描述

項目在生產(chǎn)上的一段錯誤日志如下,

如何從一個生產(chǎn)上的錯誤看kafka的消費(fèi)再均衡問題


這是一段kafka的錯誤日志,大概的意思是說,
 

kafka的服務(wù)端在超過了 max.poll.interval.ms 時間內(nèi)沒有收到某個消費(fèi)者的心跳,認(rèn)為該消費(fèi)者已經(jīng)“掛了”,所以進(jìn)行了topic的分區(qū)所有權(quán)“再均衡”。

 

問題的分析

按照我的個人習(xí)慣,遇到類似這樣的生產(chǎn)問題,解決之后我會思考下涉及的技術(shù)細(xì)節(jié)并做整理。

如果對問題涉及的技術(shù)細(xì)節(jié)非常的了解,對于定位問題是非常有幫助的。本文就帶你深入了解下上面那個錯誤日志涉及的一些技術(shù)細(xì)節(jié)。

 

kafka的topic分區(qū)

為了提高消息處理的高可用以及便于橫向擴(kuò)展,kafka引入了topic的分區(qū)概念。屬于同一個消費(fèi)者群組的消費(fèi)者可以分擔(dān)的消費(fèi)同一個topic不同分區(qū)的消息。從而達(dá)到分流的作用,可以使消息處理更高效。

topic A有三個分區(qū),同時我們有三個屬于同一個群組的消費(fèi)者,這樣每個消費(fèi)者可以負(fù)責(zé)消費(fèi)一個分區(qū)。大家各自負(fù)責(zé)自己的分區(qū),系統(tǒng)有條不紊的運(yùn)行著。

一般情況下,我們通過增加群組里的消費(fèi)者數(shù)量來提高 kafka 的消費(fèi)能力。不過要注意,不要讓消費(fèi)者的數(shù)量超過主題分區(qū)的數(shù)量,多余的消費(fèi)者只會被閑置。

 

心跳機(jī)制

kafka 的服務(wù)端需要一直監(jiān)控有哪些消費(fèi)者在消費(fèi),監(jiān)控的機(jī)制是通過消費(fèi)者不斷的發(fā)送心跳包實(shí)現(xiàn)的。消費(fèi)者發(fā)送心跳有兩個途徑,一個是輪詢(poll,這里不是為了秀英文,注意聯(lián)系上面的錯誤日志),一個是消費(fèi)后提交 offset 。

這兩種方式是兩個獨(dú)立的線程,互相不干擾。

只要消費(fèi)者以正常的時間間隔發(fā)送心跳,就被認(rèn)為是活躍的,說明它還在讀取分區(qū)里的消息,否則就被認(rèn)為是已經(jīng)“死亡”。
這個所謂的正常的時間間隔,就是不能超過 max.poll.interval.ms。

 

kafka的分區(qū)再均衡

消費(fèi)者通過向服務(wù)端發(fā)送心跳來維持它們和群組的從屬關(guān)系以及它們對分區(qū)的所有權(quán)關(guān)系。如果服務(wù)端認(rèn)為某個消費(fèi)者已經(jīng)“死亡”,就會觸發(fā)一次再均衡。

前面說過,群組里的消費(fèi)者共同讀取主題的分區(qū)。

比如有一個新的消費(fèi)者加入群組,它讀取的是原本由其他消費(fèi)者讀取的消息。當(dāng)一個消費(fèi)者被關(guān)閉或發(fā)生崩潰時,它就離開群組,原本由它讀取的分區(qū)將由群組里的其他消費(fèi)者來讀取。

分區(qū)的所有權(quán)從一個消費(fèi)者轉(zhuǎn)移到另一個消費(fèi)者,這樣的行為被稱為再均衡。

再均衡有什么意義嗎?

當(dāng)然,有了再均衡,我們可以放心的添加或者移除某個消費(fèi)者,而不用擔(dān)心消息的丟失。

解決問題

了解了相關(guān)的技術(shù)細(xì)節(jié)后,我們可以順藤摸瓜,慢慢排查問題?;谇懊娴姆治觯医o出幾個排查的方向:

  1. 看看某個消費(fèi)者的服務(wù)是否已經(jīng)掛了?

  2. 如果服務(wù)正常運(yùn)行,服務(wù)所在的節(jié)點(diǎn)是否存在內(nèi)存或者CPU占滿的情況,導(dǎo)致消費(fèi)者無法及時的發(fā)送心跳等。我遇到的情況就是后者引起的。后來解決了內(nèi)存占用滿的問題后,kafka的錯誤就不存在了。

  3. 根據(jù)自己實(shí)際的業(yè)務(wù)情況,考慮增加 max.poll.interval.ms 的值。

看完上述內(nèi)容,你們對如何從一個生產(chǎn)上的錯誤看kafka的消費(fèi)再均衡問題有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI