kafka ack設定 kafka 原理深度解讀

2021-10-18 11:16:00 字數 2659 閱讀 3922

前文介紹了kafka的一些基本原理,接下來我們深入了解下關於kafka的一些機制和優化

前文提到過,乙個topic是分成多個partition 儲存的;topic是邏輯上的概念,partition是物理上的概念,如圖所示:

通過我們可以看出,雖然每個partition內部是有序的,但對於整個topic而言它是無法保證有序性的。partition 的資料會以 日誌檔案的形式儲存到磁碟中,在配置檔案server.properties中通過屬性log.dirs指定。在該資料夾下會根據topic和序號來建立資料夾,在該 partition 資料夾中以.log結尾的檔案是實際儲存資料的檔案,當生產者生產資料,。以.index結尾的檔案是索引檔案,index 和log 組成乙個segment。.log 檔案預設只會保持7天內的資料,通過log.retention.hours配置項指定資料保持時長。當.log 檔案超出最大值時會建立新的 .log檔案和.index檔案,也就是乙個新的segment;其中檔案的名稱以訊息起始偏移量命名。log.segment.bytes指定log檔案的最大值。當我們去尋找一條訊息的時候,會先根據偏移量來定位到屬於哪乙個segment, 再通過二分查詢從index檔案中尋找該偏移量對應的索引,再通過索引去log檔案中找到真正的訊息。

為保證producer 傳送的資料不丟失,broker 接收到資料後都需要對producer傳送ack(確認接收) ,如果producer 未收到ack則會重新傳送該條訊息。producer 的 ack 策略又分為三種:

採用全副本同步完成再ack會有乙個問題:當leader 接收完資料,所有的follower開始同步資料,但一旦有乙個follower不能與leader進行同步,那leader會一直等下去,這樣會非常的浪費時間。為此kafka引入了 isr 機制——leader會維護乙個動態的 isr(in-sync replica set)列表,這個列表維護了和leader保持同步的集合。當isr中的follower完成資料的同步之後,leader就會傳送ack。如果follower 長時間未向leader同步資料,則該follower將會被踢出 isr,其他滿足條件的follower也會被加入到isr。這個同步最大時間配置項為replica.lag.time.max.ms引數設定。如果leader故障了,也會從isr的follower中選舉新的leader。

因為副本的訊息數是存在差異的,可能leader10條,而follower只同步了8條;當leader掛掉,資料就有可能會發生丟失,通過一種機制來保證消費者消費資料的一致性就很有必要了。kafka的資料一致性通過 leo(每個副本的最後一條o'f'fset)和hw(所有的leo中最小的那個)來保證。示意圖:

消費者只能看到offset<=hw 的訊息。

kafka 對訊息消費的處理有兩種:

因為ack機制的存在,producer 向kafka傳送訊息時如果 ack=0,由於producer不等確認訊息是否投遞成功就不管了 ,可能丟失資料,此時消費者最多消費一次訊息;如果ack=1,當producer未收到訊息確認投遞成功時會再次投遞,這個時候可能訊息被投遞了多次,可能會存在重複消費的情況。當kafka開啟資料冪等性且ack=1的時候,此時重複的訊息會被去重,因此不會產生重複消費的情況。啟用冪等性的方式是將producer中的引數enable.idompotence設定為true。

和rabbitmq一樣,可以指定消費者消費訊息是推模式還是拉模式,邏輯是和 rabbit 一樣的,這裡就不多做解釋了。在消費者組中,有多個消費者,乙個topic中有多個partition。那麼訊息的分配是怎麼樣的呢,首先前文提到過乙個消費者組中的消費者不能同時消費同乙個partition,這是基本原則。然後partiotion的分配機制有兩種,一種是range(範圍) 一種是 roundrobin(輪詢),range示 意圖:

roundrobin 示意圖:

kafka的producer生產資料,要以追加的形式寫入到log檔案中,這個寫磁碟的過程是順序寫,相對於磁碟的隨機寫來說,這個效率要高出很多,這個是kafka高效讀寫的保證之一。而另外的乙個保證高效讀寫的技術是零拷貝,用過netty的小夥伴應該知道這個技術,中間少了兩次使用者態的切換。

kafka的集群中會有乙個broker會被選舉為 controller,負責管理集群broker的上下線,所有topic的副本leader的選舉工作, 而controller的這些管理工作都是需要依賴於kafka的。下圖為leader的選舉示意圖:

的選舉

Kafka限流 Quota 設定

12月 24,2016 nix.huang 如果kafka客戶端是認證的。那麼可以使用userid和clientid兩種認證方式。如果沒有認證只能使用clientid限流。bin kafka configs.sh zookeeper localhost 2181 alter add config p...

kafka ack機制 出現故障資料同步問題

0 producer不等待broker的ack,這一操作提供了乙個最低的延遲,broker一接收到還沒有寫入磁碟就已經返回,當broker故障時有可能丟失資料 例如 當leader掛了,producer仍然往這個leader傳送訊息,就會造成資料丟失 1 producer等待broker 的ack,...

kafka設定超時時間

後台登入的地方 有用kafka傳送登入日誌 某一天 kafka連線超時 導致後台登入很慢 登入不進去 做類似以下修改 設定個超時時間 可以很好解決這個問題 rk new rdkafka producer rk setloglevel log debug rk addbrokers 127.0.0.1...