kafka原理篇


消息隊列分類

點對點

消息生產者生產消息發送到queue中,然后消息消費者從queue中取出並且消費消息。這里要注意:

  • 消息被消費以后,queue中不再有存儲,所以消息消費者不可能消費到已經被消費的消息。
  • Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。

發布/訂閱

消息生產者(發布)將消息發布到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不同,發布到topic的消息會被所有訂閱者消費。

kafka介紹

kafka是一個分布式的、分區的、多副本的、多訂閱者的日志系統(分布式消息隊列)。可同時支持點對點模式的消息隊列和發布/訂閱模式的消息隊列。

kafka架構說明

kafka

kafka角色術語:

  • Broker:一台kafka服務器就是一個broker。一個集群由多個broker組成
  • Topic:消息隊列,不同的消息會被發送至不同的隊列當中
  • Producer:消息生產者,就是向kafka broker發消息的客戶端
  • Consumer:消息消費者,從kafka broker取消息的客戶端
  • Consumer Group(CG):這是kafka用於實現一個topic消息廣播(發給所有的consumer)和單播(發給某一個consumer)的手段。一個topic可以有多個CG,topic的每一條消息都會發送給每個CG,但CG只會把消息發送給該CG中的一個consumer。如果需要實現廣播,只要將每個consumer配置一個獨立的CG即可。而要實現單播則只要將所有的consumer放至同一個CG即可。用CG還可以將consumer進行自由的分組而不需要producer多次發送消息到不同的topic
  • Partition:Partition是物理上的概念。為了實現擴展性,一個非常大的topic可以分布到多個broker上,一個topic可以分為多個partition,每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。kafka只保證按一個partition的順序將消息發給consumer,不保證一個topic的整體順序
  • Offset:kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例如你想找2049的位置,只要找到2048.kafka文件即可。第一個位置為00000000000.kafka

kafka特性:

  • 提供數據持久化,消息順序寫入磁盤,提升機械盤的讀寫性能
  • 高吞吐量:即使是非常普通的硬件kafka也可以支持每秒數十萬的消息
  • 通過多副本的方式防止消息丟失
  • 支持消息的同步和異步發送
  • 消費狀態保存在客戶端
  • 數據遷移、擴容對用戶透明
  • 定期刪除機制,支持設定partitions的segment file保留時間。

kafka支持消息持久化存儲,持久化數據保存在kafka的日志文件中,在生產者生產消息后,kafka不會直接把消息傳遞給消費者,而是先要在broker中進行存儲,為了減少磁盤的寫入次數,broker會將消息暫時緩存起來,當消息的個數或尺寸、大小達到一定閾值時,再統一寫到磁盤上。通過這種方式以提高kafka的執行效率,並減少磁盤IO的調用次數。kafka中的每條消息寫到partition中,是順序寫入磁盤的,這可進一步保證寫入效率。

Topic與Partition的關系

Kafka中的topic是以partition的形式存放的,每個topic都可以設置它的partition數量,推薦partition的數量要大於同時運行的consumer的數量,也建議partition的數量大於集群broker的數量,這樣消息數據就可以均勻的分布在各個broker中。

在存儲結構上,每個partition在物理上對應一個文件夾,該文件夾下存儲這個partition的所有消息和索引文件。parition命名規則為topic名稱+序號,每一個partition序號從0開始,序號最大值為partitions數量減1。

每個partition中有多個大小相等的segment數據文件,每個segment的大小是相同的,但每個消息的大小可能不同,因此segment數據文件中消息的數量可能不相等。segement數據文件有兩部分組成,分別為index file和data file,此兩個文件是一一對應,對成出現,后綴分別為".index"和".log"。

每個patition有自己的replica,每個replica分布在不同的broker節點上,多個partition需要選舉出leader partition,leader負責讀寫,並由zk負責fil over。

一個Topic配置多個patition可以將消息內容分散存放到多個broker上,這樣就可以避免文件尺寸達到單機磁盤的上限,同時還可以保證消息存儲、消費的效率,因為更多的patitions可以容納更多的consumer,可有效提升kafka的吞吐率。

partition復制機制

  • 在kafka中,復制策略是基於partition,而不是topic。kafka將每個partition數據復制到多個server上,任何一個partition有一個leader和0到多個follower,副本的數量可以通過broker配置文件定義。
  • leader處理所有的讀寫請求,follower需要與leader保持同步。Follower就像一個consumer,消費消息並保存至本地日志中。leader負責跟蹤所有的follower狀態,如果follower落后太多或者失效,leader將會把它從同步列表中刪除。它會繼續從leader從獲取數據,直至數據足夠新,然后再次加入到同步列表當中。
  • kafka不會更換replicas宿主,因為同步列表中的replicas需要足夠快,才能保證producer發布消息時接受到ACK的延遲較小。
  • 當所有follower都將一條消息保存成功,此消息才被認為是"committed",那么此時consumer才能消費它,這種同步策略要求follower和leader之間必須具有良好的網絡環境。
  • 即使只有一個replica實例存活,仍然可以保證消息的正常發送和接收,只要zk存活即可(這一點相較於其它分布式存儲要求多數存活的方式不同)。
  • 當leader失效時,需要在follower當中選取新的leader。kafka中leader的選舉並沒有采用多數投票的算法。因為這種算法對於網絡穩定性、投票者的數量等條件有要求。對於kafka而言,每個partition中所有的replicas信息都可以在zk中獲得,因此選取leader對它來講是一件很容易的事情。

Consumer與Topic的關系

kafka作為分布式的消息系統支持多個producer和多個consumer,producer可以將消息分布到集群中不同節點的不同patition上,consumer也可以消費多個節點上的多個patition。在寫消息時允許多個producer寫到同一個partition中,但是讀消息時,一個partition只允許被一個consumer group中的一個consumer所消費。而一個consumer可以消費多個patition。也就是說同一個consumer group下的consumer對partition是互斥的,而不同consumer group之間則是共享的。

通常情況下,一個group中會包含多個consumer,這樣不僅可以提高topic中消息的並發消費能力,而且還能提高"故障容錯"性,如果group中的某個consumer失效,那么其消費的partitions將會有其他consumer自動接管。而對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味着某些consumer將無法得到消息


免責聲明!

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



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