0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探究Kafka宕機引發(fā)的高可用問題

馬哥Linux運維 ? 來源:掘金 ? 作者:JanusWoo ? 2021-10-20 15:41 ? 次閱讀

一、Kafka宕機引發(fā)的高可用問題

問題要從一次Kafka的宕機開始說起。

筆者所在的是一家金融科技公司,但公司內(nèi)部并沒有采用在金融支付領(lǐng)域更為流行的RabbitMQ ,而是采用了設(shè)計之初就為日志處理而生的Kafka,所以我一直很好奇Kafka的高可用實現(xiàn)和保障。從Kafka部署后,系統(tǒng)內(nèi)部使用的Kafka一直運行穩(wěn)定,沒有出現(xiàn)不可用的情況。

但最近系統(tǒng)測試人員常反饋偶有Kafka消費者收不到消息的情況,登陸管理界面發(fā)現(xiàn)三個節(jié)點中有一個節(jié)點宕機掛掉了。但是按照高可用的理念,三個節(jié)點還有兩個節(jié)點可用怎么就引起了整個集群的消費者都接收不到消息呢?

要解決這個問題,就要從Kafka的高可用實現(xiàn)開始講起。

二、Kafka的多副本冗余設(shè)計

不管是傳統(tǒng)的基于關(guān)系型數(shù)據(jù)庫設(shè)計的系統(tǒng),還是分布式的如ZooKeeper 、Redis 、Kafka 、HDFS等等,實現(xiàn)高可用的辦法通常是采用冗余設(shè)計,通過冗余來解決節(jié)點宕機不可用問題。

首先簡單了解Kafka的幾個概念:

物理模型

邏輯模型

Broker (節(jié)點):Kafka服務(wù)節(jié)點,簡單來說一個Broker就是一臺Kafka服務(wù)器,一個物理節(jié)點;

Topic (主題):在Kafka中消息以主題為單位進行歸類,每個主題都有一個 Topic Name,生產(chǎn)者根據(jù)Topic Name將消息發(fā)送到特定的Topic,消費者則同樣根據(jù)Topic Name從對應的Topic進行消費;

Partition (分區(qū)):Topic(主題)是消息歸類的一個單位,但每一個主題還能再細分為一個或多個 Partition(分區(qū)),一個分區(qū)只能屬于一個主題。主題和分區(qū)都是邏輯上的概念,舉個例子,消息1和消息2都發(fā)送到主題1,它們可能進入同一個分區(qū)也可能進入不同的分區(qū)(所以同一個主題下的不同分區(qū)包含的消息是不同的),之后便會發(fā)送到分區(qū)對應的Broker節(jié)點上;

Offset (偏移量):分區(qū)可以看作是一個只進不出的隊列(Kafka只保證一個分區(qū)內(nèi)的消息是有序的),消息會往這個隊列的尾部追加,每個消息進入分區(qū)后都會有一個偏移量,標識該消息在該分區(qū)中的位置,消費者要消費該消息就是通過偏移量來識別。

其實,根據(jù)上述的幾個概念,是不是也多少猜到了Kafka的多副本冗余設(shè)計實現(xiàn)了?別急,咱繼續(xù)往下看。

在Kafka 0.8版本以前,是沒有多副本冗余機制的,一旦一個節(jié)點掛掉,那么這個節(jié)點上的所有 Partition的數(shù)據(jù)就無法再被消費。這就等于發(fā)送到Topic的有一部分數(shù)據(jù)丟失了。

在0.8版本后引入副本記者則很好地解決宕機后數(shù)據(jù)丟失的問題。副本是以 Topic 中每個 Partition的數(shù)據(jù)為單位,每個Partition的數(shù)據(jù)會同步到其他物理節(jié)點上,形成多個副本。

每個 Partition 的副本都包括一個 Leader 副本和多個 Follower副本,Leader由所有的副本共同選舉得出,其他副本則都為Follower副本。在生產(chǎn)者寫或者消費者讀的時候,都只會與Leader打交道,在寫入數(shù)據(jù)后Follower就會來拉取數(shù)據(jù)進行數(shù)據(jù)同步。

就這么簡單?是的,基于上面這張多副本架構(gòu)圖就實現(xiàn)了Kafka的高可用。當某個 Broker 掛掉了,甭?lián)?,這個Broker上的Partition在其他Broker節(jié)點上還有副本。你說如果掛掉的是Leader怎么辦?那就在Follower中在選舉出一個Leader即可,生產(chǎn)者和消費者又可以和新的Leader愉快地玩耍了,這就是高可用。

你可能還有疑問,那要多少個副本才算夠用?Follower和Leader之間沒有完全同步怎么辦?一個節(jié)點宕機后Leader的選舉規(guī)則是什么?

直接拋結(jié)論:

多少個副本才算夠用?

副本肯定越多越能保證Kafka的高可用,但越多的副本意味著網(wǎng)絡(luò)、磁盤資源的消耗更多,性能會有所下降,通常來說副本數(shù)為3即可保證高可用,極端情況下將 Replication Factor參數(shù)調(diào)大即可。

Follower和Lead之間沒有完全同步怎么辦?

Follower和Leader之間并不是完全同步,但也不是完全異步,而是采用一種 ISR機制(In-Sync Replica)。每個Leader會動態(tài)維護一個ISR列表,該列表里存儲的是和Leader基本同步的Follower。如果有Follower由于網(wǎng)絡(luò)、GC等原因而沒有向Leader發(fā)起拉取數(shù)據(jù)請求,此時Follower相對于Leader是不同步的,則會被踢出ISR列表。所以說,ISR列表中的Follower都是跟得上Leader的副本。

一個節(jié)點宕機后Leader的選舉規(guī)則是什么?

分布式相關(guān)的選舉規(guī)則有很多,像ZooKeeper的Zab、Raft、Viewstamped Replication 、微軟的 PacificA 等。而Kafka的Leader選舉思路很簡單,基于我們上述提到的 ISR列表,當宕機后會從所有副本中順序查找,如果查找到的副本在ISR列表中,則當選為Leader。

另外還要保證前任Leader已經(jīng)是退位狀態(tài)了,否則會出現(xiàn)腦裂情況(有兩個Leader)。怎么保證?Kafka通過設(shè)置了一個Controller來保證只有一個Leader。

三、Ack參數(shù)決定了可靠程度

另外,這里補充一個面試考Kafka高可用必備知識點:request.required.asks 參數(shù)。

Asks這個參數(shù)是生產(chǎn)者客戶端的重要配置,發(fā)送消息的時候就可設(shè)置這個參數(shù)。該參數(shù)有三個值可配置:0、1、All 。

第一種是設(shè)為0

意思是生產(chǎn)者把消息發(fā)送出去之后,之后這消息是死是活咱就不管了,有那么點發(fā)后即忘的意思,說出去的話就不負責了。不負責自然這消息就有可能丟失,那就把可用性也丟失了。

第二種是設(shè)為1

意思是生產(chǎn)者把消息發(fā)送出去之后,這消息只要順利傳達給了Leader,其他Follower有沒有同步就無所謂了。存在一種情況,Leader剛收到了消息,F(xiàn)ollower還沒來得及同步Broker就宕機了,但生產(chǎn)者已經(jīng)認為消息發(fā)送成功了,那么此時消息就丟失了。注意,設(shè)為1是Kafka的默認配置,可見Kafka的默認配置也不是那么高可用,而是對高可用和高吞吐量做了權(quán)衡折中。

第三種是設(shè)為All(或者-1)

意思是生產(chǎn)者把消息發(fā)送出去之后,不僅Leader要接收到,ISR列表中的Follower也要同步到,生產(chǎn)者才會任務(wù)消息發(fā)送成功。

進一步思考, Asks=All 就不會出現(xiàn)丟失消息的情況嗎?答案是否。當ISR列表只剩Leader的情況下, Asks=All 相當于 Asks=1 ,這種情況下如果節(jié)點宕機了,還能保證數(shù)據(jù)不丟失嗎?因此只有在 Asks=All并且有ISR中有兩個副本的情況下才能保證數(shù)據(jù)不丟失。

四、解決問題

繞了一大圈,了解了Kafka的高可用機制,終于回到我們一開始的問題本身,Kafka 的一個節(jié)點宕機后為什么不可用?

我在開發(fā)測試環(huán)境配置的 Broker 節(jié)點數(shù)是3,Topic 是副本數(shù)為3,Partition數(shù)為6,Asks參數(shù)為1。

當三個節(jié)點中某個節(jié)點宕機后,集群首先會怎么做?沒錯,正如我們上面所說的,集群發(fā)現(xiàn)有Partition的Leader失效了,這個時候就要從ISR列表中重新選舉Leader。如果ISR列表為空是不是就不可用了?并不會,而是從Partition存活的副本中選擇一個作為Leader,不過這就有潛在的數(shù)據(jù)丟失的隱患了。

所以,只要將Topic副本個數(shù)設(shè)置為和Broker個數(shù)一樣,Kafka的多副本冗余設(shè)計是可以保證高可用的,不會出現(xiàn)一宕機就不可用的情況(不過需要注意的是Kafka有一個保護策略,當一半以上的節(jié)點不可用時Kafka就會停止)。那仔細一想,Kafka上是不是有副本個數(shù)為1的Topic?

問題出在了 consumer_offset 上, consumer_offset 是一個Kafka自動創(chuàng)建的 Topic,用來存儲消費者消費的 offset (偏移量)信息,默認 Partition數(shù)為50。而就是這個Topic,它的默認副本數(shù)為1。如果所有的 Partition 都存在于同一臺機器上,那就是很明顯的單點故障了!當將存儲 __consumer_offset 的Partition的Broker給Kill后,會發(fā)現(xiàn)所有的消費者都停止消費了。

這個問題怎么解決?

需要將 __consumer_offset 刪除,注意這個Topic時Kafka內(nèi)置的Topic,無法用命令刪除,我是通過將 logs 刪了來實現(xiàn)刪除。

需要通過設(shè)置 offsets.topic.replication.factor 為3來將 __consumer_offset 的副本數(shù)改為3。

通過將 __consumer_offset 也做副本冗余后來解決某個節(jié)點宕機后消費者的消費問題。

最后,關(guān)于為什么 __consumer_offset的Partition會出現(xiàn)只存儲在一個Broker上而不是分布在各個Broker上感到困惑,如果有朋友了解的煩請指教~

作者:JanusWoo

來源:https://juejin.im/post/6874957625998606344

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HDFS
    +關(guān)注

    關(guān)注

    1

    文章

    31

    瀏覽量

    9840
  • kafka
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    5372

原文標題:從一次 Kafka 節(jié)點宕機探究 Kafka 的高可用實現(xiàn)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦
    熱點推薦

    介紹三種常見的MySQL可用方案

    在生產(chǎn)環(huán)境中,為了確保數(shù)據(jù)庫系統(tǒng)的連續(xù)可用性、降低故障恢復時間以及實現(xiàn)業(yè)務(wù)的無縫切換,可用(High Availability, HA)方案至關(guān)重要。本文將詳細介紹三種常見的 MySQL
    的頭像 發(fā)表于 05-28 17:16 ?223次閱讀

    MYSQL集群可用和數(shù)據(jù)監(jiān)控平臺實現(xiàn)方案

    該項目共分為2個子項目,由MYSQL集群可用和數(shù)據(jù)監(jiān)控平臺兩部分組成。
    的頭像 發(fā)表于 05-28 10:10 ?421次閱讀
    MYSQL集群<b class='flag-5'>高</b><b class='flag-5'>可用</b>和數(shù)據(jù)監(jiān)控平臺實現(xiàn)方案

    Kafka工作流程及文件存儲機制

    Kafka 中消息是以 topic 進行分類的,生產(chǎn)者生產(chǎn)消息,消費者消費消息,都是面向 topic 的。
    的頭像 發(fā)表于 05-19 10:14 ?363次閱讀
    <b class='flag-5'>Kafka</b>工作流程及文件存儲機制

    華納云如何為電商大促場景扛住Tb級攻擊不宕機?

    在電商大促場景中,面對Tb級攻擊的挑戰(zhàn),為確保SCDN(邊緣安全加速)全站防護能夠扛住攻擊而不宕機,可以從以下幾個方面著手: 一、采用高性能與防護能力的SCDN服務(wù) 選擇具備Tb級帶寬
    的頭像 發(fā)表于 03-25 15:14 ?247次閱讀

    華為云 FlexusX 實例下的 Kafka 集群部署實踐與性能優(yōu)化

    前言 華為云 FlexusX 實例,以創(chuàng)新的柔性算力技術(shù),為 Kafka 集群部署帶來前所未有的性能飛躍。其靈活的 CPU 與內(nèi)存配比,結(jié)合智能調(diào)度與加速技術(shù),讓 Kafka并發(fā)場景下依然
    的頭像 發(fā)表于 01-07 17:23 ?399次閱讀
    華為云 FlexusX 實例下的 <b class='flag-5'>Kafka</b> 集群部署實踐與性能優(yōu)化

    docker 部署 kafka 及 ui 搭建

    建站、開發(fā)??測試環(huán)境、游戲服務(wù)器、音視頻服務(wù)等中低負載場景。 1.2 什么是 kafka 原文鏈接:https
    的頭像 發(fā)表于 01-03 09:30 ?354次閱讀
    docker 部署 <b class='flag-5'>kafka</b> 及 ui 搭建

    LDC上位機引發(fā)win10藍屏怎么解決?

    這個上位機,之前藍屏次數(shù)較少,這幾天打開軟件,插上相應430,立即引發(fā)藍屏,代號 WDF_VIOLATION,求解決辦法
    發(fā)表于 01-02 07:59

    超詳細“零”基礎(chǔ)kafka入門篇

    1、認識kafka 1.1 kafka簡介 Kafka?是一個分布式流媒體平臺 kafka官網(wǎng):http://kafka.apache.or
    的頭像 發(fā)表于 12-18 09:50 ?2684次閱讀
    超詳細“零”基礎(chǔ)<b class='flag-5'>kafka</b>入門篇

    OpenAI就ChatGPT宕機事件致歉

    近日,全球領(lǐng)先的AI研究機構(gòu)OpenAI遭遇了一次重大的服務(wù)中斷事件,其備受歡迎的聊天機器人ChatGPT在全球范圍內(nèi)出現(xiàn)了宕機現(xiàn)象。與此同時,Sora及相關(guān)的API服務(wù)也受到了波及,無法正常運作
    的頭像 發(fā)表于 12-16 09:47 ?779次閱讀

    確保網(wǎng)站無縫運行:Keepalived可用與Nginx集成實戰(zhàn)

    目錄 keepalived可用(nginx) keepalived簡介 keepalived的重要功能 keepalived可用架構(gòu)圖 keepalived工作原理描述 keepa
    的頭像 發(fā)表于 11-27 09:08 ?1111次閱讀
    確保網(wǎng)站無縫運行:Keepalived<b class='flag-5'>高</b><b class='flag-5'>可用</b>與Nginx集成實戰(zhàn)

    Kafka高性能背后的技術(shù)原理

    Kafka 是一款性能非常優(yōu)秀的消息隊列,每秒處理的消息體量可以達到千萬級別。
    的頭像 發(fā)表于 10-23 09:37 ?724次閱讀
    <b class='flag-5'>Kafka</b>高性能背后的技術(shù)原理

    使用bq769x0對可用性系統(tǒng)進行故障監(jiān)控

    電子發(fā)燒友網(wǎng)站提供《使用bq769x0對可用性系統(tǒng)進行故障監(jiān)控.pdf》資料免費下載
    發(fā)表于 10-15 10:13 ?0次下載
    使用bq769x0對<b class='flag-5'>高</b><b class='flag-5'>可用</b>性系統(tǒng)進行故障監(jiān)控

    華為云分布式消息服務(wù) DMS 9 月新動態(tài)上線啦!

    、RabbitMQ、RocketMQ,為應用系統(tǒng)提供異步的、可用的消息隊列服務(wù),實現(xiàn)應用解耦、突發(fā)流量處理以及與第三方應用的集成。 以下為 DMS 9 月新動態(tài),RocketMQ 5.X 專業(yè)版、kafka 監(jiān)控大屏、Clou
    的頭像 發(fā)表于 10-15 09:54 ?690次閱讀
    華為云分布式消息服務(wù) DMS 9 月新動態(tài)上線啦!

    華納云:Linux宕機應該如何進行重啟?

    這篇文章將為大家詳細講解有關(guān)Linux宕機怎么重啟,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。 對于死機的電腦這是更安全的,你需要按: Ctrl + Alt
    的頭像 發(fā)表于 08-13 15:03 ?416次閱讀

    深入探究 MEMS LVCMOS 振蕩器 SiT1602 系列 52 種標準頻率

    深入探究 MEMS LVCMOS 振蕩器 SiT1602 系列(52 種標準頻率)
    的頭像 發(fā)表于 07-19 16:16 ?598次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品