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的Topic & Partition
Topic在邏輯上可以被認為是一個queue,每條消費都必須指定它的Topic,可以簡單理解為必須指明把這條消息放進哪個queue里。
消息發送時都被發送到一個topic,其本質就是一個目錄,而topic是由一些Partition Logs(分區日志)組成,其組織結構如下圖所示:
因為每條消息都被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 寫入消息序列圖:
流程說明:
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