一,Kafka集群
一個典型的 Kafka 體系架構包括若Producer、Broker、Consumer,以及一個ZooKeeper集群,如圖所示。

- ZooKeeper:Kafka負責集群元數據的管理、控制器的選舉等操作的;
- Producer:將消息發送到Broker;
- Broker:服務代理節點,負責將收到的消息存儲到磁盤中。Broker可以簡單地看作一個獨立的Kafka服務節點或Kafka服務實例,一個或多個Broker組成了一個Kafka集群。
- Consumer:負責從Broker訂閱并消費消息;
二,主題(Topic)與分區(Partition)
- 消息根據Topic歸類,生產者將消息發送到特定的Topic,而消費者訂閱Topic并進行消費。
- 一個Topic可以有多個Partition,Partition是一個可追加的日志文件,消息在被追加到分區日志都會分配一個特定的偏移量(offset)。
- Kafka通過offset來保證消息在分區內的順序性,不過offset并不跨越分區,也就是說, Kafka保證的是分區有序而不是Topic有序。
- 分區可以分布在不同的broker上,也就是說, 一個Topic可以橫跨多個broker。

- Consumer使用Pull模式從服務端拉取消息,并且 保存消費的offset,當消費者宕機后恢復時可以根據offset重新拉取,這樣就不會造成消息丟失。
1,Replica機制
分區引入了多副本(Replica)機制,通過增加副本數量可以提升容災能力。
副本一主多從,其中leader副本負責處理 讀寫請求( 生產者和消費者只與leader交互 ),follower副本只負責與leader副本的消息同步。
2, AR = ISR + OSR
AR:分區中的所有的副本
ISR:與leader保持一定程度(可配置)同步的副本(包括leader在內)
OSR:與leader同步滯后過多的副本
正常情況下,所有的 follower 副本都應該與 leader 副本保持一定程度的同步,即 AR=ISR,OSR集合為空。
- leader負責維護和跟蹤所有follower的滯后狀態,并把follower在ISR和OSR中移動;
- 默認下,當leader發生故障時,只有在ISR中的副本才有資格被選舉為新的leader(可通過配置改變)
3,HW和LEO
這是兩個特定的偏移量。
HW:High Watermark的縮寫,俗稱高水位。消費者只能拉取到這個HW之前的消息;
LEO:Log End Offset的縮寫,標識下一條待寫入消息的offset;

注意:這倆都有個+1的關系;
ISR集合中的每個副本都會維護自身的LEO,而ISR集合中最小的LEO即為分區的HW,對消費者而言只能消費HW之前的消息。
舉例說明:

4,Kafka的復制機制
Kafka 的復制機制既不是完全的同步復制(所有能工作的 follower都復制完),也不是單純的異步復制(只要寫入leaderr則成功提交)。Kafka使用的這種ISR機制有效地權衡了數據可靠性和性能的關系。