舔一舔 · 肌霸Kafka

目錄

1、關(guān)于Kafka你知道這些術(shù)語么?

2、Kafka如何存儲數(shù)據(jù)?

3、kafka撲街了,如何保證高可用?

4、Kafka如何做到數(shù)據(jù)不丟失?

又是煙雨蒙蒙的冬日,一杯暖茶,春天的氣息已經(jīng)在杯中裊裊升起的熱氣里蕩漾開來,茶醇使人醉,技術(shù)要學(xué)會。我們來簡單剖析一下kafka的一些原理特性。

1、關(guān)于Kafka,你知道這些術(shù)語嗎?

Kafka在消息處理領(lǐng)域能獨步天下,自然離不開他優(yōu)良的架構(gòu)設(shè)計,我們先來看看在Kafka的領(lǐng)域里有哪些組件和概念,下面是一些枯燥的名詞解釋,如果已經(jīng)掌握,可以幫忙看看是否正確解釋了。

Topic,顧名思義,主題的意思??梢岳斫鉃槭菍δ骋活愋偷南⒌臉俗R,kafka處理的消息集按照Topic分類,相當(dāng)于邏輯上的一個消息消息集合。

Partition,分區(qū),數(shù)據(jù)分區(qū),數(shù)據(jù)分片,這是物理存儲上的分組,每一個Topic可能對應(yīng)多個分片,比如Topic為Order的消息需要存放5TB的數(shù)據(jù)到磁盤,如果分配5個Partition,每個partition就是1TB的數(shù)據(jù)。

一直在說kafka是分布式,高可靠的消息系統(tǒng),那么這里就有所體現(xiàn),多個Partition可以分散在不同的服務(wù)器上,將數(shù)據(jù)存儲到不同服務(wù)器的磁盤上。

Broker,Kafka是可以分布式部署集群,集群中多臺服務(wù)器,每臺部署一個Kafka進程,這個Kafka進程就稱之為Broker。

Message,消息,Kafka世界里的通信的基本單位,生產(chǎn)者和消費者基于Topic進行消息的流轉(zhuǎn)。

Producers,消息或者數(shù)據(jù)的生產(chǎn)者,可以選擇向Kafka的某個主題的某個分區(qū)發(fā)送消息。

Consumers,消息或者數(shù)據(jù)的消費者,可以從多個topics接受并處理消息,一個topic的數(shù)據(jù)可以被多個Consumer接收處理。



這圖中大概畫了幾個組件的樣子,簡單的說他們之間的關(guān)系:一個Broker是一個Kafka進程,一個Broker有多個Topic,一個Topic可能有多個分區(qū)的。

02? Kafka如何存儲數(shù)據(jù)?

我們知道Kafka是基于磁盤持久化存儲的高可靠的消息系統(tǒng)。每次往一個Topic寫入一條消息,就會定位到一個Partition上,相當(dāng)于是寫到磁盤上的一個日志文件,并且將消息追加寫入到日志文件中。

消息會被封裝到一個log entry,每一個日志條目都包含一個offset,消息大小和消息內(nèi)容。offset是有序的,代表了在日志文件中的順序,是唯一標記此消息的標識。Kafka是基于NIO的ByteBuffer來進行序列化成二進制進行存儲,這樣子也是最大化的保證存儲的緊湊,節(jié)省磁盤的空間。

而Kafka的消息結(jié)構(gòu)設(shè)計也隨著版本的升級,有很多變化,正是因為對消息結(jié)構(gòu)的優(yōu)良設(shè)計,從而做到了存儲緊湊,節(jié)省磁盤的存儲空間。消息的格式是這樣子滴:

消息格式設(shè)計的演變,也可以看出,通過引入RecordBatch,加上字段可變長度的消息體來節(jié)省磁盤空間,提高序列化的速度。V2版本里面時間戳增量,offset的增量也通過使用增量差值來節(jié)省存儲的字節(jié)數(shù)。

上面也說了,每次消息發(fā)送到kafka,就會根據(jù)一定規(guī)則路由到某個Partition,并追加到磁盤的某個人日志文件的偏移量為offset的位置。

可以從圖中看出,每一個Topic都是分散存儲的,也就是多個Partition,在分布式集群部署下,TB級別數(shù)據(jù)實現(xiàn)擴容存儲,分布式存儲。

03 Kafka撲街了,如何保證高可用?

此時,如果kafka宕機了,從我們前面一直分析的來說,那我們將會丟失一個Topic下的某個Partition里的數(shù)據(jù),這個問題就很嚴重了,數(shù)據(jù)丟失一向是架構(gòu)設(shè)計里很重視的一個問題。所以Kafka是對所有的Partition做了多副本冗余的。

并且,將每個Partition的副本都是放到其他機器上,假設(shè)一個Partition有三個副本,kafka還會借助zookeeper選舉出一個leader Partition,這個leader partition就是這個partition負責(zé)對外提供讀寫的服務(wù)。其他的follower partition 會定時同步數(shù)據(jù)。



假設(shè)此時leader ?partition宕機了,zookeeper會感知到,并且會在kafka集群選舉出新的leader partition提供服務(wù),新的leader partition擁有之前同步到的所有數(shù)據(jù),通過這樣的多副本冗余機制加上主從模式,宕機選主,就可以實現(xiàn)高可用啦。

04 kafka如何做到數(shù)據(jù)不丟失?

通過多副本冗余機制,我們可以實現(xiàn)高可用性,但是細思一番,上文中有這樣一種場景,假如leader所在進程宕機了,此時數(shù)據(jù)還沒有被follower同步,那么當(dāng)follower選舉成leader之后,此處就會丟失部分沒有同步到的數(shù)據(jù),這樣子真是蛋疼了。

這里我們關(guān)注一個新的名字?ISR (in sync replicas),副本同步隊列。每一個leader都維護一份ISR列表,列表中存放的是當(dāng)前所有和leader partition 數(shù)據(jù)同步,保持一致的follower partition。

kafka要保證數(shù)據(jù)不丟失,那么每一個leader的ISR列表中必須至少要存在一個follower partition,那么當(dāng)kafka寫入數(shù)據(jù)的時候,必須是確保復(fù)制給了所有的ISR列表中的所有的follower partition,這樣才能算寫入成功。由此,就能保證數(shù)據(jù)不會在重新選主的時候丟失部分數(shù)據(jù)。

05 還有很多很多要去研究

Kafka是一款很優(yōu)秀,很值得學(xué)習(xí)的工業(yè)級消息中間件,本文只是淺談了他的一些基礎(chǔ)概念和原理,還需要花費很多時間去研讀他,文中有出現(xiàn)錯誤,歡迎小伙伴指正。謝謝大家。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容