kafka:topic为什么要进行分区?副本机制是如何做的?
kafka為什么要在topic里加入分區(qū)的概念?如果沒有分區(qū),topic中的segment消息寫滿后,直接給訂閱者不是也可以嗎?
Kafka可以將主題劃分為多個分區(qū)(Partition),會根據分區(qū)規(guī)則選擇把消息存儲到哪個分區(qū)中,只要如果分區(qū)規(guī)則設置的合理,那么所有的消息將會被均勻的分布到不同的分區(qū)中,這樣就實現了負載均衡和水平擴展。另外,多個訂閱者可以從一個或者多個分區(qū)中同時消費數據,以支撐海量數據處理能力:
Kafka的設計也是源自生活,好比是為公路運輸,不同的起始點和目的地需要修不同高速公路(主題),高速公路上可以提供多條車道(分區(qū)),流量大的公路多修幾條車道保證暢通,流量小的公路少修幾條車道避免浪費。收費站好比消費者,車多的時候多開幾個一起收費避免堵在路上,車少的時候開幾個讓汽車并道就好了,嗯……
順便說一句,由于消息是以追加到分區(qū)中的,多個分區(qū)順序寫磁盤的總效率要比隨機寫內存還要高(引用Apache Kafka – A High Throughput Distributed Messaging System的觀點),是Kafka高吞吐率的重要保證之一。
為了保證數據的可靠性,Kafka會給每個分區(qū)找一個節(jié)點當帶頭大哥(Leader),以及若干個節(jié)點當隨從(Follower)。消息寫入分區(qū)時,帶頭大哥除了自己復制一份外還會復制到多個隨從。如果隨從掛了,Kafka會再找一個隨從從帶頭大哥那里同步歷史消息;如果帶頭大哥掛了,隨從中會選舉出新一任的帶頭大哥,繼續(xù)笑傲江湖。
詳見下:卡夫卡的副本機制。?
觀點2:
這里其實有2個問題,可以逐一回答 ?
1.kafka為什么要在topic里加入分區(qū)的概念? topic是邏輯的概念,partition是物理的概念,對用戶來說是透明的。
producer只需要關心消息發(fā)往哪個topic,而consumer只關心自己訂閱哪個topic,并不關心每條消息存于整個集群的哪個broker。 ?為了性能考慮,如果topic內的消息只存于一個broker,那這個broker會成為瓶頸,無法做到水平擴展。
所以把topic內的數據分布到整個集群就是一個自然而然的設計方式。
Partition的引入就是解決水平擴展問題的一個方案。 ?
如同我在Kafka設計解析(一)里所講,每個partition可以被認為是一個無限長度的數組,新數據順序追加進這個數組。
物理上,每個partition對應于一個文件夾。一個broker上可以存放多個partition。
這樣,producer可以將數據發(fā)送給多個broker上的多個partition,consumer也可以并行從多個broker上的不同paritition上讀數據,實現了水平擴展 ?
2.如果沒有分區(qū),topic中的segment消息寫滿后,直接給訂閱者不是也可以嗎 ?
“segment消息寫滿后”,consume消費數據并不需要等到segment寫滿,只要有一條數據被commit,就可以立馬被消費 ?
segment對應一個文件(實現上對應2個文件,一個數據文件,一個索引文件),一個partition對應一個文件夾,一個partition里理論上可以包含任意多個segment。
所以partition可以認為是在segment上做了一層包裝。
?這個問題換個角度問可能更好,“為什么有了partition還需要segment”。
如果不引入segment,一個partition直接對應一個文件(應該說兩個文件,一個數據文件,一個索引文件),那這個文件會一直增大。
同時,在做data purge時,需要把文件的前面部分給刪除,不符合kafka對文件的順序寫優(yōu)化設計方案。
引入segment后,每次做data purge,只需要把舊的segment整個文件刪除即可,保證了每個segment的順序寫,?
參考:kafka中的topic為什么要進行分區(qū)? - 知乎?
卡夫卡的副本機制
? ? 由于Producer和Consumer都只會與Leader角色的分區(qū)副本相連,所以kafka需要以集群的組織形式提供主題下的消息高可用。kafka支持主備復制,所以消息具備高可用和持久性。
? ? 一個分區(qū)可以有多個副本,這些副本保存在不同的broker上。每個分區(qū)的副本中都會有一個作為Leader。當一個broker失敗時,Leader在這臺broker上的分區(qū)都會變得不可用,kafka會自動移除Leader,再其他副本中選一個作為新的Leader。
在通常情況下,增加分區(qū)可以提供kafka集群的吞吐量。然而,也應該意識到集群的總分區(qū)數或是單臺服務器上的分區(qū)數過多,會增加不可用及延遲的風險。
創(chuàng)建副本的2種模式——同步復制和異步復制
kafka動態(tài)維護了一個同步狀態(tài)的副本的集合(a set of In-Sync Replicas),簡稱ISR。
在這個集合中的節(jié)點都是和leader保持高度一致的,任何一條消息只有被這個集合中的每個節(jié)點讀取并追加到日志中,才會向外部通知說“這個消息已經被提交”。
只有當消息被所有的副本加入到日志中時,才算是“committed”,只有committed的消息才會發(fā)送給consumer,這樣就不用擔心一旦leader down掉了消息會丟失。
消息從leader復制到follower, 我們可以通過決定producer是否等待消息被提交的通知(ack)來區(qū)分同步復制和異步復制。
如果等待ack則為同步,如果不需要等待所有follower復制完成即回傳ack則為異步模式。
同步復制:
????????????? 1.producer聯系zk識別leader
????????????? 2.向leader發(fā)送消息
????????????? 3.leadr收到消息寫入到本地log
????????????? 4.follower從leader pull消息
????????????? 5.follower向本地寫入log
????????????? 6.follower向leader發(fā)送ack消息
????????????? 7.leader收到所有follower的ack消息
????????????? 8.leader向producer回傳ack
異步復制:
????????????? 和同步復制的區(qū)別在于,leader寫入本地log之后,
????????????? 直接向client回傳ack消息,不需要等待所有follower復制完成。
卡夫卡支持副本模式,那么其中一個broker里的掛掉,一個新的leader就能通過ISR機制推選出來,繼續(xù)處理讀寫請求。
Kafka集群partition?replication默認自動分配分析
下面以一個Kafka集群中4個Broker舉例,創(chuàng)建1個topic包含4個Partition,2 Replication;數據Producer流動如圖所示:
(1)
(2)當集群中新增2節(jié)點,Partition增加到6個時分布情況如下:
副本分配邏輯規(guī)則如下:
- 在Kafka集群中,每個Broker都有均等分配Partition的Leader機會。
- 上述圖Broker Partition中,箭頭指向為副本,以Partition-0為例:broker1中parition-0為Leader,Broker2中Partition-0為副本。
- 上述圖中每個Broker(按照BrokerId有序)依次分配主Partition,下一個Broker為副本,如此循環(huán)迭代分配,多副本都遵循此規(guī)則。
副本分配算法如下:
- 將所有N Broker和待分配的i個Partition排序.
- 將第i個Partition分配到第(i mod n)個Broker上.
- 將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker上.
總結
以上是生活随笔為你收集整理的kafka:topic为什么要进行分区?副本机制是如何做的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES学习笔记之-ClusterState
- 下一篇: zcmu-1958