上一篇Kakfa學習筆記(三)——Java API發送消費消息算法
這篇打算簡單說一下Kafka的工做流程,加深對Kafka的理解shell
以前說過,一個topic有多個partition,實際上消息劃分的最小單位是partition,每一個partition都有多個replicate(副本,通常說副本也包含主副本)。一條消息從producer發出,落到一個broker上的partition,最後consumer拉取消息apache
每一個partition都有一個leader(主副本),零個或多個follower(從副本)。每一個leader和follower都是一個broker。Kafka會把全部partition的leader平均分配到broker上,全部的讀寫都只由leader來完成,follower只從leader同步消息,並不對外服務。bootstrap
看一下這個圖加強理解緩存
producer怎麼知道某個partition的leader是誰呢?咱們在配置producer的時候是須要配置一個broker列表的——參數bootstrap.servers
。咱們會告訴producer幾個broker,producer會向其中一個broker拉取全部partition的leader列表,而後緩存起來,這樣broker就能夠直接向leader發送消息bash
以前咱們說過,一個partition內的消息是有序的。這是由於producer經過本身的partition算法算出一條消息應該落到哪一個partition,而後找出這個partition的leader(broker),直接把消息發給這個broker,而訂閱這個partition的consumer只有一個,因此就保證了partition內的消息有序。post
以前在概述說過,Kafka自己也是一個存儲系統,broker收到消息是會持久化到磁盤的,這裏就結合分區來了解一下Kafka的持久化學習
首先咱們仍是起3個broker,而後建立一個分區數3,副本數3的topic優化
> bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test
複製代碼
來看一下這個topic的狀況ui
> bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
Topic:test PartitionCount:3 ReplicationFactor:3 Configs:segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
Topic: test Partition: 1 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
Topic: test Partition: 2 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
複製代碼
如咱們預期同樣,三個分區,三個leader,均攤到三個broker上,而且副本也是3個
咱們在配置文件裏設置了log.dirs
,這個參數指定了Kafka日誌(Kafka消息數據是以日誌形式落盤)存放位置。按照topic-partition
的格式,把數據放到不一樣的文件夾裏面,例如咱們上面test主題,三個分區,在log.dirs
裏能夠看到
> ls
test-0
test-1
test-2
複製代碼
這些日誌文件就是消息持久化到磁盤的載體,可能有人會問,持久化到磁盤不是比內存慢不少嗎?然而,Kafka很大程度上是依賴了磁盤這一設定來達到大吞吐量的目的。現代的磁盤優化已經很是好,另外磁盤的順序寫入在某些狀況下確實比內存的隨機讀取要快。一個比較典型的例子就是操做系統很喜歡利用磁盤做虛擬內存。另外無需在內存裏維護大量的數據,Kafka不須要擔憂GC的問題(scala也是運行在JVM上)。另外Kafka直接經過sendfile系統調用避免了內核態和用戶態之間切換以及沒必要要的數據複製。此外,消息系統的另外一個消耗就是帶寬,Kafka有壓縮消息的功能,壓縮算法能夠進行指定。
上面的內容我都是摘自官網文檔