Kafka中失效副本與ISR伸縮流程
何為失效副本?
失效副本中的失效包括功能失效和同步失效。
其中,同步失效主要與配置引數replica.lag.time.max.ms 以及副本同步引數lastCaughtUpTimeMs 有關。同步失效的副本會被踢出ISR集合。
一般有兩種情況會導致副本失效:
- follower副本程式卡住,在一段時間內根本沒有向leader副本發起同步請求,比如頻繁的Full GC。
- follower副本程式同步過慢,在一段時間內都無法追趕上leader副本,比如IO開銷過大。
ISR 伸縮
ISR 集合的縮減
1、isr-expiration定時任務會週期性的檢測每個分割槽是否需要縮減其ISR集合,當檢測到ISR中有是失效的副本的時候,就會縮減ISR集合;
2、將變更後的資料記錄到ZooKerper對應/brokers/topics//partition//state節點;
3、將變更後的資料快取到isrChangeSet;
4、isr-change-propagation定時任務會週期性(固定值為2500ms)地檢查isrChangeSet,在zk 中的 /isr_change_notification 節點下建立isr_change開頭的持久順序節點,並儲存isrChangeSet 的資料;
5、kafka控制器為/isr_change_notification添加了一個Watcher,當這個節點中有子節點發生變化的時候會觸發Watcher動作,以此通知控制器更新相關的元資料資訊
ISR 集合的增加
何時擴充ISR的?
隨著follower副本不斷進行訊息同步,follower副本LEO也會逐漸後移,並且最終趕上leader副本,此時follower副本就有資格進入ISR集合,追趕上leader副本的判定準側是此副本的LEO是否大於等於leader副本HW。
1、更新ZooKeeper中的/broker/topics//partition//state節點和isrChangeSet
之後的操作同ISR 集合的縮減。
頻繁的觸發Watcher會影響kafka控制器,zookeeper甚至其他的broker效能。為了避免這種情況,kafka添加了指定的條件,當檢測到分割槽ISR集合發生變化的時候,還需要檢查一下兩個條件: (1).上一次ISR集合發生變化距離現在已經超過5秒, (2).上一次寫入zookeeper的時候距離現在已經超過60秒。 滿足以上兩個條件之一者可以將ISR寫入集合的變化的目標節點。