Kafka選舉機制及資料丟失情況分析

2021-09-13 04:03:24 字數 2130 閱讀 5907

unclean.leader.election 只能在broker級別(實際上是在集群範圍內)進行配置,它的預設值是true 。我們之前提到過,當分割槽首領不可用時,乙個同步副本會被選為新首領。 如果在選舉過程中沒有丟失資料,也就是說提交的資料同時存在於所有的同步副本上,那麼這個選舉就是「完全」的。但如果在首領不可用時其他副本都是不同步的,我們該怎麼辦呢?

這種情況會在以下兩種場景裡出現。

問題:

• 分割槽有 3 個副本,其中的兩個跟隨者副本不可用(比如有兩個 broker 發生崩憤)。這個

時候,如果生產者繼續往首領寫入資料,所有訊息都會得到確認井被提交(因為此時首

領是唯一的同步副本)。現在我們假設首領也不可用 了(又乙個 broker 發生崩憤),這

個時候,如果之前的乙個跟隨者重新啟動,它就成為了分割槽的唯一不同步副本 。

• 分割槽有 3 個副本,因為網路問題導致兩個跟隨者副本複製訊息滯後,所以儘管它們還在

複製訊息,但已經不同步了。首領作為唯一的同步副本繼續接收訊息。這個時候,如果

首領變為不可用,另外兩個副本就再也無桂變成同步的了 。

對於這兩種場景 ,我們要作出乙個兩難的選擇。

解決辦法:

• 如果不同步的副本不能被提公升為新首領,那麼分割槽在舊首領(最後乙個同步副本)恢復之前是不可用的。有時候這種狀態會持續數小時(比如更換記憶體晶元)。

• 如果不同步的副本可以被提公升為新首領,那麼在這個副本變為不同步之後寫入舊首領的訊息、會全部丟失,導致資料不一致。為什麼會這樣呢?假設在副本0和副本l不可用時,偏移量100-200的訊息被寫入副本 2(首領)。現在副本2變為不可用的,而副本 0 變為可用的。副本 0 只包含偏移量o~100的訊息,不包含偏移量100~200的悄息。如果我們允許副本0成為新首領,生產者就可以繼續寫人資料,悄費者可以繼續讀取資料。於是,新首領就有了偏移量 100~200 的新梢息。這樣,部分消費者會讀取到偏移量100~200的舊訊息,部分消費者會讀取到偏移量 100~200 的新訊息,還有部分消費者讀取的是二者的混合。這樣會導致非常不好的結果,比如生成不準確的報表。另外,副本2可能會重新變為可用,並成為新首領的跟隨者。這個時候,它會把比當前首領舊的訊息全部刪除,而這些訊息對於所有消費者來說都是不可用的。

在主題級別和 broker 級別上,這個引數都叫 min.insync.replicas 。

我們知道,儘管為乙個主題配置了3個副本,還是會出現只有乙個同步副本的情況。如果這個同步副本變為不可用,我們必須在可用性和一致性之間作出選擇一一這是乙個兩難的選擇。 根據kafka對可靠性保證的定義,訊息只有在被寫入到所有同步副本之後才被認為是已提交的。但如果這裡的「所有副本」只包含乙個同步副本,那麼在這個副本變為不可用時,資料就會丟失。

如果要確保已提交的資料被寫入不止乙個副本,就需要把最少同步副本數量設定為大一點的值。對於乙個包含 3 個副本的主題,如果min.insync.replicas被設為 2,那麼至少要存在兩個同步副本才能向分割槽寫入資料。如果3個副本都是同步的,或者其中乙個副本變為不可用,都不會有什麼問題。不過,如果有兩個副本變為不可用,那麼 broker 就會停止接受生產者的請求。嘗試傳送資料的生產者會收到 notenoughrepli.ca***cepti.on 異常。消費者仍然可以繼續讀取已有的資料。實際上,如果使用這樣的配置,那麼當只剩下乙個同步副本時,它就變成唯讀了,這是為了避免在發生不完全選舉時資料的寫入和讀取出現非預期的行為。為了從唯讀狀態中恢復,必須讓兩個不可用分割槽中的乙個重新變為可用的(比如重啟broker),並等待它變為同步的。

網路異常:acks設定為0時,不和kafka集群進行訊息接受確認,當網路發生異常等情況時,存在訊息丟失的可能;

客戶端異常:非同步傳送時,訊息並沒有直接傳送至kafka集群,而是在client端按一定規則快取並批量傳送。在這期間,如果客戶端發生宕機等情況,都會導致訊息的丟失;

緩衝區滿了:非同步傳送時,client端快取的訊息超出了緩衝池的大小,也存在訊息丟失的可能;

leader副本異常:acks設定為1時,leader副本接收成功,kafka集群就返回成功確認資訊,而follower副本可能還在同步。這時leader副本突然出現異常,新leader副本(原follower副本)未能和其保持一致,就會出現訊息丟失的情況;

kafka選舉機制

kafka是乙個高效能,高容錯,多副本,可複製的分布式訊息系統,是基於raft演算法來實現leader選舉的。整個架構設計中涉及幾處選舉 所謂控制器就是乙個borker,在乙個kafka集群中,有多個broker節點,但是它們之間需要選舉出乙個leader,其他的broker充當follower角色...

Kafka的選舉機制

kafka架構裡有生產者,消費者和broker,第乙個啟動的broker會去zookeeper裡註冊,成為leader,而後面去zookeeper註冊的broker則會收到異常,只能註冊watch物件,對leader進行監控,如果leader broker掛了,其他第乙個註冊的broker成為新的l...

kafka 資料不丟失

設定引數 props.put bootstrap.servers 10.176.2.170 9092,10.176.1.97 9092,10.176.7.57 9092 producer用於壓縮資料的壓縮型別。預設是無壓縮 props.put compression.type gzip 增加延遲 p...