Kakfa學習筆記(四)——分區和副本

上一篇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有壓縮消息的功能,壓縮算法能夠進行指定。

上面的內容我都是摘自官網文檔

相關文章
相關標籤/搜索