kafka工作原理解析

2021-10-10 12:42:05 字數 2547 閱讀 8934

三、kafka設計解析

有兩個生產者,生產topic(不同的topic表示不同訊息的型別)

每乙個topic中的partition都會有副本(replices),例如乙個topic1,有兩個partition,另乙個topic有乙個partition(乙個partition對應),每乙個partition有三個副本。

確定brokers的個數(集群中伺服器節點的個數),使用zookeeper管理集群,使負載均衡,將partition的副本分別分到4個brokers中,

從每乙個partition的副本中選取乙個leader,其他為follower,這樣就可以在乙個leader掛掉了以後,在選舉乙個leader出來

消費者消費資料(partition中的leader)

zookeeper在consumer group發生變化時進行rebalance

kafka提供兩種策略刪除舊資料:

正常情況下consumer會在消費完一條訊息後遞增該offset。offset由consumer控制,所以kafka broker是無狀態的,它不需要標記哪些訊息被哪些消費過,也不需要通過broker去保證同乙個consumer group只有乙個consumer能消費某一條訊息,因此也就不需要鎖機制.

有了partition後,不同的訊息可以並行寫入不同broker的不同partition裡(通過key指定訊息傳送到哪個分割槽中)

使用consumer high level api時,同一topic的一條訊息只能被同乙個consumer group內的乙個consumer消費,但多個consumer group可同時消費這一訊息。

傳遞方式主要包含以下幾類:

at most once  訊息可能會丟,但絕不會重複傳輸

at least one  訊息絕不會丟,但可能會重複傳輸

exactly once  每條訊息肯定會被傳輸一次且僅傳輸一次,很多時候這是使用者所想要的。

kafka分配replica的演算法如下

將所有broker(假設共n個broker)和待分配的partition排序

將第i個partition分配到第(i mod n)個broker上

將第i個partition的第j個replica分配到第((i + j) mode n)個broker上

**目的:**為了使parition 均勻的分布在集群上。如果所有的replica都在同乙個broker上,那一旦該broker宕機,該partition的所有replica都無法工作,也就達不到ha的效果。同時,如果某個broker宕機了,需要保證它上面的負載可以被均勻的分配到其它倖存的所有broker上。

producer ------zookeeper—> partition(leader) —> leader將訊息寫入本地log(持久化到本地磁碟) —> follwer從leader pull資料(保證follwer和leader儲存資料一致)----> follwer接收到資料後立刻向leader傳送ack(不保證資料一定寫入了log,所以也不能保證資料一定會被consumer消費) ----> consumer消費leader中的資料

常用的複製機制:

同步複製

需要等所有能工作的follower都複製完,這條訊息才會被認為commit,這種複製方式極大的影響了吞吐率

非同步複製

資料只要被leader寫入log就被認為已經commit,這種情況下如果follower都複製完都落後於leader,而如果leader突然宕機,則會丟失資料

kafka使用的複製機制(isr):

isr:如果乙個follower宕機,或者落後太多,leader將把它從isr(保持同步的replica列表)中移除。follower可以批量的從leader複製資料。

一條訊息只有被isr裡的所有follower都從leader複製過去才會被認為已提交。這樣就避免了部分資料被寫進了leader,還沒來得及被任何follower複製就宕機了,而造成資料丟失(consumer無法消費這些資料)

producer可以等待訊息是否被commit。這種機制確保了只要isr有乙個或以上的follower,一條被commit的訊息就不會丟失

在isr中至少有乙個follower時,kafka可以確保已經commit的資料不丟失,但如果某個partition的所有replica都宕機了,就無法保證資料不丟失了。這種情況下有兩種可行的方案:

等待isr中的任乙個replica「活」過來,並且選它作為leader

選擇第乙個「活」過來的replica(不一定是isr中的)作為leader

流程的步驟:

kafka原理解析

kafka是大家比較常用的訊息中介軟體,本文主要介紹kafka基本元件及其相關原理 kafka通過offset保證訊息在分區內的順序,offset的順序性不跨分割槽 kafka0.10以後,使用乙個專門的topic consumer offset儲存offset consumer offset日誌留...

spring mvc工作原理解析

springmvc各個元件間工作路線圖 springmvc實現controller的三種方式 實現controller介面 實現httprequesthandler介面 使用 controller註解 各個元件解析 1.前端控制器 dispacterservlet 由spring提供,不需要程式設計...

Servlet工作原理解析

1 servlet容器 tomcat容器分四個等級,真正管理servlet的容器是context容器,乙個web應用對應乙個context容器,也就是servlet執行時的servlet容器。新增乙個web應用建立乙個standcontext容器,並且給這個context設定必要的引數,url和pa...