Kafka是LinkedIn 用于日志處理的分布式消息隊(duì)列,同時(shí)支持離線和在線日志處理。
Kafka 對(duì)消息保存時(shí)根據(jù) Topic 進(jìn)行歸類。
發(fā)送消息者就是Producer,消息的發(fā)布描述為Producer
消息接受者就是 Consumer,消息的訂閱描述為 Consumer
每個(gè) Kafka 實(shí)例稱為 Broker,將中間的存儲(chǔ)陣列稱作 Broker(代理),Broker也是kafka集群的節(jié)點(diǎn)
kafka集群包括一個(gè)或者多個(gè)服務(wù)器,這種服務(wù)器被稱為brker。
broker也就是中間的存儲(chǔ)隊(duì)列的節(jié)點(diǎn)實(shí)例。我們將消息發(fā)布者稱為:Produce,將消息的訂閱者稱為:Consumer,將中間的存儲(chǔ)陣列稱為broker。
每條發(fā)布到kafka集群的消息都有一個(gè)類別,這個(gè)類別被成為Tpoic。物理上不同的topic的消息分開存儲(chǔ),邏輯上一個(gè)topic的消息雖然保存與一個(gè)或者多個(gè)broker中。但用戶只需要指定消費(fèi)的topic,即生產(chǎn)或者消費(fèi)數(shù)據(jù)的客戶端不需要關(guān)心數(shù)據(jù)存儲(chǔ)與何處。
kafka中發(fā)布訂閱的對(duì)象就是topic。為每一個(gè)數(shù)據(jù)類型創(chuàng)建一個(gè)topic,把向topic發(fā)布消息的客戶端稱為producer,從topic訂閱消息的客戶端稱為consumer,producer和consumer可以同時(shí)從多個(gè)topic讀寫數(shù)據(jù)。一個(gè)kafka集群由一個(gè)或者多個(gè)broker服務(wù)器組成。他負(fù)責(zé)持久化和備份具體的kafka消息。
topic就是數(shù)據(jù)的主題,是數(shù)據(jù)記錄發(fā)布的地方,可以用來(lái)區(qū)分業(yè)務(wù)系統(tǒng)。kafka中的topics總是多訂閱者模式,一個(gè)topic可以擁有一個(gè)或者多個(gè)消費(fèi)者來(lái)訂閱它的數(shù)據(jù)。
partition是物理的概念,每一個(gè)topic包含一個(gè)或者多個(gè)partition。
topic的分區(qū)策略(針對(duì)寫數(shù)據(jù)的時(shí)候進(jìn)行分區(qū)):
- 輪詢:順序分發(fā),僅針對(duì)于message沒(méi)有key的時(shí)候。
- Hash分區(qū):在message有key的情況下,(key.hash%分區(qū)個(gè)數(shù))。如果在增加分區(qū)的時(shí)候,partition里面的message不會(huì)重新進(jìn)行分配,隨著數(shù)據(jù)的繼續(xù)寫入,這個(gè)新的分區(qū)才會(huì)參與load balance。
topic的分區(qū)邏輯存儲(chǔ)方式:
topic 會(huì)分成一個(gè)或多個(gè) partition,每個(gè) partiton 相當(dāng)于是一個(gè) 子 queue。在物理結(jié)構(gòu)上,每個(gè) partition 對(duì)應(yīng)一個(gè)物理的目錄(文件夾),文件夾命名是 [topicname][partition][序號(hào)],一個(gè) topic 可以有無(wú)數(shù)多的 partition,根據(jù)業(yè)務(wù)需求和數(shù)據(jù)量 來(lái)設(shè)置。在 kafka 配置文件中可隨時(shí)更高 num.partitions 參數(shù)來(lái)配置更改 topic 的 partition 數(shù) 量,在創(chuàng)建 Topic 時(shí)通過(guò)參數(shù)指定 parittion 數(shù)量。Topic 創(chuàng)建之后通過(guò) Kafka 提供的工具也可以修改 partiton 數(shù)量。分區(qū)中存放著數(shù)據(jù)本身和數(shù)據(jù)的index下標(biāo)。在向partition寫入數(shù)據(jù)的時(shí)候,是順序?qū)懭?/strong>的,每一個(gè)數(shù)據(jù)寫入的時(shí)候都會(huì)有一個(gè)類似下標(biāo)的東西(index),隨著數(shù)據(jù)的寫入而增長(zhǎng)。partition也是集群負(fù)載均衡的基本單位。
總結(jié):
- 一個(gè)topic的partition數(shù)量大于等于broker的數(shù)量,可以提高吞吐率。
- 同一個(gè)partition的Replica盡量分散到不同的機(jī)器上,高可用。
- kafka的分區(qū)數(shù):(1|2|3 + 0.95) * broker數(shù)量
負(fù)責(zé)主動(dòng)發(fā)布消息到kakfa broker(push)
kafka消息的保存策略:每個(gè) Topic 被分成多個(gè) partition(區(qū))。每條消息在 partition 中的位置稱為 offset(偏移量),類型為 long 型數(shù)字。消息即使被消費(fèi)了,也不會(huì)被立即刪除, 而是根據(jù) broker 里的設(shè)置(基于時(shí)間存儲(chǔ)或者基于大小),保存一定時(shí)間后再清除,比如 log 文件設(shè)置存儲(chǔ)兩天,則兩天后, 不管消息是否被消費(fèi),都清除。
消息消費(fèi)者,向kafkabroker讀取消息的客戶端。(pull)
消費(fèi)消息的策略:(使用的是roundrabin算法):如果有4個(gè)分區(qū),現(xiàn)在有三個(gè)消費(fèi)者線程,那么這個(gè)三個(gè)線程一人分一個(gè)分區(qū)消費(fèi),最后一個(gè)分區(qū)以輪詢的方式,發(fā)送給第一個(gè)線程消費(fèi),如果此時(shí)又多加入一個(gè)線程,那么就會(huì)將第4個(gè)分區(qū)就分給新加入的線程消費(fèi),如果有一個(gè)線程退出,那么第三個(gè)和第四個(gè)分區(qū)也會(huì)以輪詢的方式,發(fā)送給第一個(gè)線程和第二個(gè)線程消費(fèi)。(kafka內(nèi)部自動(dòng)維護(hù)這個(gè)負(fù)載均衡)。
消費(fèi)的原則:一個(gè)consumer對(duì)一個(gè)partition中的一條數(shù)據(jù)只需要消費(fèi)一次,每一個(gè)consumer組維護(hù)一個(gè)下標(biāo)文件,叫做offset,這個(gè)offset用于記錄當(dāng)前的consumer組消費(fèi)數(shù)據(jù)的下標(biāo),每進(jìn)行消費(fèi)一條數(shù)據(jù),當(dāng)前的offset就會(huì)遞增1(offset之前的數(shù)據(jù),都表示已經(jīng)消費(fèi)過(guò)的數(shù)據(jù))。
一個(gè)consumer group 包含多個(gè)consumer,這個(gè)是預(yù)先在配置文件中配置好的。各個(gè)consumer可以組成一個(gè)租,partition中的每一個(gè)message只能被一個(gè)組中的一個(gè)consumer進(jìn)行消費(fèi),其他的consumer不能消費(fèi)同一個(gè)topic中同一個(gè)分區(qū)的數(shù)據(jù),不同組的consumer可以消費(fèi)同一個(gè)topic的同一個(gè)分區(qū)的數(shù)據(jù)。
廣播和單播:
廣播:所有的consumer每一個(gè)consumer劃分一組
單播:所有的consumer劃分一組(一組中只允許一個(gè)消費(fèi))
對(duì)于kafka消費(fèi)的總結(jié):
- 一個(gè)分區(qū)只能被一個(gè)消費(fèi)者組中的一個(gè)成員消費(fèi)
- 一個(gè)成員可以消費(fèi)一個(gè)topic的多個(gè)分區(qū)
- 一個(gè) Topic 中的每個(gè) Partition 只會(huì)被一個(gè)“Consumer group”中的一個(gè) Consumer 消費(fèi)
- 一個(gè)成員還可以消費(fèi)另外一個(gè)topic的分區(qū)
在kafka文件存儲(chǔ)找中,同一個(gè)topic下有多個(gè)partition,每一個(gè)partition為一個(gè)目錄,partition命名規(guī)則為:topic 名稱+有序序號(hào),第一個(gè)partition序號(hào)從0開始,序號(hào)大值為partitions數(shù)量-1,partition物理上由多個(gè)segment組成,每一個(gè)segment存儲(chǔ)著多個(gè)message信息(默認(rèn)是:1G),而每一個(gè)message是由一個(gè)key-value和一個(gè)時(shí)間戳組成。
segment文件的生命周期由服務(wù)器配置參數(shù)決定:默認(rèn)的是168個(gè)小時(shí)后刪除。
segment由兩大部分組成: index file 和 data file,這2個(gè)文件一一對(duì)應(yīng),成對(duì)出現(xiàn),后綴".index"和".log"分別表示為 segment 索引文件、數(shù)據(jù)文件。
segment的命名規(guī)則:partion 全局的第一個(gè) segment 從 0 開始,后續(xù)每個(gè) segment 文件名為上一個(gè) segment 文件最后一條消息的 offset 值。數(shù)值大為 64 位 long 大小,19 位數(shù)字字符長(zhǎng)度,沒(méi)有數(shù)字用 0 填充。(每一個(gè)partition都是如此)
segment的index file: 索引文件存儲(chǔ)大量元數(shù)據(jù),數(shù)據(jù)文件存儲(chǔ)大量消息,索引文件中元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中 message 的物理偏移地址。
segment的data file:
kafka讀取數(shù)據(jù)的查找message的步驟:
以讀取 offset=368776 的 message,需要通過(guò)下面 2 個(gè)步驟查找。
第一步:00000000000000000000.index,表示最開始的文件,起始偏移量(offset)為 0,00000000000000368769.index 的消息量起始偏移量為 368770 = 368769 + 1,00000000000000737337.index 的起始偏移量為 737338=737337 + 1,其他后續(xù)文件依次類推。以起始偏移量命名并排序這些文件,只要根據(jù) offset 二分查找文件列表,就可以快速定 位到具體文件。當(dāng) offset=368776 時(shí)定位到 00000000000000368769.index 和對(duì)應(yīng) log 文件。
第二步:當(dāng) offset=368776 時(shí),依次定位到 00000000000000368769.index 的元數(shù)據(jù)物理位置和 00000000000000368769.log 的物理偏移地址,然后再通過(guò) 00000000000000368769.log 順序查找直到 offset=368776 為止。查找的時(shí)候是通過(guò)相對(duì)偏移量,在.index文件中有兩列(序列,地址),其中序列是相對(duì)偏移量:序列=查找的message的偏移量-當(dāng)前文件的起始偏移量 ,然后根據(jù)序列對(duì)應(yīng)的地址,找到相應(yīng)的位置上的數(shù)據(jù)message。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。