kafka資料可靠性和一致性保證

2021-09-21 01:40:15 字數 2117 閱讀 1072

kafka資料可靠性和一致性保證

當producer向leader傳送資料時,可以通過request.required.acks引數來設定資料可靠性的級別:

-1:producer需要等待isr中的所有follower都確認接收到資料後才算一次傳送完成,可靠性最高。但是這樣也不能保證資料不丟失,比如當isr中只有leader時(前面isr那一節講到,isr中的成員由於某些情況會增加也會減少,最少就只剩乙個leader),這樣就變成了acks=1的情況.

如果要提高資料的可靠性,在設定request.required.acks=-1的同時,也要min.insync.replicas這個引數(可以在broker或者topic層面進行設定)的配合,這樣才能發揮最大的功效。min.insync.replicas這個引數設定isr中的最小副本數是多少,預設值為1,當且僅當request.required.acks引數設定為-1時,此引數才生效。如果isr中的副本數少於min.insync.replicas配置的數量時,客戶端會返回異常:

org.apache.kafka.common.errors.notenoughreplica***ceptoin: messages are rejected since there are fewer in-sync replicas than required。

接下來對acks=1和-1的兩種情況進行詳細分析。

request.required.acks=1

producer傳送資料到leader,leader寫本地日誌成功,返回客戶端成功;此時isr中的副本還沒有來得及拉取該訊息,leader就宕機了,那麼此次傳送的訊息就會丟失。

request.required.acks=-1

同步(kafka預設為同步,即producer.type=sync)的傳送模式,replication.factor=2且min.insync.replicas=2的情況下,不會丟失資料。

有兩種典型情況,一種是follower完全同步,一種的follower部分同步。

**完全同步 **

acks=-1的情況下(如無特殊說明,以下acks都表示為引數request.required.acks),資料傳送到leader, isr的follower全部完成資料同步後,leader此時掛掉,那麼會選舉出新的leader,資料不會丟失。

部分同步

acks=-1的情況下,資料傳送到leader後 ,部分isr的副本同步,leader此時掛掉。比如follower1h和follower2都有可能變成新的leader, producer端會得到返回異常,producer端會重新傳送資料,資料可能會重複。

當然上圖中如果在leader crash的時候,follower2還沒有同步到任何資料,而且follower2被選舉為新的leader的話,這樣訊息就不會重複。

hw深入討論

考慮上圖(即acks=-1,部分isr副本同步)中的另一種情況,如果在leader掛掉的時候,follower1同步了訊息4,5,follower2同步了訊息4,與此同時follower2被選舉為leader,那麼此時follower1中的多出的訊息5該做如何處理呢?

這裡就需要hw的協同配合了。如前所述,乙個partition中的isr列表中,leader的hw是所有isr列表裡副本中最小的那個的leo。類似於木桶原理,水位取決於最低那塊短板。

如上圖,某個topic的某partition有三個副本,分別為a、b、c。a作為leader肯定是leo最高,b緊隨其後,c機器由於配置比較低,網路比較差,故而同步最慢。這個時候a機器宕機,這時候如果b成為leader,假如沒有hw,在a重新恢復之後會做同步(makefollower)操作,在宕機時log檔案之後直接做追加操作,而假如b的leo已經達到了a的leo,會產生資料不一致的情況,所以使用hw來避免這種情況。

a在做同步操作的時候,先將log檔案截斷到之前自己的hw的位置,即3,之後再從b中拉取訊息進行同步。

如果失敗的follower恢復過來,它首先將自己的log檔案截斷到上次checkpointed時刻的hw的位置,之後再從leader中同步訊息。leader掛掉會重新選舉,新的leader會傳送「指令」讓其餘的follower截斷至自身的hw的位置然後再拉取新的訊息。

當isr中的個副本的leo不一致時,如果此時leader掛掉,選舉新的leader時並不是按照leo的高低進行選舉,而是按照isr中的順序選舉。

Kafka 可靠性和一致性

為了保證資料的可靠性,我們最少需要配置一下幾個引數 1.producer 級別 acks all 或者 request.required.acks 1 同時發生模式為同步 producer.type sync leader 在返回確認或錯誤響應之前,會等待所有同步副本都收到悄息 2.topic 級別...

kafka保證資料一致性和可靠性?

一致性定義 若某條訊息對client可見,那麼即使leader掛了,在新leader上資料依然可以被讀到。hw highwatermark client可以從leader讀到的最大msg offset,即對外可見的最大offset,hw max replica.offset 對於leader新收到的...

Kafka資料可靠性與一致性解析

每個partition會在磁碟記錄乙個recoverypoint,記錄已經flush到磁碟的最大offset。當broker fail 重啟時,會進行loadlogs。首先會讀取該partition的recoverypoint,找到包含recoverypoint的segment及以後的segment...