天天看點

【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

為了保證producer的消息能可靠的投遞到指定的topic,topic的每個分區partition收到消息後,都需要向producer發送ack(acknowlege确認收到),如果生産者producer收到了ack,則進行下一輪的發送,否則重新發送。
【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

ACK機制的實作

問題:分區中現有一個leader副本節點和多個follower副本節點,生産者将消息發送過來的時候,何時傳回ack給生産者?

leader副本負責讀與寫,follower副本同步leader的資料。

方案1:leader和所有的follower都同步完成,才發送ack給生産者 方案2:leader+follower同步完成的數量過半,就發送ack給生産者
【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

kafka采用的eader+follower完全同步機制(ISR中follower),所有節點同步完成才傳回ack。

存在問題:leader+follower完全同步時,假如有1個leader+4個follower,1個leader和3個follower都同步完成,1個follower同步超級慢或者挂掉,會影響傳回或者不傳回ack。

ISR機制的實作

[x] ISR機制

當leader挂掉的時候,由controller會在follower副本中選舉出一個leader。但是這個剩餘follower副本有一個條件,就是follower必須在ISR清單中。

leader和ISR中的follower副本都同步完成時,就傳回ack。

ISR (IN-SYNC Replication) 維護了與leader資訊一緻的follower副本的資訊,當leader挂掉的時候 就從這個ISR中選舉。

ISR資訊存放在zookeeper的topic資訊中,由kafka動态維護

【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

leader如何動态維護ISR?

【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

replica.lag.max.messages 預設值4000

如果某個follower副本落後leader副本的消息數超過了這個值,那麼leader副本就會把該follower副本從ISR中移除。

在0.9之後的版本中已經移除。

存在問題,生産者批量産生多餘4000條的消息,發送給leader,此時ISR中所有的follower副本全部落後于leader,都會被剔除ISR。然後又要有新的follower副本加入ISR(問題:頻繁操作ISR,還要操作zookeeper)。

replica.lag.time.max.ms

follower副本響應leader副本的最長等待時間。超過這個時間将會從ISR中移除。

生産者生産消息進行投遞——>分區中的leader——>通知到ISR中所有的follower副本進行同步資料——>ISR中所有的follower告知leader同步完成——>leader傳回ack——>生産者

[x] acks 生産者投遞消息的ACK的級别設定

如果需要等到ISR所有的follower副本傳回消息leader,可能需要等待,便産生了不同的ack可靠性級别

acks=0 消費者隻管投遞消息,leader一接收到消息還沒有寫入磁盤就傳回ack。

優點:延遲性最低

缺點:如果接收到消息後leader沒有寫入磁盤就挂掉,從ISR中的follower新選舉leader後,會丢失資料。

acks=1 消費者隻等到leader寫入磁盤完成,不管follower副本是否同步完成,就傳回ack。

問題:leader寫入磁盤完成後挂掉了,ISR中的follower還沒有來得及同步。從ISR中的follower新選舉leader後,會丢失資料。

acks=-1或者all

消費者投遞消息後,等待leader和ISR中所有的follower副本同步完成,leader才傳回ack。

優點:leader和ISR中所有的follower都同步完成,不丢資料,達到副本資料一緻性。

問題:leader在傳回ack之前就挂掉了,會從ISR中的follower中選出leader,此時所有leader+follower資料都一緻。生産者沒有收到leader的ack回應會重試投遞,會造成資料重複。

[x] leader、follower故障處理

【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

log中每個消息都會有對應一個offset偏移量。

HW 高水位線(High Watermark), LEO 日志尾部偏移量(Log End Offset)

leader與ISR中所有的follower的檔案的最小LEO為HW。如上圖所示,HW為12。

對于消費者來說,leader中不大與HW的資料才能被consumer可見。如圖所示leader檔案中的0~12可以被消費者所見。

[x] 分區中ISR中的某follower副本挂掉後,leader會将該follower副本剔除ISR。

待該follower恢複後,讀取本地磁盤記錄的上次HW,并将檔案大于HW的部分截取掉,從HW位置開始請求向leader同步。當follower的LEO達到該分區partition的HW時候(即該follower趕上了leader),就可以重新加入到ISR中。

leader選舉機制的實作

[x] 分區中的leader挂掉後,需要從ISR的follower副本中選舉出新的leader。

【kafka】生産者消息投遞可靠性(ACK機制,ISR機制,leader選舉機制)

圖示HW為9,消費者隻能看到0~9

假如leader挂掉了,選舉follower2為leader,那麼以新leader通知其他節點以HW 9為基準,超過HW的部分需要截取掉,leader自身的(LEO為11 大于HW 9)不用截取掉。然後從新的leader開始同步。

**

保證了副本資料之間的一緻性

保證了消費者消費資料的一緻性

不能保證資料投遞不丢失或者不重複。**