Kafka 的三大角色:
- 消息系統:
Kafka 和傳統的消息系統(也稱作消息中間件〉都具備系統解耦、備援存儲、流量削峰、緩沖、異步通信、擴充性、可恢複性等功能。與此同時, Kafka 還提供了大多數消息系統難以實作的消息順序性保障及回溯消費的功能。
- 存儲系統:
Kafka 把消息持久化到磁盤,相比于其他基于記憶體存儲的系統而言,有效地降低了資料丢失的風險。也正是得益于Kafka 的消息持久化功能和多副本機制,我們可以把Kafka 作為長期的資料存儲系統來使用,隻需要把對應的資料保留政策設定為“永久”或啟用主題的日志壓縮功能即可。
- 流式處理平台:
Kafka 不僅為每個流行的流式處理架構提供了可靠的資料來源,還提供了一個完整的流式處理類庫,比如視窗、連接配接、變換和聚合等各類操作。
基本概念
一個典型的Kafka體系架構包括:
- Producer
生産者,也就是發送消息的一方。生産者負責建立消息, 然後将其投遞到Kafka 中。
- Broker
服務代理節點。對于Kafka 而言,Broker 可以簡單地看作一個獨立的Kafka服務節點或Kafka 服務執行個體。大多數情況下也可以将Broker 看作一台Kafka 伺服器,前提是這台伺服器上隻部署了一個Kafka 執行個體。一個或多個Broker 組成了一個Kafka 叢集。
- Consumer
消費者,也就是接收消息的一方。消費者連接配接到Kafka 上并接收消息,進而進行相應的業務邏輯處理。
- ZooKeeper叢集
ZooKeeper 是Kafka 用來負責叢集中繼資料的管理、控制器的選舉等操作的。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cXT3FkaNFTV65Ud5clYsJlMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0kzM2ETNxkDM2EjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Kafka 體系結構
Kafka的2個重要概念-Topic和Partition
- Topic
Kafka 中的消息以主題為機關進行歸類,生産者負責将消息發送到特定的主題(發送到Kafka 叢集中的每一條消息都要指定一個主題),而消費者負責訂閱主題并進行消費。
- Partition
主題是一個邏輯上的概念,它還可以細分為多個分區,一個分區隻屬于單個主題,很多時候也會把分區稱為主題分區( Topic-Partition )。同一主題下的不同分區包含的消息是不同的,分區在存儲層面可以看作一個可追加的日志( Log )檔案。
分區可以分布在不同的伺服器( broker )上,也就是說,一個主題可以橫跨多個broker ,以此來提供比單個broker 更強大的性能。
- offset
消息在被追加到分區日志、檔案的時候都會配置設定一個特定的偏移量( offset )。offset 是消息在分區中的唯一辨別, Kafka 通過它來保證消息在分區内的順序性,不過offset 并不跨越分區,也就是說, Kafka 保證的是分區有序而不是主題有序。
消息追加寫入
多副本架構
Kafka 為分區引入了多副本( Replica ) 機制, 通過增加副本數量可以提升容災能力。同一分區的不同副本中儲存的是相同的消息(在同一時刻,副本之間并非完全一樣),各副本之間是“ 一主多從”的關系,其中leader 副本負責處理讀寫請求, follower 副本隻負責與leader 副本的消息同步。副本處于不同的broker 中,當leader 副本出現故障時,從follower 副本中重新選舉新的leader 副本對外提供服務。Kafka 通過多副本機制實作了故障的自動轉移,當Kafka 叢集中某個broker 失效時仍然能保證服務可用。
多副本架構
術語
- AR ( Assigned Replicas)
分區中的所有副本統。
- ISR(On-Sync Replicas )
所有與leader 副本保持一定程度同步的副本(包括leader 副本在内〕組成 , ISR 集合是AR 集合中的一個子集。
消息會先發送到leader副本,然後follower 副本才能從leader 副本中拉取消息進行同步,同步期間内follower 副本相對于leader 副本而言會有一定程度的滞後。前面所說的“ 一定程度的同步”是指可忍受的滞後範圍,這個範圍可以通過參數進行配置
- OSR ( Out-of-Sync Replicas )
與leader 副本同步滞後過多的副本(不包括leader 副本)
- HW(High Watermark)
它辨別了一個特定的消息偏移量( offset ),消費者隻能拉取到這個offset 之前的消息。
- LEO(Log End Offset)
它辨別目前日志檔案中下一條待寫入消息的offset,LEO 的大小相當于目前日志分區中最後一條消息的offset值加1 。分區ISR 集合中的每個副本都會維護自身的LEO.
分區中各偏移量位置
上圖代表一個日志檔案,這個日志檔案中有9 條消息,第一條消息的offset( LogStartOffset )為0 ,最後一條消息的offset為 8, offset 為9 的消息用虛線框表示,代表下一條待寫入的消息。日志檔案的HW 為6,表示消費者隻能拉取到offset 在0 至5 之間的消息,而offset 為6 的消息對消費者而言是不可見的。
HW與LEO關系
為了讓讀者更好地了解ISR 集合,以及HW 和LEO 之間的關系,下面通過一個簡單的示例來進行相關的說明。
假設某個分區的ISR 集合中有3 個副本,即一個leader副本和2 個follower 副本,此時分區的LEO 和HW 都為3 。
消息3 和消息4 從生産者發出之後會被先存入leader 副本:
在消息寫入leader 副本之後, fo llower 副本會發送拉取請求來拉取消息3 和消息4 以進行消息同步。在同步過程中,不同的follower副本的同步效率也不盡相同。
所有的副本都成功寫入了消息3 和消息4