kafka的基本概念
kafka是什么 ?
kafka是一個多分區、多副本且基於zookeeper協調的分布式消息系統。也是一個分布式流式處理平台,它以高吞吐、可持久化、可水平擴展、支持流數據處理等多種特性而被廣泛使用。
kafka扮演的三大角色
消息系統:kafka具備系統解耦、冗余存儲、流量削峰、緩沖、異步通信、擴展性、可恢復性等功能。與此同時,Kafka 還提供了大多數消息系統難以實現的消息順序性保障及回溯消費的功能。
存儲系統:Kafka 把消息持久化到磁盤,相比於其他基於內存存儲的系統而言,有效地降低了數據丟失的風險。也正是得益於Kafka 的消息持久化功能和多副本機制,我們可以把Kafka作為長期的數據存儲系統來使用,只需要把對應的數據保留策略設置為“永久”或啟用主題的日志壓縮功能即可。
流式處理平台:Kafka 不僅為每個流行的流式處理框架提供了可靠的數據來源,還提供了一個完整的流式處理類庫,比如窗口、連接、變換和聚合等各類操作。
kafka的基本架構
一個典型的 Kafka 體系架構包括若干 Producer、若干 Broker、若干 Consumer,以及一個ZooKeeper集群,如下圖所示。其中ZooKeeper是Kafka用來負責集群元數據的管理、控制器的選舉等操作的。Producer將消息發送到Broker,Broker負責將收到的消息存儲到磁盤中,而Consumer負責從Broker訂閱並消費消息。
(1)Producer:生產者,也就是發送消息的一方。生產者負責創建消息,然后將其投遞到Kafka中。
(2)Consumer:消費者,也就是接收消息的一方。消費者連接到Kafka上並接收消息,進而進行相應的業務邏輯處理。
(3)Consumer Group (CG):消費者組,由多個 consumer 組成。消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個組內消費者消費;消費者組之間互不影響。所有的消費者都屬於某個消費者組,即消費者組是邏輯上的一個訂閱者。
(4)Broker:服務代理節點。對於Kafka而言,Broker可以簡單地看作一個獨立的Kafka服務節點或Kafka服務實例。一個kafka集群由多個 broker 組成。一個 broker可以容納多個 topic。
(5)Topic:Kafka中的消息以主題為單位進行歸類,生產者負責將消息發送到特定的主題(發送到Kafka集群中的每一條消息都要指定一個主題),而消費者負責訂閱主題並進行消費
(6)Partition:主題是一個邏輯上的概念,它還可以細分為多個分區,一個分區只屬於單個主題,很多時候也會把分區稱為主題分區(Topic-Partition)。同一主題下的不同分區包含的消息是不同的,分區在存儲層面可以看作一個可追加的日志(Log)文件,消息在被追加到分區日志文件的時候都會分配一個特定的偏移量(offset)。offset是消息在分區中的唯一標識,Kafka通過它來保證消息在分區內的順序性,不過offset並不跨越分區,也就是說,Kafka保證的是分區有序而不是主題有序。
Kafka中的分區可以分布在不同的服務器(broker)上,也就是說,一個主題可以橫跨多個broker,以此來提供比單個broker更強大的性能。
每一條消息被發送到broker之前,會根據分區規則選擇存儲到哪個具體的分區。如果分區規則設定得合理,所有的消息都可以均勻地分配到不同的分區中。如果一個主題只對應一個文件,那么這個文件所在的機器 I/O 將會成為這個主題的性能瓶頸,而分區解決了這個問題。 (7)Replica:Kafka 為分區引入了多副本(Replica)機制,通過增加副本數量可以提升容災能力。同一分區的不同副本中保存的是相同的消息(在同一時刻,副本之間並非完全一樣),副本之間是“一主多從”的關系,其中leader副本負責處理讀寫請求,follower副本只負責與leader副本的消息同步。副本處於不同的broker中,當leader副本出現故障時,從follower副本中重新選舉新的leader副本對外提供服務。Kafka通過多副本機制實現了故障的自動轉移,當Kafka集群中某個broker失效時仍然能保證服務可用。
Kafka 消費端也具備一定的容災能力。Consumer 使用拉(Pull)模式從服務端拉取消息,並且保存消費的具體位置,當消費者宕機后恢復上線時可以根據之前保存的消費位置重新拉取需要的消息進行消費,這樣就不會造成消息丟失。
AR、ISR、OSR、HW、LEO
分區中的所有副本統稱為AR(Assigned Replicas)。所有與leader副本保持一定程度同步的副本(包括leader副本在內)組成ISR(In-Sync Replicas),ISR集合是AR集合中的一個子集。消息會先發送到leader副本,然后follower副本才能從leader副本中拉取消息進行同步,同步期間內follower副本相對於leader副本而言會有一定程度的滯后。
與leader副本同步滯后過多的副本(不包括leader副本)組成OSR(Out-of-Sync Replicas),由此可見,AR=ISR+OSR。在正常情況下,所有的 follower 副本都應該與 leader 副本保持一定程度的同步,即 AR=ISR,OSR集合為空。
leader副本負責維護和跟蹤ISR集合中所有follower副本的滯后狀態,當follower副本落后太多或失效時,leader副本會把它從ISR集合中剔除。如果OSR集合中有follower副本“追上”了leader副本,那么leader副本會把它從OSR集合轉移至ISR集合。默認情況下,當leader副本發生故障時,只有在ISR集合中的副本才有資格被選舉為新的leader,而在OSR集合中的副本則沒有任何機會(不過這個原則也可以通過修改相應的參數配置來改變)。
ISR與HW和LEO也有緊密的關系。HW是High Watermark的縮寫,俗稱高水位,它標識了一個特定的消息偏移量(offset),消費者只能拉取到這個offset之前的消息。
LEO是Log End Offset的縮寫,它標識當前日志文件中下一條待寫入消息的offset,分區ISR集合中的每個副本都會維護自身的LEO,而ISR集合中最小的LEO即為分區的HW,對消費者而言只能消費HW之前的消息。
kafka的復制機制
Kafka 的復制機制既不是完全的同步復制,也不是單純的異步復制。事實上,同步復制要求所有能工作的 follower 副本都復制完,這條消息才會被確認為已成功提交,這種復制方式極大地影響了性能。而在異步復制方式下,follower副本異步地從leader副本中復制數據,數據只要被leader副本寫入就被認為已經成功提交。在這種情況下,如果follower副本都還沒有復制完而落后於leader副本,突然leader副本宕機,則會造成數據丟失。Kafka使用的這種ISR的方式則有效地權衡了數據可靠性和性能之間的關系。