分布式消息系統(tǒng):Kafka

轉(zhuǎn)自:http://blog.jobbole.com/75328/

Kafka是分布式發(fā)布-訂閱消息系統(tǒng)。它最初由LinkedIn公司開發(fā),之后成為Apache項(xiàng)目的一部分穷遂。Kafka是一個(gè)分布式的击你,可劃分的但指,冗余備份的持久性的日志服務(wù)。它主要用于處理活躍的流式數(shù)據(jù)觉鼻。
在大數(shù)據(jù)系統(tǒng)中俊扭,常常會(huì)碰到一個(gè)問題,整個(gè)大數(shù)據(jù)是由各個(gè)子系統(tǒng)組成坠陈,數(shù)據(jù)需要在各個(gè)子系統(tǒng)中高性能萨惑,低延遲的不停流轉(zhuǎn)。傳統(tǒng)的企業(yè)消息系統(tǒng)并不是非常適合大規(guī)模的數(shù)據(jù)處理仇矾。為了已在同時(shí)搞定在線應(yīng)用(消息)和離線應(yīng)用(數(shù)據(jù)文件庸蔼,日志)Kafka就出現(xiàn)了。Kafka可以起到兩個(gè)作用:
降低系統(tǒng)組網(wǎng)復(fù)雜度贮匕。
降低編程復(fù)雜度姐仅,各個(gè)子系統(tǒng)不在是相互協(xié)商接口,各個(gè)子系統(tǒng)類似插口插在插座上刻盐,Kafka承擔(dān)高速數(shù)據(jù)總線的作用。

Kafka主要特點(diǎn):
同時(shí)為發(fā)布和訂閱提供高吞吐量。據(jù)了解请祖,Kafka每秒可以生產(chǎn)約25萬消息(50 MB)谬泌,每秒處理55萬消息(110 MB)。
可進(jìn)行持久化操作乙墙。將消息持久化到磁盤颖变,因此可用于批量消費(fèi),例如ETL听想,以及實(shí)時(shí)應(yīng)用程序腥刹。通過將數(shù)據(jù)持久化到硬盤以及replication防止數(shù)據(jù)丟失。
分布式系統(tǒng)哗魂,易于向外擴(kuò)展肛走。所有的producer、broker和consumer都會(huì)有多個(gè)录别,均為分布式的朽色。無需停機(jī)即可擴(kuò)展機(jī)器。
消息被處理的狀態(tài)是在consumer端維護(hù)组题,而不是由server端維護(hù)葫男。當(dāng)失敗時(shí)能自動(dòng)平衡。
支持online和offline的場(chǎng)景崔列。

Kafka的架構(gòu):

Kafka的整體架構(gòu)非常簡(jiǎn)單梢褐,是顯式分布式架構(gòu)旺遮,producer、broker(kafka)和consumer都可以有多個(gè)盈咳。Producer耿眉,consumer實(shí)現(xiàn)Kafka注冊(cè)的接口,數(shù)據(jù)從producer發(fā)送到broker鱼响,broker承擔(dān)一個(gè)中間緩存和分發(fā)的作用鸣剪。broker分發(fā)注冊(cè)到系統(tǒng)中的consumer。broker的作用類似于緩存丈积,即活躍的數(shù)據(jù)和離線處理系統(tǒng)之間的緩存筐骇。客戶端和服務(wù)器端的通信江滨,是基于簡(jiǎn)單铛纬,高性能,且與編程語言無關(guān)的TCP協(xié)議唬滑。幾個(gè)基本概念:
Topic:特指Kafka處理的消息源(feeds of messages)的不同分類告唆。
Partition:Topic物理上的分組,一個(gè)topic可以分為多個(gè)partition间雀,每個(gè)partition是一個(gè)有序的隊(duì)列悔详。partition中的每條消息都會(huì)被分配一個(gè)有序的id(offset)。
Message:消息惹挟,是通信的基本單位茄螃,每個(gè)producer可以向一個(gè)topic(主題)發(fā)布一些消息。
Producers:消息和數(shù)據(jù)生產(chǎn)者连锯,向Kafka的一個(gè)topic發(fā)布消息的過程叫做producers归苍。
Consumers:消息和數(shù)據(jù)消費(fèi)者,訂閱topics并處理其發(fā)布的消息的過程叫做consumers运怖。
Broker:緩存代理拼弃,Kafa集群中的一臺(tái)或多臺(tái)服務(wù)器統(tǒng)稱為broker。

消息發(fā)送的流程:

Producer根據(jù)指定的partition方法(round-robin摇展、hash等)吻氧,將消息發(fā)布到指定topic的partition里面
kafka集群接收到Producer發(fā)過來的消息后,將其持久化到硬盤咏连,并保留消息指定時(shí)長(zhǎng)(可配置)盯孙,而不關(guān)注消息是否被消費(fèi)。
Consumer從kafka集群pull數(shù)據(jù)祟滴,并控制獲取消息的offset

Kafka的設(shè)計(jì):
1振惰、吞吐量
高吞吐是kafka需要實(shí)現(xiàn)的核心目標(biāo)之一,為此kafka做了以下一些設(shè)計(jì):
數(shù)據(jù)磁盤持久化:消息不在內(nèi)存中cache垄懂,直接寫入到磁盤骑晶,充分利用磁盤的順序讀寫性能
zero-copy:減少IO操作步驟
數(shù)據(jù)批量發(fā)送
數(shù)據(jù)壓縮
Topic劃分為多個(gè)partition痛垛,提高parallelism

負(fù)載均衡
producer根據(jù)用戶指定的算法,將消息發(fā)送到指定的partition
存在多個(gè)partiiton桶蛔,每個(gè)partition有自己的replica匙头,每個(gè)replica分布在不同的Broker節(jié)點(diǎn)上
多個(gè)partition需要選取出lead partition,lead partition負(fù)責(zé)讀寫仔雷,并由zookeeper負(fù)責(zé)fail over
通過zookeeper管理broker與consumer的動(dòng)態(tài)加入與離開

拉取系統(tǒng)
由于kafka broker會(huì)持久化數(shù)據(jù)乾胶,broker沒有內(nèi)存壓力,因此朽寞,consumer非常適合采取pull的方式消費(fèi)數(shù)據(jù),具有以下幾點(diǎn)好處:
簡(jiǎn)化kafka設(shè)計(jì)
consumer根據(jù)消費(fèi)能力自主控制消息拉取速度
consumer根據(jù)自身情況自主選擇消費(fèi)模式斩郎,例如批量脑融,重復(fù)消費(fèi),從尾端開始消費(fèi)等

可擴(kuò)展性
當(dāng)需要增加broker結(jié)點(diǎn)時(shí)缩宜,新增的broker會(huì)向zookeeper注冊(cè)肘迎,而producer及consumer會(huì)根據(jù)注冊(cè)在zookeeper上的watcher感知這些變化,并及時(shí)作出調(diào)整锻煌。
Kayka的應(yīng)用場(chǎng)景:
1.消息隊(duì)列
比起大多數(shù)的消息系統(tǒng)來說妓布,Kafka有更好的吞吐量,內(nèi)置的分區(qū)宋梧,冗余及容錯(cuò)性匣沼,這讓Kafka成為了一個(gè)很好的大規(guī)模消息處理應(yīng)用的解決方案。消息系統(tǒng)一般吞吐量相對(duì)較低捂龄,但是需要更小的端到端延時(shí)释涛,并嘗嘗依賴于Kafka提供的強(qiáng)大的持久性保障。在這個(gè)領(lǐng)域倦沧,Kafka足以媲美傳統(tǒng)消息系統(tǒng)唇撬,如ActiveMRRabbitMQ
2.行為跟蹤
Kafka的另一個(gè)應(yīng)用場(chǎng)景是跟蹤用戶瀏覽頁面展融、搜索及其他行為窖认,以發(fā)布-訂閱的模式實(shí)時(shí)記錄到對(duì)應(yīng)的topic里。那么這些結(jié)果被訂閱者拿到后告希,就可以做進(jìn)一步的實(shí)時(shí)處理扑浸,或?qū)崟r(shí)監(jiān)控,或放到hadoop/離線數(shù)據(jù)倉庫里處理暂雹。
3.元信息監(jiān)控
作為操作記錄的監(jiān)控模塊來使用首装,即匯集記錄一些操作信息,可以理解為運(yùn)維性質(zhì)的數(shù)據(jù)監(jiān)控吧杭跪。
4.日志收集
日志收集方面仙逻,其實(shí)開源產(chǎn)品有很多驰吓,包括Scribe、Apache Flume系奉。很多人使用Kafka代替日志聚合(log aggregation)檬贰。日志聚合一般來說是從服務(wù)器上收集日志文件,然后放到一個(gè)集中的位置(文件服務(wù)器或HDFS)進(jìn)行處理缺亮。然而Kafka忽略掉文件的細(xì)節(jié)翁涤,將其更清晰地抽象成一個(gè)個(gè)日志或事件的消息流。這就讓Kafka處理過程延遲更低萌踱,更容易支持多數(shù)據(jù)源和分布式數(shù)據(jù)處理葵礼。比起以日志為中心的系統(tǒng)比如Scribe或者Flume來說,Kafka提供同樣高效的性能和因?yàn)閺?fù)制導(dǎo)致的更高的耐用性保證并鸵,以及更低的端到端延遲鸳粉。
5.流處理
這個(gè)場(chǎng)景可能比較多,也很好理解园担。保存收集流數(shù)據(jù)届谈,以提供之后對(duì)接的Storm或其他流式計(jì)算框架進(jìn)行處理。很多用戶會(huì)將那些從原始topic來的數(shù)據(jù)進(jìn)行階段性處理弯汰,匯總艰山,擴(kuò)充或者以其他的方式轉(zhuǎn)換到新的topic下再繼續(xù)后面的處理。例如一個(gè)文章推薦的處理流程咏闪,可能是先從RSS數(shù)據(jù)源中抓取文章的內(nèi)容曙搬,然后將其丟入一個(gè)叫做“文章”的topic中;后續(xù)操作可能是需要對(duì)這個(gè)內(nèi)容進(jìn)行清理鸽嫂,比如回復(fù)正常數(shù)據(jù)或者刪除重復(fù)數(shù)據(jù)织鲸,最后再將內(nèi)容匹配的結(jié)果返還給用戶。這就在一個(gè)獨(dú)立的topic之外溪胶,產(chǎn)生了一系列的實(shí)時(shí)數(shù)據(jù)處理的流程搂擦。StromSamza是非常著名的實(shí)現(xiàn)這種類型數(shù)據(jù)轉(zhuǎn)換的框架。
6.事件源
事件源是一種應(yīng)用程序設(shè)計(jì)的方式哗脖,該方式的狀態(tài)轉(zhuǎn)移被記錄為按時(shí)間順序排序的記錄序列瀑踢。Kafka可以存儲(chǔ)大量的日志數(shù)據(jù),這使得它成為一個(gè)對(duì)這種方式的應(yīng)用來說絕佳的后臺(tái)才避。比如動(dòng)態(tài)匯總(News feed)橱夭。
7.持久性日志(commit log)
Kafka可以為一種外部的持久性日志的分布式系統(tǒng)提供服務(wù)。這種日志可以在節(jié)點(diǎn)間備份數(shù)據(jù)桑逝,并為故障節(jié)點(diǎn)數(shù)據(jù)回復(fù)提供一種重新同步的機(jī)制棘劣。Kafka中日志壓縮功能為這種用法提供了條件。在這種用法中楞遏,Kafka類似于Apache BookKeeper項(xiàng)目茬暇。
Kayka的設(shè)計(jì)要點(diǎn):
1首昔、直接使用linux 文件系統(tǒng)的cache,來高效緩存數(shù)據(jù)糙俗。
2勒奇、采用linux Zero-Copy提高發(fā)送性能。傳統(tǒng)的數(shù)據(jù)發(fā)送需要發(fā)送4次上下文切換巧骚,采用sendfile系統(tǒng)調(diào)用之后赊颠,數(shù)據(jù)直接在內(nèi)核態(tài)交換,系統(tǒng)上下文切換減少為2次劈彪。根據(jù)測(cè)試結(jié)果竣蹦,可以提高60%的數(shù)據(jù)發(fā)送性能。Zero-Copy詳細(xì)的技術(shù)細(xì)節(jié)可以參考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/
3沧奴、數(shù)據(jù)在磁盤上存取代價(jià)為O(1)草添。kafka以topic來進(jìn)行消息管理,每個(gè)topic包含多個(gè)part(ition)扼仲,每個(gè)part對(duì)應(yīng)一個(gè)邏輯log,有多個(gè)segment組成抄淑。每個(gè)segment中存儲(chǔ)多條消息(見下圖)屠凶,消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲(chǔ)位置肆资,避免id到位置的額外映射矗愧。每個(gè)part在內(nèi)存中對(duì)應(yīng)一個(gè)index,記錄每個(gè)segment中的第一條消息偏移郑原。發(fā)布者發(fā)到某個(gè)topic的消息會(huì)被均勻的分布到多個(gè)part上(隨機(jī)或根據(jù)用戶指定的回調(diào)函數(shù)進(jìn)行分布)唉韭,broker收到發(fā)布消息往對(duì)應(yīng)part的最后一個(gè)segment上添加該消息,當(dāng)某個(gè)segment上的消息條數(shù)達(dá)到配置值或消息發(fā)布時(shí)間超過閾值時(shí)犯犁,segment上的消息會(huì)被flush到磁盤属愤,只有flush到磁盤上的消息訂閱者才能訂閱到,segment達(dá)到一定的大小后將不會(huì)再往該segment寫數(shù)據(jù)酸役,broker會(huì)創(chuàng)建新的segment住诸。
4、顯式分布式涣澡,即所有的producer贱呐、broker和consumer都會(huì)有多個(gè),均為分布式的入桂。Producer和broker之間沒有負(fù)載均衡機(jī)制奄薇。broker和consumer之間利用zookeeper進(jìn)行負(fù)載均衡。所有broker和consumer都會(huì)在zookeeper中進(jìn)行注冊(cè)抗愁,且zookeeper會(huì)保存他們的一些元數(shù)據(jù)信息馁蒂。如果某個(gè)broker和consumer發(fā)生了變化呵晚,所有其他的broker和consumer都會(huì)得到通知。
參考資料:
Apache Kafka網(wǎng)站
項(xiàng)目設(shè)計(jì)討論
Github鏡像
Morten Kjetland對(duì)Apache Kafka的介紹
Quora上與RabbitMQ的對(duì)比
Kafka: a Distributed Messaging System for Log Processing
Zero-copy原理
Kafka與Hadoop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末远搪,一起剝皮案震驚了整個(gè)濱河市劣纲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谁鳍,老刑警劉巖癞季,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倘潜,居然都是意外死亡绷柒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門涮因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來废睦,“玉大人,你說我怎么就攤上這事养泡∈扰龋” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵澜掩,是天一觀的道長(zhǎng)购披。 經(jīng)常有香客問我,道長(zhǎng)肩榕,這世上最難降的妖魔是什么刚陡? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮株汉,結(jié)果婚禮上筐乳,老公的妹妹穿的比我還像新娘。我一直安慰自己乔妈,他們只是感情好蝙云,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著路召,像睡著了一般贮懈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上优训,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天朵你,我揣著相機(jī)與錄音,去河邊找鬼揣非。 笑死抡医,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忌傻,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼大脉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了水孩?” 一聲冷哼從身側(cè)響起镰矿,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俘种,沒想到半個(gè)月后秤标,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宙刘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年苍姜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悬包。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衙猪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出布近,到底是詐尸還是另有隱情垫释,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布撑瞧,位于F島的核電站棵譬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏季蚂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一琅束、第九天 我趴在偏房一處隱蔽的房頂上張望扭屁。 院中可真熱鬧,春花似錦涩禀、人聲如沸料滥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵腹。三九已至,卻和暖如春屿岂,著一層夾襖步出監(jiān)牢的瞬間践宴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工爷怀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阻肩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓运授,卻偏偏與公主長(zhǎng)得像烤惊,于是被迫代替她去往敵國和親乔煞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Kafka是分布式發(fā)布-訂閱消息系統(tǒng)柒室。它最初由LinkedIn公司開發(fā)渡贾,之后成為Apache項(xiàng)目的一部分。Kafk...
    ITsupuerlady閱讀 592評(píng)論 0 1
  • 本文轉(zhuǎn)自標(biāo)點(diǎn)符 Kafka是分布式發(fā)布-訂閱消息系統(tǒng)雄右。它最初由LinkedIn公司開發(fā)空骚,之后成為Apache項(xiàng)目的...
    quiterr閱讀 488評(píng)論 0 3
  • 背景介紹 Kafka簡(jiǎn)介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)不脯。主要設(shè)計(jì)目標(biāo)如下: 以時(shí)間復(fù)雜度為O...
    高廣超閱讀 12,831評(píng)論 8 167
  • 本文轉(zhuǎn)載自http://dataunion.org/?p=9307 背景介紹Kafka簡(jiǎn)介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,469評(píng)論 0 34
  • 一.外圍市場(chǎng)府怯, 二.股票利好美聯(lián)儲(chǔ)保持利率不變,對(duì)中國股市是一個(gè)很大的利好防楷, 三.今年任務(wù)目標(biāo)牺丙, 今天是2017年...
    嗨皮萬閱讀 517評(píng)論 0 0