聊聊Kafka的ACK、ISR、HW、exeact_once

	ACK的生成這向Kafka集羣生成數據時Kafka集羣給生產者響應策略,acks有三種取值:0、1、-1(all)。
	當acks=0的時候,如果follow的數據和leader的數據不一致的時候leader掛掉,這個時候重新選擇leader,follow還沒來得及同步leader的數據就丟掉了;還有一種情況是當leader沒掛也會丟數據,即當網絡動盪的時候,數據在網絡傳輸過程中丟掉,就算leader沒掛也會丟數據。
	當acks=1的時候,如果follow的數據和leader的數據不一致的時候當leader掛掉,並且掛掉之前已經給生產者發送ack了,這個時候重新選擇leader,follow還沒來得及同步leader的數據就丟掉了。
	當acks=-1的時候,當isr隊列裏只有leader的時候,leader掛掉,就會跟				acks=1的時候那樣丟數據。當然這種情況比較極端。acks=-1更多的是數據重複,當follow同步了一部分leader的信息的時候,leader掛掉,從follow裏重新選取leader,由於還沒有發送ack,所以生產者再發一次數據,就造成了數據重複。
	當acks=-1的時候,涉及到了follower,這裏的follower不是指kafka全部的follower,而是指在ISR的follower,ISR就是副本同步隊列的意思。在0.9版本以前有兩種策略維持ISR,一種是基於時間的,默認是10s,一種是基於條數的,默認是10000條。但是到了0.9版本及以後,只有保留了基於時間的同步ISR策略,原因是防止一批次發送來的數據超過了10000條,ISR的follower就會頻繁地從ISR中移進移出。

hw保證的是數據的一致性問題,跟丟不丟數據沒有關係,包括消費的一致性和存儲的一致性。ack纔是跟丟不丟數據有關係的。

leo:每個副本的最後的offset
hw:所有副本中最小的leo,hw是對消費者可見的最大的offset
hw有兩個作用:一個是保證消費的一致性,如果沒有hw,如果leader的leo是19,f1的leo是15,當消費者消費到leader的19後,leader掛掉了,然後去f1找20的offset的時候就找不到了。還有一個作用是保證存儲的一致性問題,當leader掛掉之後,f1稱爲新的leader之後,就會把其他的follower中大於hw的數據砍掉。

Kafka如何保證精準一次性消費問題?
在這裏插入圖片描述

一個topic有多個分區,生產者發送到哪個分區?
1)如果生產者再發送數據的時候指定了哪個分區就直接發送到那個分區;
2)如果生產者沒有指定哪個分區,但是指定了key,那麼就對求出該key的hash值,然後對該topic的分區數取模,得到的數字就是要發送的分區;
3)如果生產者生產數據的時候既沒有指定分數也沒有指定key,那麼就按照輪詢的方式去發送數據到各個分區,剛開始的時候是隨機發送到一個分區。

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