Kafka無法消費?!我的分散式訊息服務Kafka卻穩如泰山!

PaaS小魔仙發表於2018-08-21

  在一個月黑風高的夜晚,突然收到現網生產環境 Kafka 訊息積壓的告警,夢中驚醒啊,馬上起來排查日誌。

問題現象:消費請求卡死在查詢 Coordinator

Coordinator 為何物? Coordinator 用於管理 Consumer Group 中各個成員,負責消費 offset 位移管理和 Consumer Rebalance Consumer 在消費時必須先確認 Consumer Group 對應的 Coordinator ,隨後才能 join Group ,獲取對應的 topic partition 進行消費。

那如何確定 Consumer Group Coordinator 呢?分兩步走:

1 、一個 Consumer Group 對應一個 __consumers_offsets 的分割槽,首先先計算 Consumer Group 對應的 __consumers_offsets 的分割槽,計算公式如下:

__consumers_offsets partition# = Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount ,其中 groupMetadataTopicPartitionCount offsets.topic.num.partitions 指定。

2 1 中計算的該 partition leader 所在的 broker 就是被選定的 Coordinator

定位過程

Coordinator 節點找到了,現在看看 Coordinator 是否有問題:

不出所料, Coordinator 對應分割槽 Leader -1 ,消費端程式會一直等待,直到 Leader 選出來為止,這就直接導致了消費卡死。

為啥 Leader 無法選舉? Leader 選舉是由 Controller 負責的。 Controller 節點負責管理整個叢集中分割槽和副本的狀態,比如 partition Leader 選舉, topic 建立,副本分配, partition replica 擴容等。現在我們看看 Controller 的日誌:

1.          6 10 15:48:30,006 Broker 1 成為 controller

此時感知的節點為 1 2 ,節點 3 zk 讀不出來:

31 847 的時候把 __consumer_offsets 的分割槽 3 Leader 選為 1 ISR [1,2] leader_epoch 14

再過 1 秒後才感知到 Controller 發生變化,自身清退

2.          Broker 2 在其後幾百毫秒後 (15:48:30,936) 也成為 Controller

但是 Broker2  是感知到 Broker 3 節點是活的,日誌如下 :


注意這個時間點, Broker1 還沒在 zk __consumer_offsets 的分割槽 3 Leader 從節點 3 改為 1 ,這樣 Broker 2 還認為 Broker 3 Leader ,並且 Broker 3 在它認為是活的,所以不需要重新選舉 Leader 。這樣一直保持了相當長的時間,即使 Broker 1 已經把這個分割槽的 Leader 切換了,它也不感知。

3.          Broker 2 12 號的 21:43:19 又感知 Broker 1 網路中斷,並處理節點失敗事件:

因為 Broker 2 記憶體中認為 __consumer_offsets 分割槽 3 Leader broker 3 ,所以不會觸發分割槽 3 Leader 切換。

Broker 2 但是在處理失敗的節點 Broker 1 時,會把副本從 ISR 列表中去掉,去掉前會讀一次 zk ,程式碼如下:

但是發現 zk 中分割槽 3 Leader 已經變為 1 ISR 列表為 [1,2] ,當要去掉的節點 1 就是 Leader 的時候, Leader 就會變為 -1  ISR 只有 [2] ,從日誌也可以看到:

這樣分割槽 Leader 一直為 -1 ,直到有新的事件觸發節點 2 重新選舉才能恢復(例如重啟某個節點)。

根因總結

出現網路異常後,由於新老 controller 之間感知的可用節點不同,導致新 controller 對某個分割槽的 Leader 在記憶體中的資訊與 zk 記錄後設資料的資訊不一致,導致 controller 選舉流程出現錯誤,選不出 Leader   需要有新的選舉事件才能觸發 Leader 選出來,例如重啟。

問題總結

這是一個典型的由於網路異常導致腦裂,進而出現了多個 Controller ,菊廠分散式訊息服務 Kafka( https://www.huaweicloud.com/product/dmskafka.html 經過電信級的可靠性驗證,已經完美解決了這些問題

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543630/viewspace-2212467/,如需轉載,請註明出處,否則將追究法律責任。

相關文章