初識kafka

Kafka目前被定位為一個分布式流式處理平臺,它以高吞吐、可持久化、可水平擴展、支持流數(shù)據(jù)處理等多種特性而被廣泛使用。其在應用中主要扮演以下三大角色:

  • 消息系統(tǒng): Kafka具備系統(tǒng)解耦、冗余在儲、流量削峰、緩沖、異步通信、擴展性、可恢復性、消息順序性保障及消息回溯的功能。
  • 存儲系統(tǒng):Kafka把消息持久化到磁盤,相比于基于內(nèi)存存儲的系統(tǒng)而言,有效
    地降低了數(shù)據(jù)丟失的風險。
  • 流式處理平臺:Kafka不僅為流式處理框架提供了可靠的數(shù)據(jù)來源,還提供了一個完整的流式處理類庫,比如窗口、連接、變換和聚合等各類操作。

1. 體系架構

kafka體系結構

整個體系結構主要包括以下三部分:

  • producer:生產(chǎn)者,負責將消息投遞到kafka中。
  • consumer:消費者,通過拉的方式獲取消息進行業(yè)務處理。
  • broker:一個獨立的Kafka服務節(jié)點或服務實例,多個broker組成kafka集群。

Kafka通過ZooKeeper來進行元數(shù)據(jù)管理,包括:集群、broker、主題和分區(qū)等。
大概的流程就是:生產(chǎn)者將消息發(fā)送給broker,broker將消息存儲到磁盤中,消費者從broker拉取并消費消息。

2. 主題和分區(qū)

主題(topic)和分區(qū)(partition)都是邏輯上的概念。一個主題可以包含多個分區(qū),一個分區(qū)只能屬于一個主題。
Kafka的消息是按照主題進行分類的,生產(chǎn)者將消息發(fā)送給指定的主題,消費者從指定的主題訂閱和消費消息。
分區(qū)在存儲層面來看其實是一個日志文件,如圖所示。

分區(qū)結構
消息不停的追加到日志文件的尾部,消息在寫入分區(qū)的時候會被分配一個偏移量(offset),這類似于數(shù)組中的下標。offset是消息在分區(qū)中的唯一標識,kafka通過它來保證分區(qū)內(nèi)消息的順序。由于offset只是作用于單partition內(nèi)部,因為kafka只能保證分區(qū)內(nèi)消息有序,而無法保證主題內(nèi)有序。另外,主題下的多個分區(qū)可以部署在多個broker上,提供比單個broker更強大的性能。
消息在發(fā)送到broker之前,會根據(jù)分區(qū)規(guī)則決定發(fā)往哪個分區(qū)。
分區(qū)規(guī)則如下:
如果消息中指定了key:分區(qū)器會對key進行哈希,最終根據(jù)哈希值計算分區(qū)號。如果未指定key:則以輪詢的方式發(fā)送到各個可用的分區(qū)。
為什么要有多個分區(qū)呢?
剛有提到,分區(qū)在存儲層面其實是一個日志文件。試想一下,如果一個主題只有一個分區(qū),那么這個文件的所在broker的I/O將會成為這個主題的性能瓶頸,而多分區(qū)則解決了這個問題。而且通過增加分區(qū)數(shù)量可實現(xiàn)水平擴展。

3. 分區(qū)可靠性保證

前面說到消息是存儲在分區(qū)中,而分區(qū)分布于不同的broker中,那么broker宕機會導致該機器上的分區(qū)不可用,kafka是如何保證可用性的呢?下面就要說下Kafka的多副本(replica)機制,Kafka通過增加副本數(shù)量提升容災能力。

  • 同一分區(qū)的不同副本中保存的是相同的消息(在同一時刻,副本之間并非完全一樣)。
  • 副本之間是一主多從”的關系,其中l(wèi)eader 副本負責處理讀寫請求,follower 副本只負責與 leader 副本的消息同步。
  • 副本處于不同的broker中,每個broker最終擁有同一分區(qū)的一個副本。當 leader 副本出現(xiàn)故障時,從follower 副本中重新選舉新的leader 副本對外提供服務。

Katka 通過多副本機制實現(xiàn)了故障的自動轉移,當Kafka 集群中某個broker 失效時仍然能保證服務可用。如圖所示,broker數(shù)量為4,副本因子為3。


image.png

消費者端也具備一定的容災能力,消費者會提交自己消費的位置到kafka,當故障恢復后,可以從上次提交的消費位置開始消費。

關于分區(qū)的幾個概念

  • AR (Assigned Replicas):分區(qū)中的所有副本。
  • ISR (In-Sync Replicas):所有與 leader 副本保持一定程度同步的副本(包括 leader 副本在內(nèi))組成,ISR 集合是 AR 集合中的一個子集。前面所說的“一定程度的同步” 是指可忍受的滯后范圍,這個范圍可以通過參數(shù)進行配置。
  • OSR (Outof-Sync Replicas):與leader 副本同步滯后過多的副本(不包括leader副本)組成。AR=ISR+OSR。

在正常情況下,所有的follower 副本都應該與 leader 副本保持一定程度的同步,即 AR=ISR,OSR 集合為空。leader副本負責維護和跟蹤ISR集合中所有follawer副本的滯后狀態(tài),當 follower 副本落后大多或失效時,leader副本會把它從ISR 集合中剔除。如果 OSR 集合中有follover 副本“追上”leader 副本,那么leader副本會把它從 OSR 集合轉移至 ISR 集合。默認情況下,當 leader 副發(fā)生故障時,只有在 ISR 集合中的副本才有資格被選舉為新的leader,而在 OSR 集合中的副沒有任何機會(不過這個原則也可以通過修改相應的參數(shù)配置來改變)。

  • HW 是 Figh Watermark 的縮寫,俗稱高水位,它標識了一個特定的消息偏移量 (oftset),消費者只能拉取到這個 ofset 之前的消息。
  • LEO 是 Log End Offset 的縮寫,它標識當前日志文件中下一條待寫入消息的 offset,LEO 的大小相當于當前日志分區(qū)中最后一條消息的 ofset 值加 1。分區(qū) ISR 集合中的每個副本都會維護自身的LEO,而 ISR 集合中最小的 LEO即為分區(qū)的 HW,對消費者而言只能消費 HW 之前的消息。舉例如下:


    image.png

    假設ISR中有3個副本,1個leader和2個follower,此時分區(qū)的HW和LEO都是3。此時生產(chǎn)者發(fā)送了消息3和4,優(yōu)先寫入leader副本。由于不同follower副本同步效率不同,此時follower1已同步到了消息3和4,LEO是5;而follower2只同步了消息3,LEO是4,所以整個分區(qū)的HW取所有副本最小的LEO=4,因此此時消費者只能消費到4之前的消息,即0、1、2和3。

結束語

本篇主要介紹了Kafka的中一些而基本概念,對其實現(xiàn)沒有做深究,主要還是根據(jù)書中的順序來寫,沒怎么加自己的理解。后面會嘗試從《一條消息的一生》這個角度來總結消息生產(chǎn)和消費的過程,以及其中的可靠性是如何保證的。

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

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

  • Kafka介紹 Kafka是LinkedIn采用scala開發(fā)的一個多分區(qū), 多副本并且基于ZooKeeper協(xié)調(diào)...
    xiaogp閱讀 203評論 0 1
  • [TOC]Kafka起初是由 Linkedin公司采用 Scala語言開發(fā)的一個多分區(qū)、多副本且基于 ZooKee...
    tracy_668閱讀 598評論 0 7
  • 閱讀以下內(nèi)容你將了解到:1.什么是Kafka2.為什么要使用 Kafka,為什么要使用消息隊列3.Kafka中的基...
    就這些嗎閱讀 338評論 0 0
  • 消息引擎系統(tǒng) 需要考慮的兩個重要因素: 消息設計 傳輸協(xié)議設計 消息設計 一天消息要有能夠完整清晰表達業(yè)務的能力。...
    一笑奈何_abe4閱讀 676評論 0 0
  • Kafka 已經(jīng)定位為一個分布式流式處理平臺,它以高吞吐、可持久化、可水平擴展、支持流數(shù)據(jù)處理等多種特性而被廣泛使...
    向夢而來閱讀 259評論 0 0

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