您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何從一個生產上的錯誤看kafka的消費再均衡問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
項目在生產上的一段錯誤日志如下,
這是一段kafka的錯誤日志,大概的意思是說,
kafka的服務端在超過了 max.poll.interval.ms 時間內沒有收到某個消費者的心跳,認為該消費者已經“掛了”,所以進行了topic的分區所有權“再均衡”。
按照我的個人習慣,遇到類似這樣的生產問題,解決之后我會思考下涉及的技術細節并做整理。
如果對問題涉及的技術細節非常的了解,對于定位問題是非常有幫助的。本文就帶你深入了解下上面那個錯誤日志涉及的一些技術細節。
為了提高消息處理的高可用以及便于橫向擴展,kafka引入了topic的分區概念。屬于同一個消費者群組的消費者可以分擔的消費同一個topic不同分區的消息。從而達到分流的作用,可以使消息處理更高效。
topic A有三個分區,同時我們有三個屬于同一個群組的消費者,這樣每個消費者可以負責消費一個分區。大家各自負責自己的分區,系統有條不紊的運行著。
一般情況下,我們通過增加群組里的消費者數量來提高 kafka 的消費能力。不過要注意,不要讓消費者的數量超過主題分區的數量,多余的消費者只會被閑置。
kafka 的服務端需要一直監控有哪些消費者在消費,監控的機制是通過消費者不斷的發送心跳包實現的。消費者發送心跳有兩個途徑,一個是輪詢(poll,這里不是為了秀英文,注意聯系上面的錯誤日志),一個是消費后提交 offset 。
這兩種方式是兩個獨立的線程,互相不干擾。
只要消費者以正常的時間間隔發送心跳,就被認為是活躍的,說明它還在讀取分區里的消息,否則就被認為是已經“死亡”。
這個所謂的正常的時間間隔,就是不能超過 max.poll.interval.ms。
消費者通過向服務端發送心跳來維持它們和群組的從屬關系以及它們對分區的所有權關系。如果服務端認為某個消費者已經“死亡”,就會觸發一次再均衡。
前面說過,群組里的消費者共同讀取主題的分區。
比如有一個新的消費者加入群組,它讀取的是原本由其他消費者讀取的消息。當一個消費者被關閉或發生崩潰時,它就離開群組,原本由它讀取的分區將由群組里的其他消費者來讀取。
分區的所有權從一個消費者轉移到另一個消費者,這樣的行為被稱為再均衡。
再均衡有什么意義嗎?
當然,有了再均衡,我們可以放心的添加或者移除某個消費者,而不用擔心消息的丟失。
了解了相關的技術細節后,我們可以順藤摸瓜,慢慢排查問題。基于前面的分析,我給出幾個排查的方向:
看看某個消費者的服務是否已經掛了?
如果服務正常運行,服務所在的節點是否存在內存或者CPU占滿的情況,導致消費者無法及時的發送心跳等。我遇到的情況就是后者引起的。后來解決了內存占用滿的問題后,kafka的錯誤就不存在了。
根據自己實際的業務情況,考慮增加 max.poll.interval.ms 的值。
看完上述內容,你們對如何從一個生產上的錯誤看kafka的消費再均衡問題有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。