Kafka副本與ISR設計(I)

在Kafka中一個分區日誌其實就是一個備份日誌,kafka利用多個相同備份日誌來提升系統的可用性。這些備份日誌其實就是所謂的副本。網絡

Kafka的副本具備leader副本和follower副本之分,leader副本爲客戶端提供讀寫請求,follower副本只是用於被動地從leader副本中同步數據,對外不提供讀寫服務。spa

Kafka的全部節點全部副本假設都在正常運行,那麼leader副本會一直不變,可是所謂世界上沒有絕對穩定的系統,一旦kafa的leader副本節點出現了問題,那麼follower副本須要競爭上崗成爲leader副本,可是並非全部的follower副本都有資格競爭上崗,很明顯假設一個follower落後的數據遠遠少於leader副本,它是沒有資格的。所以Kafka內部維護了一組具備資格的follower副本,他們統稱ISR。日誌

ISR中的副本會被剔除,也會有新增。blog

關鍵的概念點

下圖主要講述了Kafka日誌中重要概念,下圖的相關概念事關生產、消息消費、ISR以及副本同步機制。
1.png進程

  • 首條消息位移(offset):保存了該副本中所含的第一條消息的offset
  • 日誌高水印值(HW):leader副本的HW決定了消費者所能消費的消息範圍,低於等於HW的消息都可被消費者消費
  • 結束位移(LEO):LEO老是指向下一條消息寫入的位置,處在leader的HW和LEO之間的消息表示還未徹底備份。只有全部處於ISR中副本都更新了本身LEO之後,leader的HW纔會右移表示寫入消息成功。

ISR

ISR其實就是Kafka內部維護的具備競爭上崗的一組與leader同步follower的副本集合。rem

follower副本與leader副本不一樣步的緣由:kafka

  • 同步數據請求速度追不上:follower副本在一段時間沒法追上leader副本端的消息接收速度。好比follower副本的網絡I/O阻塞,這回致使follower副本同步leader副本的速度大大下降
  • 進程卡住:follower副本一段時間沒法向leader發出請求,好比follower頻繁的進行GC
  • 新建立的副本:用戶主動增長副本數,新建立的副本在啓動後會追趕leader的進度,這段時間新增的follower副本一般與leader副本是不一樣步的
replica.lag.max.messages

該參數用來檢測同步數據請求速度追不上的問題,若是ISR中的副本消息數落後於leader副本的消息數超過了該參數的設置,將會被踢出ISR。同步

這個參數在kafka0.9.0.9版本以後被移除,爲何被移除呢?it

確定是有他的弊端的。考慮如下這個狀況,kafka在的生產者的生產速率不是平穩的,會有高峯會有低峯,在高峯的時候,因爲消息大量彙集產生,致使ISR中的消息與Leader的消息差超過了該數值,所以ISR中的副本將會被踢出。class

但隨着生產消息速率的穩定和降低,而且此時follower副本也在全力追趕leader副本,當follower副本從新追上leader副本時,又會從新加入ISR。

replica.lag.max.ms

該參數用來檢測另兩種狀況:若是在該時間內,follower副本沒法向leader副本請求數據,那麼將會被踢出ISR。

因爲在新的版本中移除了replica.lag.max.messages參數的設置,所以replica.lag.max.ms也用於同步數據請求速度追不上問題的檢測,但用在次問題的檢測上時,檢測機制是隻要follower副本落後於leader的時間不持續性超過該參數即視爲同步,若是持續性超過該參數即視爲不一樣步。

相關文章
相關標籤/搜索