深入理解Kafka(1)
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 用來負責集群元數據的管理、控制器的選舉等操作的。
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
?
?
?
總結
以上是生活随笔為你收集整理的深入理解Kafka(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非阻塞同步算法与CAS(Compare
- 下一篇: Kafka配置