天天看點

Kafka配置項unclean.leader.election.enable造成consumer出現offset重置現象

消費端出現offset重置為latest, earliest現象,類似log:

原因:該consumer消費的topic的leader和followers的狀态不一緻時,發生leader切換,會發生offset out of range,此時consumer進行消費時發現offset非法,會進行offset重置

在測試環境中建立一個topic test,3個分區,2個副本,broker 1為leader,broker 2為follower。 

寫入一些資料消費端進行正常消費,消費至最新狀态A處之後,将test的follower的broker2停掉,繼續向test寫入資料,并讓consumer再次消費至最新狀态B處。

此時停掉的follower broker 2的狀态已和leader broker 1的狀态不一樣,已滞後leader的狀态。

現在将follower broker 2啟動,此時follower和leader的狀态不一樣,follower需要和leader進行同步,但當follower與leader未同步成功之前将leader broker 1停掉,然後follower broker 2經過leader的選舉機制被迫選為leader(unclean.leader.election.enable為true時,選擇第一個啟動的副本為leader),在被選舉為leader之前broker 2的狀态并沒有和broker 1的狀态一緻,也就是說broker 2上的LEO并沒有同步到B處,而broker 2被選舉為了leader,此時producer繼續向topic中寫資料,寫入之後consumer會進行消費,consumer需要消費的offset的B,而broker 2的LEO并沒有同步到B處,此時就發生了out of ranger,offset被重置。

針對以上情況我們進行了一下修改: 

1. 将topic的副本數設定為3(原先為2),減少ISR清單隻有一個leader的幾率 

2. 調整​<code>​min.insync.replicas​</code>​為2(預設是1),此參數的意思是當ISR中的個數小于此值時,producer無法寫入資料,會抛出異常。此參數還需要結合acks來使用,需要将acks設定為all或者-1(flume中kafkaChannel預設是all)。 

3. 調整​<code>​unclean.leader.election.enable​</code>​參數為false(預設為true),此參數辨別當ISR中沒有副本時,選舉最早啟動的broker為leader。 版本0.11中已經修改預設值為false

4. 叢集因為維護需要重新開機時,先停掉一台broker,然後重新開機該broker,等到該broker已加入到ISR中之後,再對其它broker進行如上操作,切勿單個broker依次重新開機。

歡迎關注微信公衆号:大資料從業者