ISR and ARISR 的伸縮性HW 、 LEOISR and AR
簡單來說,分割槽中的所有副本統稱為 AR (Assigned Replicas)。所有與leader副本保持一定程度同步的副本(包括leader副本在內)組成 ISR (In Sync Replicas)。 ISR 集合是 AR 集合的一個子集。訊息會先發送到leader副本,然後follower副本才能從leader中拉取訊息進行同步。同步期間,follow副本相對於leader副本而言會有一定程度的滯後。前面所說的 ”一定程度同步“ 是指可忍受的滯後範圍,這個範圍可以透過引數進行配置。於leader副本同步滯後過多的副本(不包括leader副本)將組成 OSR (Out-of-Sync Replied)由此可見,AR = ISR + OSR。正常情況下,所有的follower副本都應該與leader 副本保持 一定程度的同步,即AR=ISR,OSR集合為空。
ISR 的伸縮性leader副本負責維護和跟蹤 ISR 集合中所有follower副本的滯後狀態,當follower副本落後太多或失效時,leader副本會把它從 ISR 集合中剔除。如果 OSR 集合中所有follower副本“追上”了leader副本,那麼leader副本會把它從 OSR 集合轉移至 ISR 集合。預設情況下,當leader副本發生故障時,只有在 ISR 集合中的follower副本才有資格被選舉為新的leader,而在 OSR 集合中的副本則沒有任何機會(不過這個可以透過配置來改變)。
HW 與LEOHW 、 LEO 等概念和上一篇文章所說的 ISR有著緊密的關係,如果不瞭解 ISR 可以先看下ISR相關的介紹。
HW (High Watermark)俗稱高水位,它標識了一個特定的訊息偏移量(offset),消費者只能拉取到這個offset之前的訊息。
下圖表示一個日誌檔案,這個日誌檔案中只有9條訊息,第一條訊息的offset(LogStartOffset)為0,最有一條訊息的offset為8,offset為9的訊息使用虛線表示的,代表下一條待寫入的訊息。日誌檔案的 HW 為6,表示消費者只能拉取offset在 0 到 5 之間的訊息,offset為6的訊息對消費者而言是不可見的。
LEO (Log End Offset),標識當前日誌檔案中下一條待寫入的訊息的offset。上圖中offset為9的位置即為當前日誌檔案的 LEO,LEO 的大小相當於當前日誌分割槽中最後一條訊息的offset值加1.分割槽 ISR 集合中的每個副本都會維護自身的 LEO ,而 ISR 集合中最小的 LEO 即為分割槽的 HW,對消費者而言只能消費 HW 之前的訊息。
下面具體分析一下 ISR 集合和 HW、LEO的關係。
假設某分割槽的 ISR 集合中有 3 個副本,即一個 leader 副本和 2 個 follower 副本,此時分割槽的 LEO 和 HW 都分別為 3 。訊息3和訊息4從生產者出發之後先被存入leader副本。
在訊息被寫入leader副本之後,follower副本會發送拉取請求來拉取訊息3和訊息4進行訊息同步。
在同步過程中不同的副本同步的效率不盡相同,在某一時刻follower1完全跟上了leader副本而follower2只同步了訊息3,如此leader副本的LEO為5,follower1的LEO為5,follower2的LEO 為4,那麼當前分割槽的HW取最小值4,此時消費者可以消費到offset0至3之間的訊息。
當所有副本都成功寫入訊息3和訊息4之後,整個分割槽的HW和LEO都變為5,因此消費者可以消費到offset為4的訊息了。
由此可見kafka的複製機制既不是完全的同步複製,也不是單純的非同步複製。事實上,同步複製要求所有能工作的follower副本都複製完,這條訊息才會被確認已成功提交,這種複製方式極大的影響了效能。而在非同步複製的方式下,follower副本非同步的從leader副本中複製資料,資料只要被leader副本寫入就會被認為已經成功提交。在這種情況下,如果follower副本都還沒有複製完而落後於leader副本,然後leader副本宕機,則會造成資料丟失。kafka使用這種ISR的方式有效的權衡了資料可靠性和效能之間的關係。
轉: