一、什么是副本機制:
通常是指分布式系統在多台網絡互聯的機器上保存有相同的數據拷貝
二、副本機制的好處:
1、提供數據冗余
系統部分組件失效,系統依然能夠繼續運轉,因而增加了整體可用性以及數據持久性
2、提供高伸縮性
支持橫向擴展,能夠通過增加機器的方式來提升讀性能,進而提高讀操作吞吐量
3、改善數據局部性
允許將數據放入與用戶地理位置相近的地方,從而降低系統延時。
三、kafka的副本
1、本質就是一個只能追加寫消息的日志文件
2、同一個分區下的所有副本保存有相同的消息序列
3、副本分散保存在不同的 Broker 上,從而能夠對抗部分 Broker 宕機帶來的數據不可用(Kafka 是有若干主題概,每個主題可進一步划分成若干個分區。每個分區配置有若干個副本)
如下:有 3 台 Broker 的 Kafka 集群上的副本分布情況
四、kafka如何保證同一個分區下的所有副本保存有相同的消息序列:
基於領導者(Leader-based)的副本機制
工作原理如圖:
1、Kafka 中分成兩類副本:領導者副本(Leader Replica)和追隨者副本(Follower Replica)。每個分區在創建時都要選舉一個副本,稱為領導者副本,其余的副本自動稱為追隨者副本。
2、Kafka 中,追隨者副本是不對外提供服務的。追隨者副本不處理客戶端請求,它唯一的任務就是從領導者副本,所有的讀寫請求都必須發往領導者副本所在的 Broker,由該 Broker 負責處理。(因此目前kafka只能享受到副本機制帶來的第 1 個好處,也就是提供數據冗余實現高可用性和高持久性)
3、領導者副本所在的 Broker 宕機時,Kafka 依托於 ZooKeeper 提供的監控功能能夠實時感知到,並立即開啟新一輪的領導者選舉,從追隨者副本中選一個作為新的領導者。老 Leader 副本重啟回來后,只能作為追隨者副本加入到集群中。
五、kafka追隨者副本到底在什么條件下才算與 Leader 同步
Kafka 引入了 In-sync Replicas,也就是所謂的 ISR 副本集合。ISR 中的副本都是與 Leader 同步的副本,相反,不在 ISR 中的追隨者副本就被認為是與 Leader 不同步的
六、kafka In-sync Replicas(ISR)
1、ISR不只是追隨者副本集合,它必然包括 Leader 副本。甚至在某些情況下,ISR 只有 Leader 這一個副本
2、通過Broker 端replica.lag.time.max.ms 參數(Follower 副本能夠落后 Leader 副本的最長時間間隔)值來控制哪個追隨者副本與 Leader 同步?只要一個 Follower 副本落后 Leader 副本的時間不連續超過 10 秒,那么 Kafka 就認為該 Follower 副本與 Leader 是同步的,即使此時 Follower 副本中保存的消息明顯少於 Leader 副本中的消息。
3、ISR 是一個動態調整的集合,而非靜態不變的。
某個追隨者副本從領導者副本中拉取數據的過程持續慢於 Leader 副本的消息寫入速度,那么在 replica.lag.time.max.ms 時間后,此 Follower 副本就會被認為是與 Leader 副本不同步的,因此不能再放入 ISR 中。此時,Kafka 會自動收縮 ISR 集合,將該副本“踢出”ISR。
倘若該副本后面慢慢地追上了 Leader 的進度,那么它是能夠重新被加回 ISR 的。
4、ISR集合為空則leader副本也掛了,這個分區就不可用了,producer也無法向這個分區發送任何消息了。(反之leader副本掛了可以從ISR集合中選舉leader副本)
七、kafka leader副本所在broker掛了,leader副本如何選舉
1、ISR不為空,從ISR中選舉
2、ISR為空,Kafka也可以從不在 ISR 中的存活副本中選舉,這個過程稱為Unclean 領導者選舉,通過Broker 端參數 unclean.leader.election.enable 控制是否允許 Unclean 領導者選舉。開啟 Unclean 領導者選舉可能會造成數據丟失,但好處是,它使得分區 Leader 副本一直存在,不至於停止對外提供服務,因此提升了高可用性。反之,禁止 Unclean 領導者選舉的好處在於維護了數據的一致性,避免了消息丟失,但犧牲了高可用性。
一個分布式系統通常只能同時滿足一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)中的兩個。顯然,在這個問題上,Kafka 賦予你選擇 C 或 A 的權利。
強烈建議不要開啟unclean leader election,畢竟我們還可以通過其他的方式來提升高可用性。如果為了這點兒高可用性的改善,犧牲了數據一致性,那就非常不值當了。
ps1:leader副本的選舉也可以理解為分區leader的選舉
ps2:broker的leader選舉與分區leader的選舉不同,
Kafka的Leader選舉是通過在zookeeper上創建/controller臨時節點來實現leader選舉,並在該節點中寫入當前broker的信息
{“version”:1,”brokerid”:1,”timestamp”:”1512018424988”}
利用Zookeeper的強一致性特性,一個節點只能被一個客戶端創建成功,創建成功的broker即為leader,即先到先得原則,leader也就是集群中的controller,負責集群中所有大小事務。
當leader和zookeeper失去連接時,臨時節點會刪除,而其他broker會監聽該節點的變化,當節點刪除時,其他broker會收到事件通知,重新發起leader選舉
八、如果允許 Follower 副本對外提供讀服務,你覺得應該如何避免或緩解因 Follower 副本與 Leader 副本不同步而導致的數據不一致的情形?
.......