- zookeeper: 負責集羣元數據管理、控制器的選舉等操作
- producer: 將消息發送到 broker
- broker: 將收到的消息存儲到磁盤中
- consumer: 負責從 broker 訂閱並消費消息
- topic: 消息主題(邏輯概念),生產者和消費者都以 topic 爲單位進行生產和消費
- partition: 分區(也稱作 topic-partition 主題分區,topic 的物理概念),同一個 topic 可以分爲多個 partition,一個 partition 只屬於單個 topic。分區在存儲層面可以看做一個可追加的日誌文件,消息在被追加到分區日誌文件的時候都會分配一個特定的偏移量(offset)。offset 是消息在分區中的唯一標識,kafka 通過它來保證消息在分區內的順序性,不過 offset 並不跨越分區,kafka 保證的是分區有序而不是主題有序。
分區的副本機制
一個分區可以有多個副本,一主多從,leader 副本負責處理讀寫請求,follower 副本只負責與 leader 副本的消息同步。多個副本處於不同的 broker 中,當某個 broker 失效後仍能保證服務可用。
不同分區的同步速度不一致,kafka 把同步程度不同的副本做了區分:
- AR (Assigned Replicas): 所有副本的統稱。AR = ISR + OSR。
- ISR (In-Sync Replicas): 與 leader 保持一定程度同步的副本。當 leader 故障時,只有在 ISR 集合中的副本纔有資格被選舉爲新的 leader
- OSR (Out-of-Sync Replicas): 與 leader 同步滯後過多的副本。
偏移量的一些概念與 ISR 的關係:
- HW (High Watermark) 高水位:一個特定的 offset,消費者只能拉取到這個 offset 之前的消息(消息可見性)。
- LEO (Log End Offset): 當前日誌文件中下一條待寫入消息的 offset。
- 三者之間的關係:ISR 集合中最小的 LEO 即爲分區的 HW。
舉個例子:
- 假設有一個分區 leader 副本爲 L1,有兩個 follower 副本爲 F1, F2
- 此時,L1, F1, F2 的同步進度一致,都有三條消息m0,m1,m2
- 2個 follower 副本都處於 ISR 集合,LEO都爲 2,所以 HW 爲 2
- 這時生產者寫入兩條消息 m3,m4
- F1 同步速度快,同步了兩條消息,F2同步速度慢,只同步了 m3
- 此時,F1 的 LEO 爲 4,F2 的 LEO 爲3,當前分區的 HW 取最小值爲 3
- 之後 F2 也同步了 m4,LEO 變爲 4
- F1 和 F2 的 LEO 都爲 4,HW 也爲4
(詳細可以見書中的流程圖,這裏就不貼圖了)