記一次Kafka集群的故障恢復

  • Kafka 集群部署環(huán)境
    1. kafka 集群所用版本 0.9.0.1
    2. 集群部署了實時監(jiān)控: 通過實時寫入數據來監(jiān)控集群的可用性, 延遲等;

集群故障發(fā)生

  • 集群的實時監(jiān)控發(fā)出一條寫入數據失敗的報警, 然后馬上又收到了恢復的報警, 這個報警當時沒有重要,沒有去到對應的服務器上去看下log, 惡夢的開始啊~~~
  • 很快多個業(yè)務反饋Topic無法寫入, 運維人員介入

故障解決

  • 運維人員首先查看kafka broker日志, 發(fā)現(xiàn)大量如下的日志:
[2017-10-12 16:52:38,141] ERROR Processor got uncaught exception. (kafka.network.Processor)
java.lang.ArrayIndexOutOfBoundsException: 18
        at org.apache.kafka.common.protocol.ApiKeys.forId(ApiKeys.java:68)
        at org.apache.kafka.common.requests.AbstractRequest.getRequest(AbstractRequest.java:39)
        at kafka.network.RequestChannel$Request.<init>(RequestChannel.scala:79)
        at kafka.network.Processor$$anonfun$run$11.apply(SocketServer.scala:426)
        at kafka.network.Processor$$anonfun$run$11.apply(SocketServer.scala:421)
        at scala.collection.Iterator$class.foreach(Iterator.scala:742)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1194)
        at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
  • 這個問題就很明了了, 在之前的文章里有過介紹: Kafka運維填坑, 上面也給出了簡單修復, 主要原因是 新版kafka 客戶端 sdk訪問較舊版的kafka, 發(fā)送了舊版 kafka broker 不支持的request, 這會導致exception發(fā)生, 然后同批次select出來的所有客戶端對應的request都將被拋棄不能處理,代碼在 SocketServer.scala里面, 大家有興趣可以自行查閱
    1. 這個問題不僅可能導致客戶端的request丟失, broker和broker, broker和controller之間的通訊也受影響;
    2. 這也解釋了為什么 實時監(jiān)控 先報警 然后又馬上恢復了: 不和這樣不被支持的request同批次處理就不會出現(xiàn)問題;
  • 解決過程:
    1. 我們之前已經修復過這個問題, 有準備好的相應的jar包;
    2. 運維小伙伴開始了愉快的jar包替換和啟動broker的工作~~~~~~

集群恢復

  • kafka broker的優(yōu)雅shutdown的時間極不受控, 如果強行kill -9 在start后要作長時間的recovery, 數據多的情況下能讓你等到崩潰;
  • 集群重啟完, 通過log觀察, ArrayIndexOutOfBoundsException異常已經被正確處理, 也找到了相應的業(yè)務來源;
  • 業(yè)務反饋Topic可以重新寫入;

然而, 事件并沒有結束, 而是另一個惡夢的開始

集群故障再次發(fā)生

  • 很多業(yè)務反饋使用原有的group無法消費Topic數據;
  • 用自己的consumer測試, 發(fā)現(xiàn)確實有些group可以, 有些group不能消費;
  • 一波不平一波又起, 注定是個不平凡的夜晚啊, 居然還有點小興奮~~~

故障解決

  • 查看consumer測試程序不能消費時的日志,一直在重復如下log:
Group "xxx" coordinator is xxx.xxx.xxx.xxx:9092 id 3
Broker: Not coordinator for group
  1. 第一條日志 說明consumer已經確認了當前的coordinator, 連接沒有問題;
  2. 第二條日志顯示沒有 Not coordinator, 對應broker端是說雖然coordinator確認了,但是沒有在這個 coodinator上找到這個group對應的metada信息;
  3. group的metada信息在coordinator啟動或__consuser_offsets的partion切主時被加載到內存,這么說來是相應的__consumer_offsets的partition沒有被加載;
  4. 關于coordinator, __consumer_offsets, group metada的信息可以參考 Kafka的消息是如何被消費的?
  • 查看broker端日志, 確認goroup metadata的相關問題
  1. 查找對應的__consumer_offsets的partition的加載情況, 發(fā)現(xiàn)對應的__consumer_offsets正在被Loading;
Loading offsets and group metadata from [__consumer_offsets,19] (kafka.coordinator.GroupMetadataManager)
  1. 沒有找到下面類似的加載完成的日志:
Finished loading offsets from [__consumer_offsets,27] in 1205 milliseconds. (kafka.coordinator.GroupMetadataManager)

也沒有發(fā)生任何的exception的日志

  1. **使用jstack來dump出當前的線程堆棧多次查看, 證實一直是在加載數據,沒有卡死;
  • 現(xiàn)在的問題基本上明確了, 有些__consumer_offsets加載完成了,可以消費, 些沒有完成則暫時無法消費, 如果死等loading完成, 集群的消費可以正常, 但將花費很多時間;**

  • 為何loading這些__consumer_offsets要花費如此長的時間?

    1. 去到__conuser_offsets partition相應的磁盤目錄查看,發(fā)生有2000多個log文件, 每個在100M左右;
    2. kaka 的log compac功能失效了, 這個問題在之前的文章里有過介紹: Kafka運維填坑,
    3. log compact相關介紹可以參考 Kafka的日志清理-LogCleaner
  • 手動加速Loading:

    1. 即使log cleaner功能失敗, 為了加速loading, 我們手動刪除了大部分的log文件; 這樣作有一定風險, 可能會導致某些group的group metadata和committed offset丟失, 從而觸發(fā)客戶端在消費時offset reset;

故障恢復

  • 所有__consumer_offset都加載完后, 所有group均恢復了消費;

總結

  • 對實時監(jiān)控的報警一定要足夠重視;
  • 更新完jar包, 重啟broker時, 三臺存儲__consumer_offsets partition合部同時重啟,均在Loading狀態(tài), 這種作法不合適,最多同時重啟兩臺, 留一臺可以繼續(xù)提供coordinattor的功能;
  • 加強對log compact失效的監(jiān)控, 完美方案是找到失效的根本原因并修復;

Kafka源碼分析-匯總

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弃锐,老刑警劉巖凿菩,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平酿,死亡現(xiàn)場離奇詭異,居然都是意外死亡尔许,警方通過查閱死者的電腦和手機喜庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門诀浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人延都,你說我怎么就攤上這事雷猪。” “怎么了窄潭?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酵颁。 經常有香客問我嫉你,道長,這世上最難降的妖魔是什么躏惋? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任幽污,我火速辦了婚禮,結果婚禮上簿姨,老公的妹妹穿的比我還像新娘距误。我一直安慰自己,他們只是感情好扁位,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布准潭。 她就那樣靜靜地躺著,像睡著了一般域仇。 火紅的嫁衣襯著肌膚如雪刑然。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天暇务,我揣著相機與錄音泼掠,去河邊找鬼怔软。 笑死,一個胖子當著我的面吹牛择镇,可吹牛的內容都是我干的挡逼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼腻豌,長吁一口氣:“原來是場噩夢啊……” “哼家坎!你這毒婦竟也來了?” 一聲冷哼從身側響起饲梭,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤乘盖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后憔涉,有當地人在樹林里發(fā)現(xiàn)了一具尸體订框,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年兜叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了穿扳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡国旷,死狀恐怖矛物,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情跪但,我是刑警寧澤履羞,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站屡久,受9級特大地震影響忆首,放射性物質發(fā)生泄漏。R本人自食惡果不足惜被环,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一糙及、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筛欢,春花似錦浸锨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剥险,卻和暖如春冯凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工宇姚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匈庭,地道東北人锈遥。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓书幕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親规阀。 傳聞我的和親對象是個殘疾皇子魔熏,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • 姓名:周小蓬 16019110037 轉載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,713評論 13 425
  • ** 今天看了一下kafka官網衷咽,嘗試著在自己電腦上安裝和配置,然后學一下官方document蒜绽。** Introd...
    RainChang閱讀 4,994評論 1 30
  • 本文轉載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,465評論 0 34
  • 背景介紹 Kafka簡介 Kafka是一種分布式的镶骗,基于發(fā)布/訂閱的消息系統(tǒng)。主要設計目標如下: 以時間復雜度為O...
    高廣超閱讀 12,826評論 8 167
  • 每周休息的一天躲雅,放松的方式就是在家窩一天鼎姊,打掃打掃衛(wèi)生,看一個電影相赁,做頓好吃的相寇,雖是簡單平淡,卻也是滿足的钮科,讓一周...
    樊思齊閱讀 180評論 0 0