kafka架構、基本術語、消息存儲結構


1.kafka架構

kafka架構簡圖

kafka處理消息大概流程

  • 生產者發送消息給kafka服務器
  • 消費者從kafka服務器(broker)讀取消息
  • kafka服務器依靠zookeeper集群進行服務協調管理

2.kafka基本術語

  • message (消息)
    生產消費的基本單位。
    kafka消息基本構成

  • topic(主題)
    代表邏輯上的一類消息,類似於其它消息隊列中間件中的消息隊列名稱。

  • partition (分區)
    topic的下一級,kafka為了提高吞吐量和可用性,會把一類消息分成多個區存儲。topic、partition、message之間的關系如下圖:
    消息存儲結構示意圖

  • broker
    代表一個kafka服務器節點

  • offset (消息位移值)
    消息位移值一共有兩種
    a.第一種是分區內的每條消息都有一個位移值,代表每條消息在文件中的位置,offset從0到消息數量-1,就好比數組的下標。
    b.第二種相對於kafka消費端而言的offset,代表了消費端當前的讀取進度,比如消費端offset為3,代表消費者已經消費到了第四條消息。

  • replica (副本)
    kafka為了實現高可用,會對partition(分區)保存多個replica(副本),存在的唯一理由就是為了實現消息的高可靠存儲,不讓消息丟失。
    其中又分leader 副本和follower副本,follower同步leader副本,leader副本宕機時,從剩余follower副本中選出一個作為新的leader 副本,實現高可用(一個partition的多個副本一定不會在同一個broker上)。

  • ISR (in-sync replica,與leader replica保持同步的replica集合)
    kafka會為每一個partition動態維護一個replica集合,該集合中的replica存儲的所有消息日志與leader replica保持同步狀態,如果因為網絡延遲等原因部分ISR中的replica消息同步進度落后leader replica太多,則會將該replica踢出ISR,等后續追上進度時kafka再將其自動加入ISR。

3.kafka消息存儲格式

消息存儲結構示意圖

kafka partition分布圖

  • 上文提到topic是消息邏輯上的分類,類似於消息隊列的隊列名,為了解決消息的高可用和高可靠存儲問題引入了partition,將一個partition生成多個副本分散在多台節點上實現高可用。topic是邏輯上的分類,partition是物理上的副本,如圖,P1有多個副本分散在broker 1、broker 2、broker 3上,即使其中一台宕機,剩下的兩個broker依然可以提供服務(broker 2 和 broker 3的P1_follower會不斷從P1_leader進行消息同步,即使主節點宕機也能選舉出一個節點為主節點繼續服務,並保留截止到高水位的消息,高水位概念在下一篇關於kafka的高可靠存儲會提到)。

  • broker的partition還可以繼續細分為segement,每個partition在磁盤上對應着一個目錄,目錄名為topic名稱+有序序號,例如名為test的topic下創建了三個partition,三個分區在/tmp/kafka-logs下的目錄名分別為test-01、test-02、test-03。

  • 如果進入test-01目錄,會發現如下文件列表:

00000000000000000000.index 
00000000000000000000.log 
00000000000000170410.index 
00000000000000170410.log 
00000000000000239430.index 
00000000000000239430.log  

以上是segement文件列表,segement文件由索引文件(.index)和日志文件(.log)組成,大家會發現文件名是一個整數編號,20個整數數值組成,不足位數補零。第一個segement文件名從0開始,當log文件消息數量達到閾值,就會新建另一個segement文件,這個segement文件的名稱是上一個segement log文件最后一條消息的offset位移值。

kafka為什么要這樣設計segement文件?
假如我們把所有消息都存在一個文件里,查找一條offset為00000012564868789012的消息需要從頭遍歷豈不是等到黃花菜都涼了,可以看到這里用到二分查找進行優化,將需要查找的offset和segement的文件名進行二分查找就可以快速定位到我要找的消息在哪個文件里面,然后再從,index文件中獲取到消息是在.log文件的哪個位置開始,哪個位置截止,將查找的時間復雜度從O(n)變為O(logn)。
根據索引文件定位消息在log文件中的位置

partition目錄下segement文件的設計,和mysql的b+樹查找數據頁、數據頁內根據頁目錄進一步二分查找原理很相似,segement文件名相當於mysql的目錄項頁(枝干節點),而index文件相當於頁內的頁目錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM