kafka的數據副本因子

前言

爲了數據的安全性,我們在實際的工作中,不可避免的需要考慮kafka的數據備份問題,否則數據丟失了,就無法恢復了。所以數據的備份機制是很重要的。

副本介紹

正常情況下,kafka裏的數據都不能只有一份。假設我們保存了N個副本,即topic每個partition都有N個副本(Replica)。並且副本的個數一定小於broker個數。(因爲每份數據的副本必須保存在不同的broker,否則沒有意義,因爲如果一份數據的副本保存在同一個broker,那麼這個broker掛了,則數據依然丟失。)所以對於每個partition而言,每個broker上最多隻有一個副本,因此我們常常使用broker-id表示副本。kafka還有個機制,就是會默認將副本均勻分佈到所有的broker上。

上圖中的,黃色實線是數據,黃色虛線部分是副本。kafka會均勻分佈到各個broker上。

kafka如何進行數據備份

假設我們設置了數據默認副本數爲3。kafka會選舉其中的某一個partition(備份以partition爲單位)爲leader,另外兩個爲follower。在進行數據備份時,不是leader主動將數據push給follower,而是follower去向leader pull數據過來。同時補充一個事,當kafka的consumer去消費數據的時候,並不是去follower裏消費數據,依然是向leader裏消費數據。follower只是起到備份數據的作用,並且follower還需要定時去leader裏拿數據,如果消費數據時還向follower,這樣的設置明顯不合理。所以,kafka的讀和寫都是先通過leader的,follower只起備份作用。

數據commit

(1)補充兩個知識點:

1、producer發佈數據有兩種方式,分別是同步producer和異步producer。同步的意思就是,producer 發佈數據後,需要成功後,才能發佈下一條數據(在本文中的意思就是,producer發佈數據到leader之後, 需要等所有的follower拉取到該數據後,leader才能commit。這種方式耗時)。而異步的意思是,producer發佈數據後,無需等待即可發送下一條(即producer發送數據到leader後,leader馬上commit,之後follower自己慢慢的去pull數據。這種方式可能會造成數據丟失,因爲當數據到leader時,如果follower還沒來得及pull數據,leader就掛了,那麼這條數據就丟失了,因爲leader已經向producer commit了)。

        2、commit的意義:只要leader commit了,即向producer表示這條數據已經被存儲在broker了,對於producer來說就是這條數據已經被成功發佈了。

(2)ISR模式

但是kafka不會選擇上述的兩種方式,而是巧妙的中和了這兩種方式的優點。即ISR方式。leader會維護一個基本與其保持同步的副本列表,這個列表稱爲ISR(in-sync-Replica)。它的運行機制是,當ISR中的所有副本都pull完leader的數據後,即向leader發送ACK,此時leader再commit。並且這個ISR是動態變化的,當存在follower同步數據大步落後於leader時,則會將其從ISR中移除,以免拖垮整個進度,並且當不在ISR中的follower,與leader同步時,leader又會將其加入到ISR中。這樣的機制,不像同步和異步那麼絕對,即保證了速度也保證了數據的安全性。當然如果follower如果掛了,則也會將其從ISR中移除(leader也會存在於ISR列表中)。

( 3)ISR配置

1、server配置:

replica.lag.time.mac.ms:超時時間,即當follower落後於leader的時間超過這個設定的時間後,則將這個follower從ISR移除。同理,如果發現不在ISR中的follower與leader的時間差小於這個值,則將其移動到ISR中。

replica.lag.max.messages:數據大小,即當follower落後leader的消息條數超過這個設置時,則將這個follower從ISR中移除。同理,如果發現不在ISR中的follower與leader相差的消息條數小於這個值,則將其移動到ISR中。

2、topic配置

min.insync.replicas:ISR中最少的follower個數。一般設置成大於1的,否則如果最後的一個broker掛了,則數據就丟失了。

3、producer配置

request.required.acks:  一般設置爲 0 1 -1(0:producer發送完數據後,不等待broker確認即發送下一條數據。 1:producer發送完數據後,等到leader確認後,發送下一條數據。 -1:producer等待ISR中的follower確認後發送下一條數據)

宕機如何恢復
(1)少部分副本宕機

當leader宕機了,會從follower選擇一個作爲leader。當宕機的重新恢復時,會把之前commit的數據清空,重新從leader裏pull數據。

(2)全部副本宕機

當全部副本宕機了有兩種恢復方式

1、等待ISR中的一個恢復後,並選它作爲leader。(等待時間較長,降低可用性)

2、選擇第一個恢復的副本作爲新的leader,無論是否在ISR中。(並未包含之前leader commit的數據,因此造成數據丟失)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章