kafka中topic的每個partition有乙個預寫式日誌檔案,每個partition都由一系列有序的、不可變的訊息組成,這些訊息被連續的追加到partition中,partition中的每個訊息都有乙個連續的序列號叫做offset,確定他在partition中的唯一位置。
kafka每個topic的partition有n個副本,其中n是topic的複製因子,kafka通過多副本機制實現故障自動轉移,當kafka集群中乙個broker失效情況下,仍可保證服務可用。在kafka中發生複製時確保partition的預寫式日誌有序地寫到其他節點上。n個replicas中,其中乙個replica為leader,其他都為follower,leader處理partition的所有讀寫請求,與此同時,follower會被動定期地區複製leader上的資料。
如下圖,kafka集群中有4個broker,某topic有3個partition,且複製因子即副本個數也為3:
kafka提供了資料複製演算法,如果leader發生故障或掛掉,乙個新leader被選舉並被接受客戶端的訊息成功寫入。kafka確保從同步副本列表中選舉乙個副本為leader,或者說follower追趕leader資料。leader負責維護和根據isr(in-sync replicas的縮寫,表示副本同步佇列)中所有訊息,follower之後的樁體。當producer傳送一條訊息到broker後,leader寫入訊息,並複製到所有follower。訊息提交之後才被成功複製到所有的同步副本。訊息複製延遲受最慢的follower限制,重要的是快速檢測慢副本,如果follower「落後」太多或者失敗,leader將會把他從isr中刪除。
所謂同步,必須滿足兩個條件:
預設情況下,kafka topic的replica數量為1,即每個partition都有乙個唯一的leader,為了確保訊息的可靠性,通常應用中將其值(由broker的引數offsets.topic.replication.factor指定)大小設定為1。所有的副本(replicas)統稱為ar (assigned replicas)。isr是ar的乙個子集,由leader維護isr列表,follower從leader同步資料有一些延遲,任意乙個超過閾值都會把follower踢出isr,存入osr(outof-sync replicas)列表,新加入的follower也會先存放到osr中。ar = isr + osr
hw(highwatermark)俗稱高水位,取乙個partition對應的isr中最小的leo作為hw,consumer最多只能消費到hw所在的位置。另外每個replica都有hw,leader和follower各自負責更新自己的hw的狀態。對於leader新寫入的訊息,consumer不能立即消費,leader會等待該訊息被所有isr中的replicas都同步後,才更新hw,此時訊息才能被consumer消費,這樣就保證了如果leader所在的broker失效,該訊息仍可從新選舉的leader中獲取。對於來自內部的broker的讀取請求,沒有hw的限制。
下圖詳細說明了當producer生產訊息到broker後,isr及hw和leo(log end offset)的流轉過程:
由此可見,kafka的複製機制既不是完全的同步複製,也不是單純的非同步複製。事實上,同步機制要求所有能工作的follower都複製完,這條訊息才會被commit,這種複製方式極大的影響了吞吐率。而非同步複製方式下,follower非同步的從leader複製資料,資料只要被leader寫入log就被任務已經commit,這種情況下如果follower沒有全複製完,落後與leader,突然leader宕機,則會丟資料。而kafka這種使用isr的方式則很好的均衡了確保資料不丟失以及吞吐率。
kafka的isr管理最終都會反饋到zookeeper節點上,具體位置為:
/brokers/topics/[topic]/partitions/[partition]/state。目前有兩個地方會對這個zookeeper節點進行維護:
1)controller維護:kafka集群中的其中乙個broker會被選舉為controller,主要負責partition管理和副本狀態管理,也會執行類似於重分配partition之類的管理任務。在符合某些特定條件下,controller下的leaderselector會選舉新的leader, isr和新的leader_epoch及controller_epoch寫入zookeeper的相關節點中。同時發起leaderandisrrequest通知所有的replicas。
副本不同的異常情況:
1)慢副本:在一定週期時間內,follower不能追趕上leader。最常見的原因之一是io瓶頸導致follower追加複製訊息速度鰻魚從leader拉取速度
2)卡住副本:在一定週期時間內,follower停止從leader拉取請求。follower replica卡住了是由於gc暫停或follower失效或死亡。
3)新啟動副本:當使用者給topic增加副本因子時,新的follower不再同步副本列表中,直到他們完全追趕上leader日誌。
Kafka副本同步機制
引用自 kafka中主題的每個partition有乙個預寫式日誌檔案,每個partition都由一系列有序的 不可變的訊息組成,這些訊息被連續的追加到partition中,partition中的每個訊息都有乙個連續的序列號叫做offset,確定它在分割槽日誌中唯一的位置 kafka的每個topic的...
Kafka ISR 副本同步機制
isr in sync replica 就是 kafka 為某個分割槽維護的一組同步集合,即每個分割槽都有自己的乙個 isr 集合,處於 isr 集合中的副本,意味著 follower 副本與 leader 副本保持同步狀態,只有處於 isr 集合中的副本才有資格被選舉為 leader。一條 kaf...
kafka 副本機制
kafka通過副本機制保證資料的可靠性 一.副本機制的概念如下 1.乙個partition有多個副本replication,一般是3個或5個 2.每個副本位於不通的broker 3.每個副本集合裡有乙個leader副本,其餘的為follower副本,只有leader副本才接受讀寫請求,followe...