kafka系列之kafka概述

kafka概述

Apache Kafka 是一個快速、可擴展的、高吞吐的、可容錯的分佈式“發佈-訂閱”消息系統,
使用 Scala 與 Java 語言編寫,能夠將消息從一個端點傳遞到另一個端點,較之傳統的消息中
間件(例如 ActiveMQ、RabbitMQ),Kafka 具有高吞吐量、內置分區、支持消息副本和高容
錯的特性,非常適合大規模消息處理應用程序。
Kafka 官網: http://kafka.apache.org/

kafka系統架構

在這裏插入圖片描述
kafka幾個特性中可擴展的、可容錯都是因爲kafka架構中有zookeeper參與的原因。

應用場景

Kafka 的應用場景很多,這裏就舉幾個最常見的場景。

  • 消息系統 Messaging
  • Web 站點活動追蹤 Website Activity Tracking
  • 數據監控 Metrics
  • 日誌聚合 Log Aggregation
  • 流處理 Stream Processiong

kafka 高吞吐率實現

Kafka 與其它 MQ 相比,其最大的特點就是高吞吐率。爲了增加存儲能力,Kafka 將所有的消息都寫入到了低速大容的硬盤。按理說,這將導致性能損失,但實際上,kafka 仍可保持超高的吞吐率,性能並未受到影響。其主要採用瞭如下的方式實現了高吞吐率。

  • 順序讀寫:Kafka 將消息寫入到了分區 partition 中,而分區中消息是順序讀寫的。順序讀寫要遠快於隨機讀寫。
  • 零拷貝:生產者、消費者對於 kafka 中消息的操作是採用零拷貝實現的。
  • 批量發送:Kafka 允許使用批量消息發送模式。
  • 消息壓縮:Kafka 支持對消息集合進行壓縮。

名詞解釋

topic(主題)

topic是一個邏輯上的概念,代表着一個消息主題,消費者訂閱不同的主題來進行消費,在邏輯上給一個消息進行分類。

partition(分區)

partition是物理上的一個概念,代表着消息存放的物理上的一個分區,體現在/kafka_logs文件夾中命名爲topic-分區編號。如topic名爲test的第一個分區爲test-0文件夾。
在kafka中,單個partition是kafka並行操作的最小單元。

partition的分佈

partition在各個broker中是均勻分佈的,前提是partition數量是broker的倍數。如果小於或者不是倍數,就會導致各個broker的壓力不均。

partition數量

在資源足夠的情況下,partition越多速度越快。但是隨着partition的數量增多,會出現下面問題。

  • 越多的分區需要打開更多的文件句柄
  • 更多的分區會導致端對端的延遲
  • 越多的partition意味着需要更多的內存
  • 越多的partition會導致更長時間的恢復期

segment

segment 是一個邏輯概念,其由兩類物理文件組成,分別爲“.index”文件和“.log”文件。“.log”文件中存放的是消息,而“.index”文件中存放的是“.log”文件中消息的索引。每一個segment大小最大值是相同的,但是大小是不同的。
在這裏插入圖片描述

segment 文件命名規則

segment文件爲20位長的前補0的數字,代表着創建該文件時,topic已經存儲的消息數量。
舉個例子,topic剛創建之後可以ll查看一下,是00000000000000000000.log,
當已經存儲180條數據,再插入第181條時發現要超過最大值放不下了,這是就會創建下一個segment,命名爲00000000000000000180.log
再把這第181條數據放在00000000000000000180.log中,index文件中寫入,offset是0,地址是指向剛纔00000000000000000180.log文件中的數據。

segment中消息查找的過程

例如讀取offset=368776的message,需要通過下面2個步驟查找。

第一步查找segment file

上述圖2爲例,其中00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0.第二個文件00000000000000368769.index的消息量起始偏移量爲368770 = 368769 + 1.同樣,第三個文件00000000000000737337.index的起始偏移量爲737338=737337 + 1,其他後續文件依次類推,以起始偏移量命名並排序這些文件,只要根據offset 二分查找文件列表,就可以快速定位到具體文件。

當offset=368776時定位到00000000000000368769.index|log

第二步通過segment file查找message

通過第一步定位到segment file,當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和 00000000000000368769.log的物理偏移地址,然後再通過00000000000000368769.log順序查找直到 offset=368776爲止。

從上述圖3可知這樣做的優點,segment index file採取稀疏索引存儲方式,它減少索引文件大小,通過mmap可以直接內存操作,稀疏索引爲數據文件的每個對應message設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來需要消耗更多的時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章