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

爲了保證producer的消息能可靠的投遞到指定的topic,topic的每一個分區partition收到消息後,都須要向producer發送ack(acknowlege確認收到),若是生產者producer收到了ack,則進行下一輪的發送,不然從新發送。ide

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

ACK機制的實現

問題:分區中現有一個leader副本節點和多個follower副本節點,生產者將消息發送過來的時候,什麼時候返回ack給生產者?3d

leader副本負責讀與寫,follower副本同步leader的數據。日誌

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

kafka採用的eader+follower徹底同步機制(ISR中follower),全部節點同步完成才返回ack。kafka

存在問題:leader+follower徹底同步時,假若有1個leader+4個follower,1個leader和3個follower都同步完成,1個follower同步超級慢或者掛掉,會影響返回或者不返回ack。同步

ISR機制的實現it

  • [x] ISR機制

當leader掛掉的時候,由controller會在follower副本中選舉出一個leader。可是這個剩餘follower副本有一個條件,就是follower必須在ISR列表中。io

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

ISR (IN-SYNC Replication) 維護了與leader信息一致的follower副本的信息,當leader掛掉的時候 就從這個ISR中選舉。zookeeper

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開始同步。

**

  • 保證了副本數據之間的一致性
  • 保證了消費者消費數據的一致性
  • 不能保證數據投遞不丟失或者不重複。**
相關文章
相關標籤/搜索