副本機制就是備份機制,指的是在分佈式集羣機器中保存着相同的數據備份。mysql
那麼副本機制的好處的是什麼呢?sql
總之: 副本機制是kafka確保系統高可用和高持久的重要基石。api
所謂副本,本質上就是一個只能追加寫消息的提交日誌。這些日誌被相同的分散保存在不一樣的Broker上。
在實際生產上,每臺Broker均可能保存有各個主題下不一樣分區的不一樣副本。所以單個Broker上存有成百上千個副本現象是很是正常的。
既然多個Broker中保存分區下的多個副本,那麼是如何保證副本當中的數據都是一致的呢? 異步
針對這個問題,kafka的解決方案就是領導者副本機制分佈式
領導者的副本機制工做原理
必定注意上面第二點,追隨者副本是不會對外提供服務的。這也是kafka沒能提供讀操做橫向擴展的根本緣由,並且它也不像mysql副本同樣有」抗讀「的做用,幫助領導者減輕壓力。那麼這種副本機制設計究竟有什麼好處呢?
1.方便實現「Read-your-writes」spa
顧名思義,就是當你使用生產者api向kafka成功寫入消息後,就立刻使用消費者api去讀取剛纔的消息。
舉個例子,就是你剛發完一條微博,確定是但願立馬可以看到的。這就是Read-your-writes場景了。若是追隨者副本對外提供服務的話,因爲副本同步是異步的,所以有可能發生追隨者副本尚未及時從領導者副本中拉取最新消息,從而使客戶端看不到最新的消息。
2.方便實現單調讀設計
什麼是單調讀。單調讀就是消費者在屢次讀消息時候,不會看到一條消息一下子存在一下子不存在。
例如:若是容許追隨者副本提供讀服務,那麼假設當前有兩個追隨者副本F1,F2。生產者往領導者中發送了消息後,F1,F2開始異步拉取消息。若F1拉取成功了,而F2還未拉取成功。此時消費者第一次消費F1副本獲取最新消息,第二次消費的時候消費到了F2副本。就獲取不到該條消息了。這就不是單調讀一致性。因此都由Leader副原本處理請求的話,就能實現單調讀。
上文說起到的追隨者副本不對外提供服務,只是按期的異步拉取消息。既然是異步的,那麼就存在着不可能與Leader實時同步的風險。因此kafka應該告訴咱們,追隨者副本到底在什麼條件之下才算與Leader同步。3d
基於這個想法,kafka引入了ISR,副本集合。ISR中的副本都是與Leader同步的副本,相反,不在ISR中的追隨者副本被認爲是與Leader不一樣步的。那麼進入ISR到底須要知足什麼條件才能進入呢。日誌
首先須要明確一點。ISR不僅是追隨者副本集合,它必然包括Leader副本。甚至在某些狀況下,ISR只有Leader這一個副本。blog
圖中有3個副本:1個領導者副本,2個追隨者副本。領導者副本寫入了10條消息,F1同步了6條,F3同步了3條。那麼哪一個追隨者副本與Leader不一樣步呢?
事實上,這兩個副本都有可能與Leader副本不一樣步,但也可能同步。它實際上不是依靠與消息條數來進行判斷的。 而是根據Broker端參數replica.lag.time.max.ms參數值。這個參數的含義就是Follower副本可以落後Leader副本的最長時間間隔,當前默認值是10秒。
這就是說,只要一個 Follower 副本落後 Leader 副本的時間不連續超過 10 秒,那麼 Kafka 就認爲該 Follower 副本與 Leader 是同步的,即便此時 Follower 副本中保存的消息明顯少於 Leader 副本中的消息。如果同步過程的速度持續慢於Leadr副本的寫入速度,那麼在replica.lag.time.max.ms時間後,kafka就會自動收縮ISR集合,將改副本提出集合。
值得注意的是,若改副本後面慢慢追上了Leader的進度。那麼它是能夠被從新放入ISR集合中的。這也代表ISR是一個動態調整的集合,而非靜態不變的。
既然ISR能夠動態調整,那麼就會出現ISR爲空的狀況。ISR爲空的狀況就表明Leader副本也掛掉了。那麼kafka就須要從新選舉新的Leader。
那麼該怎麼選舉Leader呢?
- kafka把全部不在ISR的存活副本都成爲非同步副本。
- 一般來講,非同步副本落後Leader太多,所以,若是選擇這些副本爲新的Leader,就可能出現數據的丟失。在kafka,選舉Leader這種過程被成爲Unclean。由Broker端參數unclean.leader.election.enable控制是否容許Unclean領導者選舉。
- 開啓 Unclean 領導者選舉可能會形成數據丟失,但好處是,它使得分區 Leader 副本一直存在,不至於中止對外提供服務,所以提高了高可用性。反之,禁止 Unclean 領導者選舉的好處在於維護了數據的一致性,避免了消息丟失,但犧牲了高可用性。
能夠根據你的實際業務場景決定是否開啓 Unclean 領導者選舉。不過並不建議開啓它,畢竟咱們還能夠經過其餘的方式來提高高可用性。若是爲了這點兒高可用性的改善,犧牲了數據一致性,那就很是不值當了。