kafka入門 第十一 篇副本機制詳解


所謂的副本機制(Replication),也可以稱之為備份機制,通常是指分布式系統在多台互聯網的機器上保存相同的數據拷貝。副本機制有什么好處么?
  1. 提供數據冗余:即使系統部分組件失效,系統依然能夠繼續運轉,因而增加了整體可用性以及數據持久性
  2. 提供高伸縮性:支持橫向擴展,能夠通過添加機器的方式來提升讀的性能,進而提高讀操作吞吐量
  3. 改善數據局部性:允許將數據放入與用戶地理位置相近的地方,從而降低系統延時
這些有優點都是在分布式系統教科書中最長被提及的,但是有些遺憾的是在kafka中目前只能享受到副本機制帶來的第1個好處,也就是提供數據冗余備份。
副本定義
kafka是有主題概念的,而每一個主題又進一步划分成若干個分區。副本的概念實際上是在分區層級下定義的,每個分區配置有多若干個副本。
所謂的副本,本質上就是一個只能追加寫消息的提交日志,根據kafka副本機制的定義,同一個分區下的所有副本保存有相同的消息序列,這些副本分散的保存在不同的Broker上,從而能夠對抗部分Broker宕機帶來的數據不可用。
副本角色:
既然分區下面有很多副本,而且這些副本的內容換還要保持一致,消息同步最常見的解決方案就是采用基於領導者(Leader-based)的副本機制。kafka就是這樣設計的。
第一,在kafka中,副本分成倆類:領導者副本和追隨者副本。每個分區都要在創建的時候都要選舉一個副本,稱為領導者副本,其余的副本自動稱為追隨者副本。
第二,在kafka中,追隨者副本是不對外提供服務的。這就是說,任何一個追隨者副本都不能響應消費者和生產者的讀寫請求。所有的請求都必須由領導者來處理。最隨着位移的任務就是從領導者副本異步拉取消息,並且寫入到自己的提交日志中,從而實現與領導者副本的同步。
第三,當領導者副本掛掉了,kafka以根據zookeeper在追隨者副本中重新選舉一個領導者副本出來,老的領導者副本恢復之后稱為新的追隨着。
kafka追隨者副本不對外提供服務,那么就不能實現副本機制的另外倆個優勢,這是為什么呢?其實有下面倆個好處:
1.方便實現“Read-your-write”
所謂的“Read-you-write”,顧名思義就是,當你使用生產者API向kafka成功寫入消息之后,馬上使用消費者API去讀取剛才的消息。當你寫完一條消息之后,你肯定希望立即就能看到他,典型的場景就是微博和微信朋友圈。如果允許追隨者副本對外提供服務,由於副本同步是異步的,因此有可能出現追隨在副本還沒有從領導者副本哪里拉取最新的消息,從而導致客戶端看不到最新寫入的消息
2.方便實現單調讀(Monotonic Reads)
什么是單調讀?就是對於一個消費來說,在多次消費之后,它不會看到某條消息一會兒存在一會兒不存在。
如果允許追隨者副本提供讀服務,那么假設當前有個2個副本追隨者F1和F2,他們異步地的拉取領導者副本數據。倘若F1拉去了Leader最新的消息而F2還未及時拉取,那么,此時如果有一個小消費者先從F1服務消息之后又從F2拉取消息,他可能會看到這樣的現象:第一次消費時看到的最新消息在第二次消費時不見了,這就不是但調讀一致性。但是,如果所有的請求都是由Leader來處理,那么kafka就很容易實現單調讀一致性。
 
In-sync Replicas(ISR)
由於kafka副本是異步進行的數據同步,那么就有可能出現數據庫同步不一致的問題,這個時候kafka要明確告訴我們,追隨者副本到底在什么條件下才算與Leader同步。
基於這個想法,kafka引入了In-sync Replice ,也就是所謂的ISR副本集合。ISR中的副本都是與Leader同步的副本,不在ISR的追隨者副本被認為是與Leader不同步的。
我么首先要明確的是,Leader副本天然就在ISR中,也是就是說,ISR不只是追隨者副本集合,它必然包含Leader副本。甚至在某些情況下,ISR中只有Leader這一個副本。
另外,能過進入到ISR的追隨者副本滿足一定條件,至於是很么條件,先買個關子,我們先來一起看看下面這張圖:
這個額標准就是Broker端參數replica.lag.time.max.ms參數。這個參數的含義是Follower副本能夠落后Leader副本的最長時間間隔,當前默認是10s。就是說,只要一個Follower副本落后Leader副本的時間不連續超過10s,那么kakfa就認為該Follower副本與Follower是同步的,即使此時Follower副本中保存的消息明顯少於Leader副本中的消息。
我們在前面說過,Follower副本位移的工作即使不斷的從Leader中拉取消息,然后寫入到自己的日志中。如果這個同步過程的速度持續慢於Leader副本的消息寫入速度,那么在replica.lag.time.max.ms時間后,此Follower副本就會被認為是與Leader不同步的,因此不能在放入ISR中。此時,kafka會自動收縮ISR集合,將該副本“踢出”ISR。倘若該副本后來慢慢的追上了Leader的進度,那么它是能夠重新被追加會ISR的,這表明ISR是一個動態的調整的集合。
Unclean領導者選舉(Unclean Leader Election)
kafka把所有不再ISR中的存活的副本都稱為非同步副本。通常來說,非同步副本落后Leader太多,因此,如果選舉這些非同步副本作為Leader,就可能出現數據的丟失。在kafka中,選舉這種副本的過程稱為Unclean領導者選舉。Broker端參數unclean.leader.election.enable控制是否允許Unclean領導這個選舉。
開啟Unclean領導者選舉會造成數據丟失,但是可以保證服務的可用性。
 
 
 
精彩問答:
問題1:
老師,LEO和HW這兩個概念不理解,能不能詳細說下,謝謝
作者回復: 一個分區有3個副本,一個leader,2個follower。producer向leader寫了10條消息,follower1從leader處拷貝了5條消息,follower2從leader處拷貝了3條消息,那么leader副本的LEO就是10,HW=3;follower1副本的LEO是5。這樣說清楚些嗎
問題2:
這里有兩個問題想請教一下老師:
1.kafka使用replica.lag.max.time.ms來判斷是否保留replica在ISR里,那么問題來了,在吞吐量較高的場景下,replica滿足這個時間限制,但是LEO相差比較大,leader這時候掛掉,這個replica被選舉為新leader,這個時候是不是有一部分數據丟失了?
2.如果問題1確實存在,目前是怎樣處理的呢?
作者回復: 是有這種可能,如果你在意這種情況producer端設置acks=all就可以避免了
問題3:
如果我創建的時候指定有三個副本
1. 如果某一個副本所在的broker掛了,kafka會在另一個broker上面新創建一個partition來補充嗎?
2. 如果這三個副本所在的broker都掛了,那kafka會不會在一個新的broker上面重新創建一個新的partition來支持讀寫,還是說,這個partition就不在工作了?
作者回復: 1. 不會
2. 不工作了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM