Kafka 概述

Kafka架構

  • Broker:Kafka集群包含一個或多個服務器,這種服務器被稱為broker
  • Topic:每條發布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存于一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存于何處)
  • Partition:Partition(分片)是物理上的概念,每個Topic包含一個或多個Partition,創建topic時可指定parition數量。每個partition對應于一個文件夾,該文件夾下存儲該partition的數據和索引文件。
  • Producer:負責發布消息到Kafka broker
  • Consumer:消息消費者,向kafka broker讀取消息的客戶端。每個consumer屬于一個特定的consuer group(可為每個consumer指定group name,若不指定group name則屬于默認的group)。使用consumer high level API時,同一topic的一條消息只能被同一個consumer group內的一個consumer消費,但多個consumer group可同時消費這一消息。
  • Consumer Group:每個Consumer屬于一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬于默認的group)。

Kafka拓撲結構:

kafka-tupe-20170213.png

Kafka的Topic & Partition

Topic在邏輯上可以被認為是一個queue,每條消費都必須指定它的Topic,可以簡單理解為必須指明把這條消息放進哪個queue里。

消息發送時都被發送到一個topic,其本質就是一個目錄,而topic是由一些Partition Logs(分區日志)組成,其組織結構如下圖所示:

kafka_log_anatomy_20170213.png

因為每條消息都被append到該Partition中,屬于順序寫磁盤,因此效率非常高(經驗證,順序寫磁盤效率比隨機寫內存還要高,這是Kafka高吞吐率的一個很重要的保證)。

Kafka 分區機制

Kafka中可以將Topic從物理上劃分成一個或多個分區(Partition),每個分區在物理上對應一個文件夾,以“topicName_partitionIndex”的命名方式命名,該文件夾下存儲這個分區的所有消息(.log)索引文件(.index),這使得Kafka的吞吐率可以水平擴展。
生產者在生產數據的時候,可以為每條消息指定Key,這樣消息被發送到broker時,會根據分區規則選擇被存儲到哪一個分區中,如果分區規則設置的合理,那么所有的消息會將被均分的分布到不同的分區中,這樣就實現了負載均衡和水平擴展。另外,在消費端,同一個消費組可以多線程并發的從多個分區中同時消費數據。
默認kakfa.producer.Partitioner接口的類

class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner {
  def partition(key: Any, numPartitions: Int): Int = {
    Utils.abs(key.hashCode) % numPartitions
  }
}

Consumer Group

Kafka用來實現一個Topic消息的廣播(發給所有的Consumer)和單播(發給某一個Consumer)的手段。一個Topic可以對應多個Consumer Group。

  • 單播:所有Consumer在同一個Croup里
  • 廣播:每個Consumer有一個獨立的Group

使用Consumer high level API時,同一Topic的一條消息只能被同一個Consumer Group內的一個Consumer消費,但多個Consumer Group可同時消費這一消息。

producer

Producer發送消息到broker時,會根據Paritition機制選擇將其存儲到哪一個Partition。
producer 寫入消息序列圖:

kafka-producer-20170213.png.png

流程說明:

1. producer 先從 zookeeper 的 "/brokers/.../state" 節點找到該 partition 的 leader
2. producer 將消息發送給該 leader
3. leader 將消息寫入本地 log
4. followers 從 leader pull 消息,寫入本地 log 后 leader 發送 ACK
5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 發送 ACK

Kafka Shell

啟動:

 ./kafka-server-start.sh ../config/server.properties > /dev/null &

查看topic:

./kafka-topics.sh --zookeeper 10.211.55.5:2181 --list

創建topic:

./kafka-topics.sh --create --zookeeper 10.211.55.5:2181 --replication-factor 2 --partitions 1 --topic testYanY
#  replication-factor 副本參數
#  partitions 分區參數

刪除topic:

./kafka-topic.sh --zookeeper 10.211.55.5:2181 --topic  testYanY --delete

消費者:

./kafka-console-consumer.sh --zookeeper 10.211.55.5:2181 --topic testYanY --from-beginning

生產者:

./kafka-console-producer.sh --broker-list 10.211.55.5:9092 --topic testYanY
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容