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

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

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

Kafka的概念及Kafka的宕機(jī)

阿銘linux ? 來(lái)源:掘金 ? 作者:JanusWoo ? 2021-08-27 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問(wèn)題要從一次Kafka的宕機(jī)開(kāi)始說(shuō)起。

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

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

要解決這個(gè)問(wèn)題,就要從 Kafka 的高可用實(shí)現(xiàn)開(kāi)始講起。

Kafka 的多副本冗余設(shè)計(jì)

不管是傳統(tǒng)的基于關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)的系統(tǒng),還是分布式的如 zookeeper 、 redis 、 Kafka 、 HDFS 等等,實(shí)現(xiàn)高可用的辦法通常是采用冗余設(shè)計(jì),通過(guò)冗余來(lái)解決節(jié)點(diǎn)宕機(jī)不可用問(wèn)題。首先簡(jiǎn)單了解 Kafka 的幾個(gè)概念:

3898b0f4-f628-11eb-9bcf-12bb97331649.png

邏輯模型

38a3dfd8-f628-11eb-9bcf-12bb97331649.png

Broker (節(jié)點(diǎn)):Kafka 服務(wù)節(jié)點(diǎn),簡(jiǎn)單來(lái)說(shuō)一個(gè) Broker 就是一臺(tái) Kafka 服務(wù)器,一個(gè)物理節(jié)點(diǎn)。

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

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

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

38d4a6f4-f628-11eb-9bcf-12bb97331649.png

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

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

直接拋結(jié)論:

多少個(gè)副本才算夠用?

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

Follower 和 Lead 之間沒(méi)有完全同步怎么辦?

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

一個(gè)節(jié)點(diǎn)宕機(jī)后 Leader 的選舉規(guī)則是什么?

分布式相關(guān)的選舉規(guī)則有很多,像 Zookeeper的 Zab 、 Raft、 Viewstamped Replication、微軟的 PacificA 等。而 Kafka 的 Leader 選舉思路很簡(jiǎn)單,基于我們上述提到的 ISR 列表,當(dāng)宕機(jī)后會(huì)從所有副本中順序查找,如果查找到的副本在ISR列表中,則當(dāng)選為L(zhǎng)eader。另外還要保證前任Leader已經(jīng)是退位狀態(tài)了,否則會(huì)出現(xiàn)腦裂情況(有兩個(gè)Leader)。怎么保證?Kafka 通過(guò)設(shè)置了一個(gè) controller 來(lái)保證只有一個(gè) Leader。

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

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

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

第一種是設(shè)為0,意思是生產(chǎn)者把消息發(fā)送出去之后,之后這消息是死是活咱就不管了,有那么點(diǎn)發(fā)后即忘的意思,說(shuō)出去的話就不負(fù)責(zé)了。不負(fù)責(zé)自然這消息就有可能丟失,那就把可用性也丟失了。

第二種是設(shè)為1,意思是生產(chǎn)者把消息發(fā)送出去之后,這消息只要順利傳達(dá)給了Leader,其他Follower有沒(méi)有同步就無(wú)所謂了。存在一種情況,Leader剛收到了消息,F(xiàn)ollower還沒(méi)來(lái)得及同步Broker就宕機(jī)了,但生產(chǎn)者已經(jīng)認(rèn)為消息發(fā)送成功了,那么此時(shí)消息就丟失了。

設(shè)為1是Kafka的默認(rèn)配置,可見(jiàn)Kafka的默認(rèn)配置也不是那么高可用,而是對(duì)高可用和高吞吐量做了權(quán)衡折中。

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

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

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

解決問(wèn)題

繞了一大圈,了解了Kafka的高可用機(jī)制,終于回到我們一開(kāi)始的問(wèn)題本身, Kafka 的一個(gè)節(jié)點(diǎn)宕機(jī)后為什么不可用?

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

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

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

問(wèn)題出在了 __consumer_offset 上, __consumer_offset 是一個(gè) Kafka 自動(dòng)創(chuàng)建的 Topic,用來(lái)存儲(chǔ)消費(fèi)者消費(fèi)的 offset (偏移量)信息,默認(rèn) Partition 數(shù)為50。而就是這個(gè)Topic,它的默認(rèn)副本數(shù)為1。如果所有的 Partition 都存在于同一臺(tái)機(jī)器上,那就是很明顯的單點(diǎn)故障了!當(dāng)將存儲(chǔ) __consumer_offset 的 Partition 的 Broker 給 Kill 后,會(huì)發(fā)現(xiàn)所有的消費(fèi)者都停止消費(fèi)了。這個(gè)問(wèn)題怎么解決?

第一點(diǎn) ,需要將 __consumer_offset 刪除,注意這個(gè)Topic時(shí)Kafka內(nèi)置的Topic,無(wú)法用命令刪除,我是通過(guò)將 logs 刪了來(lái)實(shí)現(xiàn)刪除。

第二點(diǎn) ,需要通過(guò)設(shè)置 offsets.topic.replication.factor 為3來(lái)將 __consumer_offset 的副本數(shù)改為3。通過(guò)將 __consumer_offset 也做副本冗余后來(lái)解決某個(gè)節(jié)點(diǎn)宕機(jī)后消費(fèi)者的消費(fèi)問(wèn)題。

最后,關(guān)于為什么 __consumer_offset 的 Partition 會(huì)出現(xiàn)只存儲(chǔ)在一個(gè) Broker 上而不是分布在各個(gè) Broker 上感到困惑。

作者:JanusWoo

來(lái)源:https://juejin.im/post/6874957625998606344

編輯:jq

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

    關(guān)注

    0

    文章

    38

    瀏覽量

    14732
  • HDFS
    +關(guān)注

    關(guān)注

    1

    文章

    31

    瀏覽量

    9855
  • kafka
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    5377
  • zookeeper
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    3908

原文標(biāo)題:探究Kafka高可用實(shí)現(xiàn)

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Kafka工作流程及文件存儲(chǔ)機(jī)制

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

    電機(jī)概念及分類(lèi)介紹(可下載)

    一、電機(jī)概念介紹 從廣義上講,電機(jī)是電能的變換裝置,包括旋轉(zhuǎn)電機(jī)和靜止電機(jī)。旋轉(zhuǎn)電機(jī)是根據(jù)電磁感應(yīng)原理 實(shí)現(xiàn)電能與機(jī)械能之間相互轉(zhuǎn)換的一種能量轉(zhuǎn)換裝置;靜止電機(jī)是根據(jù)電磁感應(yīng)定律和磁勢(shì)平衡原理實(shí)
    發(fā)表于 02-27 15:28 ?1次下載

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

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

    docker 部署 kafka 及 ui 搭建

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

    寶藏級(jí)微服務(wù)架構(gòu)工具合集

    寶藏級(jí)熱門(mén)微服務(wù)架構(gòu)工具包含Spring Boot、Eclipse Vert.X、Kubernetes、Tyk、RabbitMQ、Apache Kafka等。其中,Spring Boot簡(jiǎn)化了微服
    的頭像 發(fā)表于 12-21 16:33 ?584次閱讀

    超詳細(xì)“零”基礎(chǔ)kafka入門(mén)篇

    響應(yīng)數(shù)據(jù)流的實(shí)時(shí)流應(yīng)用程序 要了解Kafka如何做這些事情,讓我們深入探討Kafka的能力。 (3)首先是幾個(gè)概念
    的頭像 發(fā)表于 12-18 09:50 ?2795次閱讀
    超詳細(xì)“零”基礎(chǔ)<b class='flag-5'>kafka</b>入門(mén)篇

    OpenAI就ChatGPT宕機(jī)事件致歉

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

    晶圓制造生產(chǎn)周期時(shí)間的概念及意義

    本文介紹生產(chǎn)周期時(shí)間的概念以及其意義。 生產(chǎn)周期時(shí)間的概念 生產(chǎn)周期時(shí)間是指從生產(chǎn)原料(如硅片)進(jìn)入生產(chǎn)線,到最終產(chǎn)品(如完成制造的晶圓或芯片)從生產(chǎn)線輸出所需要的全部時(shí)間。在晶圓制造領(lǐng)域
    的頭像 發(fā)表于 11-28 11:16 ?1188次閱讀

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

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

    諧波的概念及應(yīng)用

    本文簡(jiǎn)單介紹了諧波的概念及應(yīng)用。
    的頭像 發(fā)表于 10-18 14:14 ?1210次閱讀
    諧波的<b class='flag-5'>概念及</b>應(yīng)用

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

    【摘要】 RocketMQ 5.X 專(zhuān)業(yè)版、kafka 監(jiān)控大屏、CloudPond 部署等多項(xiàng)特性,一睹為快! 華為云分布式消息服務(wù)DMS是完全托管的消息隊(duì)列服務(wù),可完全兼容業(yè)界主流的 Kafka
    的頭像 發(fā)表于 10-15 09:54 ?694次閱讀
    華為云分布式消息服務(wù) DMS 9 月新動(dòng)態(tài)上線啦!

    納尼?自建K8s集群日志收集還能通過(guò)JMQ保存到JES

    作者:京東科技 劉恩浩 一、背景 基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail負(fù)責(zé)日志收集,logstash負(fù)責(zé)對(duì)數(shù)
    的頭像 發(fā)表于 09-30 14:45 ?412次閱讀

    S參數(shù)的概念及應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《S參數(shù)的概念及應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 08-12 14:29 ?0次下載

    逆壓電效應(yīng)的概念及其特點(diǎn)

    逆壓電效應(yīng),又稱(chēng)為壓電逆效應(yīng)或電致伸縮效應(yīng),是指某些材料在受到電場(chǎng)作用時(shí),會(huì)發(fā)生形變或位移的現(xiàn)象。這種效應(yīng)在壓電材料中尤為顯著,具有廣泛的應(yīng)用價(jià)值。 一、逆壓電效應(yīng)的概念 逆壓電效應(yīng)是指在壓電材料
    的頭像 發(fā)表于 07-26 14:34 ?5620次閱讀

    繼電器電感的基本概念及分類(lèi)

    重要的影響。 一、繼電器電感的基本概念 電感的定義 電感是指導(dǎo)體在磁場(chǎng)中運(yùn)動(dòng)時(shí),由于電磁感應(yīng)作用而產(chǎn)生的電動(dòng)勢(shì)。電感的大小與導(dǎo)體的長(zhǎng)度、截面積、形狀以及磁場(chǎng)的強(qiáng)度有關(guān)。 電感的單位 電感的單位是亨利(H),常用的單位還有毫亨
    的頭像 發(fā)表于 07-24 09:41 ?1143次閱讀

    電子發(fā)燒友

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

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品