Kafka無法消費?!我的分散式訊息服務Kafka卻穩如泰山!
在一個月黑風高的夜晚,突然收到現網生產環境 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] ,從日誌也可以看到:
這樣分割槽 3 的 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分散式訊息Kafka分散式Kafka
- kafka消費者消費訊息的流程Kafka
- Kafka 分散式訊息系統Kafka分散式
- 分散式訊息通訊Kafka(二) - 原理分析分散式Kafka
- Kafka中消費者延遲處理訊息Kafka
- 阿里雲 KAFKA 消費者接收不到訊息阿里Kafka
- 分散式訊息系統之Kafka叢集部署分散式Kafka
- kafka消費Kafka
- Kafka 如何保證訊息消費的全域性順序性Kafka
- 實際業務處理 Kafka 訊息丟失、重複消費和順序消費的問題Kafka
- 無鏡--kafka之消費者(四)Kafka
- 訊息推送平臺的實時數倉?!flink消費kafka訊息入到hiveKafkaHive
- Kafka訊息分發、主題分割槽與消費組的概念Kafka
- Pulsar VS. Kafka(1): 統一的訊息消費模型(Queue + Stream)Kafka模型
- Kafka - 消費錯誤問題,多臺機器上面無法消費資料Kafka
- uwsgi多程式配合kafka-python訊息無法傳送KafkaPython
- Kafka 訊息丟失與消費精確一次性Kafka
- 分散式訊息流平臺:不要只想著Kafka,還有Pulsar分散式Kafka
- 分散式訊息佇列:如何保證訊息不被重複消費?(訊息佇列消費的冪等性)分散式佇列
- Kafka 消費者解析Kafka
- librdkafka: 如何設定Kafka消費者訂閱訊息的起始偏移位置Kafka
- SpringBoot整合Kafka(生產者和消費者都是SpringBoot服務)Spring BootKafka
- 模擬上游服務,使用指令碼推送訊息給 Kafka 的解析指令碼Kafka
- java的kafka生產消費JavaKafka
- Kafka 消費組消費者分配策略Kafka
- 以事務方式傳送 Kafka 訊息Kafka
- kafka 訊息佇列Kafka佇列
- Kafka訊息佇列Kafka佇列
- 分散式事務:基於可靠訊息服務分散式
- 分散式、高吞吐量、高可擴充套件性訊息佇列服務Kafka商業化釋出!分散式套件佇列Kafka
- kafka-穩定性-事務Kafka
- flink連線消費kafkaKafka
- Kafka之消費與心跳Kafka
- Kafka 消費者組 RebalanceKafka
- 「Kafka應用」消費者Kafka
- alpakka-kafka(7)-kafka應用案例,消費模式Kafka模式
- Kafka Eagle分散式模式Kafka分散式模式
- 實時數倉之Flink消費kafka訊息佇列資料入hbaseKafka佇列