kafka基本原理概述——patition與replication分配


 

 

kafka一直在大數據中承受着數據的壓力也扮演着對數據維護轉換的角色,下面重點介紹kafka大致組成及其partition副本的分配原則:

 

文章參考: http://www.linkedkeeper.com/detail/blog.action?bid=1016

 

Kafka是最初由Linkedin公司開發,是一個分布式、分區的、多副本的、多訂閱者,基於zookeeper協調的分布式日志系統(也可以當做MQ系統),常見可以用於web/nginx日志、訪問日志,消息服務等等,Linkedin於2010年貢獻給了Apache基金會並成為頂級開源項目。

 

Kafka主要設計目標如下:

  • 以時間復雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數據也能保證常數時間的訪問性能。

  • 高吞吐率。即使在非常廉價的商用機器上也能做到單機支持每秒100K條(也就是100000條——十萬)消息的傳輸。

  • 支持Kafka Server間的消息分區,及分布式消費,同時保證每個partition內的消息順序傳輸。

  • 同時支持離線數據處理和實時數據處理。

 

Kafka專用術語:

  • Broker:消息中間件處理結點,一個Kafka節點就是一個broker,多個broker可以組成一個Kafka集群。

  • Topic:一類消息,Kafka集群能夠同時負責多個topic的分發。

  • Partition:topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的隊列。

  • Segment:partition物理上由多個segment組成。

  • offset:每個partition都由一系列有序的、不可變的消息組成,這些消息被連續的追加到partition中。partition中的每個消息都有一個連續的序列號叫做offset,用於partition唯一標識一條消息

 

topic & partition

  在Kafka文件存儲中,同一個topic下有多個不同partition,每個partition為一個目錄,partiton命名規則為topic名稱+有序序號,第一個partiton序號從0開始,序號最大值為partitions數量減1。

  這里也就是broker——>topic——>partition——>segment 

  segment file組成:由2大部分組成,分別為index file和data file,此2個文件一一對應,成對出現,后綴".index"和“.log”分別表示為segment索引文件、數據文件。

  

  segment文件命名規則:partion全局的第一個segment從0開始,后續每個segment文件名為上一個segment文件最后一條消息的offset值。數值最大為64位long大小,19位數字字符長度,沒有數字用0填充。

  segment中index與data file對應關系物理結構如下:

        

  索引文件存儲大量元數據,數據文件存儲大量消息,索引文件中元數據指向對應數據文件中message的物理偏移地址。

  其中以索引文件中元數據3,497為例,依次在數據文件中表示第3個message(在全局partiton表示第368772個message),以及該消息的物理偏移地址為497。

  

副本(replication)策略 

    1.數據同步

    kafka 0.8后提供了Replication機制來保證Broker的failover。

    引入Replication之后,同一個Partition可能會有多個Replica,而這時需要在這些Replication之間選出一個Leader,Producer和Consumer只與這個Leader交互,其它Replica作為Follower從Leader中復制數據。

  2.副本放置策略  

    Kafka分配Replica的算法如下(注意!!! 下面的broker、partition副本數這些編號都是從0開始編號的):

      將所有存活的N個Brokers和待分配的Partition排序

      將第i個Partition分配到第(i mod n)個Broker上,這個Partition的第一個Replica存在於這個分配的Broker上,並且會作為partition的優先副本( 這里就基本說明了一個topic的partition在集群上的大致分布情況 )

      將第i個Partition的第j個Replica分配到第((i + j) mod n)個Broker上

      假設集群一共有4個brokers,一個topic有4個partition,每個Partition有3個副本。下圖是每個Broker上的副本分配情況。

             

 

 

對於Kafka而言,定義一個Broker是否“活着”包含兩個條件:

  • 一是它必須維護與ZooKeeper的session(這個通過ZooKeeper的Heartbeat機制來實現)。

  • 二是Follower必須能夠及時將Leader的消息復制過來,不能“落后太多”。

 

重點在於kafka中partition的副本放置算法,同時間接說明了一個topic的partition在集群中的分配情況...

 


免責聲明!

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



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