1. 程式人生 > >kafka-理論

kafka-理論

https://blog.csdn.net/congcong68/article/details/71915679

http://blog.jbomo.com/articles/2018/02/26/1519630193390.html

Kafka官方介紹:Kafka是一個分散式的流處理平臺(0.10.x版本),在kafka0.8.x版本的時候,kafka主要是作為一個分散式的、可分割槽的、具有副本數的日誌服務系統(Kafka™ is a distributed, partitioned, replicated commit log service), 具有高水平擴充套件性、高容錯性、訪問速度快、分散式等特性;主要應用場景是:日誌收集系統和訊息系統。

資料在Kafka上的分佈簡單描述圖。

 

一個流處理平臺具有三個關鍵能力:

·釋出和訂閱訊息(流),在這方面,它類似於一個訊息佇列或企業訊息系統。

·以容錯的方式儲存訊息(流)。

·在訊息流發生時處理它們。

2. 核心要點

1) kakfa的優勢

應用於2大類應用

·構建實時的流資料管道,可靠地獲取系統和應用程式之間的資料。

·構建實時流的應用程式,對資料流進行轉換或反應。

2) 要點

·kafka作為一個叢集執行在一個或多個伺服器上。

·kafka叢集儲存的訊息是以topic為類別記錄的。

·每個訊息(也叫記錄record,我習慣叫訊息)是由一個key,一個value和時間戳構成。

3) 四個核心API

·應用程式使用 Producer API 釋出訊息到1個或多個topic(主題)。

·應用程式使用 Consumer API 來訂閱一個或多個topic,並處理產生的訊息。

·應用程式使用 Streams API 充當一個流處理器,從1個或多個topic消費輸入流,並生產一個輸出流到1個或多個輸出topic,有效地將輸入流轉換到輸出流。

·Connector API允許構建或執行可重複使用的生產者或消費者,將topic連線到現有的應用程式或資料系統。例如,一個關係資料庫的聯結器可捕獲每一個變化。

 

Client和Server之間的通訊,是通過一條簡單、高效能並且和開發語言無關的TCP協議。除了Java Client外,還有非常多的其它程式語言的Client

 

 

3. 基本術語

1) Message(訊息)

傳遞的資料物件,主要由四部分構成:offset(偏移量)、key、value、timestamp(插入時間); 其中offset和timestamp在kafka叢集中產生,key/value在producer傳送資料的時候產生。

2) Topic(主題)

Kafka將訊息種子(Feed)分門別類,每一類的訊息稱之為一個主題(Topic).

3) Partition(分割槽)

具體維護Kafka上的訊息資料的最小單位,一個Topic可以包含多個分割槽;Partition特性:ordered & immutable。(在資料的產生和消費過程中,不需要關注資料具體儲存的Partition在那個Broker上,只需要指定Topic即可,由Kafka負責將資料和對應的Partition關聯上)

Producer(生產者):負責將資料傳送到Kafka對應Topic的程序

4) Producer(生產者)

釋出訊息的物件稱之為主題生產者(Kafka topic producer)

5) Consumer(消費者)

訂閱訊息並處理髮布的訊息的種子的物件稱之為主題消費者(consumers)

6) Consumer Group(消費者組)

每個consumer都屬於一個特定的group組,一個group組可以包含多個consumer,但一個組中只會有一個consumer消費資料。

 

7) Broker(代理)

已釋出的訊息儲存在一組伺服器中,稱之為Kafka叢集。叢集中的每一個伺服器都是一個代理(Broker). 消費者可以訂閱一個或多個主題(topic),並從Broker拉資料,從而消費這些已釋出的訊息。

 

 

二、Broker                                                                                                              
       Kafka 叢集包含一個或者多個伺服器,每個伺服器都會標示為Broker。

     通過Server.properties中的broker.id 標識的。訊息都會儲存在這上面的。所以Broker數量(伺服器)越多,叢集的吞吐率就越高。

二、Topics and Logs                                                                                             
        不同的 producer生產的不同類的消費,Kafka通過Topics 區分不同類的訊息,不同的Topics 的訊息是分開儲存的,儲存在不同的Broker,每個Topics還可以進行分割槽儲存(partition),分割槽數量可以一個或者多個組成的,在Server.properties配置log.dirs(kafka持久化資料儲存的路徑)資料目錄下有對應的topic_name-partition_id檔案

 

 1)訊息被append到對應的partition中,每個partition的訊息是有順序的,Partition中的每條Message由offset來表示它在這個partition中的偏移量,這個offset不是該Message在partition資料檔案中的實際儲存位置,offset是partition中Message的id,partition是分段的,每個段叫LogSegment,包括了一個數據檔案和一個索引檔案。

          2) Kafka中Topics的訊息,預設保留2天,兩天過後會被刪除,可以通過Server.properties配置log.retention.{ms,minutes,hours},也可以配置訊息達到多大時被刪除(log.retention.check.interval.ms)。預設保留2天,在這2天裡,訊息有沒有被消費者消費,這個訊息都存在,即使被消費了,這個訊息也還是存在的,可以更改offset,重新消費訊息。

       3)Kafka中Topic的儲存訊息,可以是分割槽的,並分散式的儲存在不同的Broker上,Kafka的吞吐率可以水平擴充套件。

    4)Producer 和Consumer分開的處理,解耦
 

三、Producer 釋出                                                    
 

   Producer 將訊息釋出到指定的Topic中。

     1)Topic多個分割槽時,訊息根據SimplePartitioner的規則,採用hashcode的做模運算,把訊息儲存到對應的分割槽。

        2)可以指定相同的key,傳送到相同的分割槽,並保證訊息有順序性。

 

四、Consumer                                                                                                         
        訊息者,每個consumer屬於一個特定的consuer group(消費者組),如果一個消費者不指定group,則預設一個group,同一個topic的一個訊息只能被同一個consuer group內的一個consuer 消費,但多個consuer group可同時訊息同一個訊息。consuer 在消費訊息時,儲存了offset,會記錄在zookeeper上,順序的讀取時offset會增大。

 

五、Replication                                                                                                        
           每個partition有對應的leader,leader負責了訊息的讀寫操作,leader分佈在broker。

      我們在建立Topics時會指定每個partition的副本數(default.replication.factor 配置),一個訊息leader 和follower都有儲存才算成功,leader如果掛了,Kafka保證讀寫可靠性,採用了ISR(in-sync replicas),新的Leader從ISR中選舉出來,ISR所有副本能夠及時的複製Leader日誌的節點,follower如果採用同步複製,follower都複製完這條訊息才會commit,極大的影響了Kafka的吞吐率,Kafka採用了非同步的批量的複製Leader日誌,每個partition保Leader計算每個副本和它相對落後的數量和在規定時間內不會向Leader獲取訊息的會更新ISR並移除這些follower:

      1)request.required.acks (0:代表不需要任何確認; 1:代表需要leader replica確認 ;-1:代表需要ISR中所有進行確的。

      2)replica.lag.max.messages:數量  只要follower相對Leader落後的數量,就會從ISR移除。

      3)replica.lag.time.max.ms:時間  規定時間內不會向Leader獲取訊息就會從ISR移除。