Kafka 架構(gòu)簡介
Kafka是一個(gè)開源的等龙、分布式的甸箱、可分區(qū)的闽坡、可復(fù)制的基于日志提交的發(fā)布訂閱消息系統(tǒng)栽惶。它具備以下特點(diǎn):
·消息持久化: 為了從大數(shù)據(jù)中獲取有價(jià)值的信息愁溜,任何信息的丟失都是負(fù)擔(dān)不起的。Kafka使用了O(1)的磁盤結(jié)構(gòu)設(shè)計(jì)外厂,這樣做即便是在要存儲(chǔ)大體積的數(shù)據(jù)時(shí)也是可以提供穩(wěn)定的性能冕象。使用Kafka時(shí),message會(huì)被存儲(chǔ)并且會(huì)被復(fù)制以防止數(shù)據(jù)丟失汁蝶。
·高吞吐量: 設(shè)計(jì)是工作在普通的硬件設(shè)施上多個(gè)客戶端能夠每秒處理幾百兆的數(shù)據(jù)量渐扮。
·分布式: Kafka Broker的中心化集群支持消息分區(qū),而consumer采用分布式進(jìn)行消費(fèi)掖棉。
·種多Client支持: Kafka很容易與其它平臺(tái)進(jìn)行支持墓律,例如:Java、.NET幔亥、PHP耻讽、Ruby、Python帕棉。
·實(shí)時(shí): 消息由producer產(chǎn)生后立即對(duì)consumer可見齐饮。這個(gè)特性對(duì)于基于事件的系統(tǒng)是很關(guān)鍵的。
下面就來對(duì)Kafka架構(gòu)做一個(gè)簡單的說明:
Kafka各組件說明
Broker
每個(gè)kafka server稱為一個(gè)Broker笤昨,多個(gè)borker組成kafka cluster祖驱。
一個(gè)機(jī)器上可以部署一個(gè)或者多個(gè)Broker,這多個(gè)Broker連接到相同的ZooKeeper就組成了Kafka集群瞒窒。
Topic
Kafka是一個(gè)發(fā)布訂閱消息系統(tǒng)捺僻,它的邏輯結(jié)構(gòu)如下:
Topic 就是消息類別名,一個(gè)topic中通常放置一類消息崇裁。每個(gè)topic都有一個(gè)或者多個(gè)訂閱者匕坯,也就是消息的消費(fèi)者consumer。
Producer將消息推送到topic拔稳,由訂閱該topic的consumer從topic中拉取消息葛峻。
Topic 與broker
一個(gè)Broker上可以創(chuàng)建一個(gè)或者多個(gè)Topic。同一個(gè)topic可以在同一集群下的多個(gè)Broker中分布巴比。
Partition log
Kafka會(huì)為每個(gè)topic維護(hù)了多個(gè)分區(qū)(partition)术奖,每個(gè)分區(qū)會(huì)映射到一個(gè)邏輯的日志(log)文件:
每當(dāng)一個(gè)message被發(fā)布到一個(gè)topic上的一個(gè)partition,broker應(yīng)會(huì)將該message追加到這個(gè)邏輯log文件的最后一個(gè)segment上轻绞。這些segments 會(huì)被flush到磁盤上采记。Flush時(shí)可以按照時(shí)間來進(jìn)行,也可以按照message 數(shù)來執(zhí)行政勃。
每個(gè)partition都是一個(gè)有序的唧龄、不可變的結(jié)構(gòu)化的提交日志記錄的序列。在每個(gè)partition中每一條日志記錄都會(huì)被分配一個(gè)序號(hào)——通常稱為offset奸远,offset在partition內(nèi)是唯一的既棺。論點(diǎn)邏輯文件會(huì)被化分為多個(gè)文件segment(每個(gè)segment的大小一樣的)讽挟。
Broker集群將會(huì)保留所有已發(fā)布的message records,不管這些消息是否已被消費(fèi)丸冕。保留時(shí)間依賴于一個(gè)可配的保留周期戏挡。例如:如果設(shè)置了保留策略是2day,那么每一條消息發(fā)布兩天內(nèi)是被保留的晨仑,在這個(gè)2day的保留時(shí)間內(nèi),消息是可以被消費(fèi)的拆檬。過期后不再保留洪己。
Partition distribution
日志分區(qū)是分布式的存在于一個(gè)kafka集群的多個(gè)broker上。每個(gè)partition會(huì)被復(fù)制多份存在于不同的broker上竟贯。這樣做是為了容災(zāi)答捕。具體會(huì)復(fù)制幾份,會(huì)復(fù)制到哪些broker上屑那,都是可以配置的拱镐。經(jīng)過相關(guān)的復(fù)制策略后,每個(gè)topic在每個(gè)broker上會(huì)駐留一到多個(gè)partition持际。如圖:
如果要了解kafka如何進(jìn)行partition沃琅、replica 分配的,可以參考:
http://www.cnblogs.com/yurunmiao/p/5550906.html
對(duì)于同一個(gè)partition蜘欲,它所在任何一個(gè)broker益眉,都有能扮演兩種角色:leader、follower姥份。
看上面的例子郭脂。紅色的代表是一個(gè)leader。
對(duì)于topic1的4個(gè)partition:
Part 1的leader是broker1澈歉,followers是broker2\3展鸡。
Part2的leader是broker2,followers是broker1\4埃难。
Part3的leader是broker3莹弊,followers是broker1\3。
Part4的leader是broker4涡尘,followers是broker2\3箱硕。
對(duì)于topic2的3個(gè)partition:
Part1的leader是broker1,followers是broker2悟衩。
Part2的leader是broker2剧罩,followers是broker3。
Part3的leader是broker3座泳,followers是broker4惠昔。
對(duì)于topic2的4個(gè)partition:
Part 1的leader是broker4幕与,followers是broker1\2\3。
Part2的leader是broker2镇防,followers是broker1\3\4啦鸣。
Part3的leader是broker3,followers是broker1\2\4来氧。
Part4的leader是broker1诫给,followers是broker2\3\4。
下面是一個(gè)真實(shí)的例子:
圖中的partition 0 的leader是broker 2啦扬,它有3個(gè)replicas:2中狂,1,3扑毡。
In-Sync Replica:在同步中胃榕,也就是有哪些broker正處理同步中。partition 0的ISR是2瞄摊,1勋又,3,說明了3個(gè)replica都是正常狀態(tài)换帜。如果有一個(gè)broker down楔壤,那么它就不會(huì)在ISR中出現(xiàn)。
之后把broker1停止后:
每個(gè)partition的Leader的用于處理到該partition的讀寫請(qǐng)求的惯驼。
每個(gè)partition的followers是用于異步的從它的leader中復(fù)制數(shù)據(jù)的挺邀。
Kafka會(huì)動(dòng)態(tài)維護(hù)一個(gè)與Leader保持一致的同步副本(in-sync replicas (ISR))集合,并且會(huì)將最新的同步副本(ISR )集合持久化到zookeeper跳座。如果leader出現(xiàn)問題了端铛,就會(huì)從該partition的followers中選舉一個(gè)作為新的leader。
所以呢疲眷,在一個(gè)kafka集群中禾蚕,每個(gè)broker通常會(huì)扮演兩個(gè)角色:在一個(gè)partition中扮演leader,在其它的partition中扮演followers狂丝。Leader是最繁忙的换淆,要處理讀寫請(qǐng)求。這樣將leader均分到不同的broker上几颜,目的自然是要確保負(fù)載均衡倍试。
Producer
Producer作為消息的生產(chǎn)者,在生產(chǎn)完消息后需要將消息投送到指定的目的地(某個(gè)topic的某個(gè)partition)蛋哭。Producer可以根據(jù)指定選擇partition的算法或者是隨機(jī)方式來選擇發(fā)布消息到哪個(gè)partition县习。
Consumer
在Kafka中,同樣有consumer group的概念,它是邏輯上將一些consumer分組躁愿。因?yàn)槊總€(gè)kafka consumer是一個(gè)進(jìn)程叛本。所以一個(gè)consumer group中的consumers將可能是由分布在不同機(jī)器上的不同的進(jìn)程組成的。Topic中的每一條消息可以被多個(gè)consumer group消費(fèi)彤钟,然而每個(gè)consumer group內(nèi)只能有一個(gè)consumer來消費(fèi)該消息来候。所以,如果想要一條消息被多個(gè)consumer消費(fèi)逸雹,那么這些consumer就必須是在不同的consumer group中营搅。所以也可以理解為consumer group才是topic在邏輯上的訂閱者。
每個(gè)consumer可以訂閱多個(gè)topic梆砸。
每個(gè)consumer會(huì)保留它讀取到某個(gè)partition的offset转质。而consumer 是通過zookeeper來保留offset的。
Kafka提供的保障
1辫樱、如果producer往特定的partition發(fā)送消息時(shí),會(huì)按照先后順序存儲(chǔ)俊庇,也就是說如果發(fā)送順序是message1狮暑、message2、message3辉饱。那么這三個(gè)消息在partition log中的記錄的offset就是 message1_offset < message2_offset < message3_offset搬男。
2、consumer也是有序的瀏覽log中的記錄彭沼。
3缔逛、如果一個(gè)topic指定了replication factor為N,那么就允許有N-1個(gè)Broker出錯(cuò)姓惑。
架構(gòu)圖
對(duì)上述各組件介紹后褐奴,現(xiàn)在就應(yīng)該可以很容易的理解Kafka的架構(gòu)圖: