什么是kafka
Kafka官網(wǎng)介紹kafka是一個(gè)分布式的流平臺(tái)练般。
- 可以讓你發(fā)布和訂閱流式的記錄。這一方面與消息隊(duì)列或者企業(yè)消息系統(tǒng)類(lèi)似。
- 可以儲(chǔ)存流式的記錄无虚,并且有較好的容錯(cuò)性。
- 可以在流式記錄產(chǎn)生時(shí)就進(jìn)行處理衍锚。
平時(shí)對(duì)kafka的認(rèn)識(shí)還是作為消息隊(duì)列比較多友题,其他特性在大數(shù)據(jù)領(lǐng)域應(yīng)用很廣。簡(jiǎn)單來(lái)說(shuō)kafka是一個(gè)基于消息戴质、分布式度宦、高吞吐的流平臺(tái)。
主題與日志
Kafka是以發(fā)布—訂閱的方式形式進(jìn)行數(shù)據(jù)傳輸告匠,數(shù)據(jù)的發(fā)送者(稱(chēng)為發(fā)布者)不會(huì)將數(shù)據(jù)直接發(fā)送給特定的接收者(稱(chēng)為訂閱者)戈抄。發(fā)布者以某種方式將消息進(jìn)行分類(lèi),接受者訂閱它們后专,以便接收特定類(lèi)型的消息划鸽。
在 Kafka 中,發(fā)布訂閱的對(duì)象是主題(Topic)戚哎,你可以為每個(gè)業(yè)務(wù)裸诽、每個(gè)應(yīng)用甚至是每類(lèi)數(shù)據(jù)都創(chuàng)建專(zhuān)屬的主題。Kafka 將每個(gè)主題劃分成多個(gè)分區(qū)(Partition)型凳,每個(gè)分區(qū)是一組有序的消息日志丈冬,消息日志是kafka的數(shù)據(jù)單元,由消息和鍵組成甘畅。
這里重點(diǎn)說(shuō)一下日志的概念埂蕊,日志是分布式系統(tǒng)的靈魂。這里的日志并非日常開(kāi)發(fā)中打印的日志疏唾,這里的日志通常是只能追加蓄氧、按照時(shí)間完全有序(totally-ordered)的記錄序列,如mysql中的binlog是記錄所有數(shù)據(jù)庫(kù)表結(jié)構(gòu)變更槐脏,redis的AOF記錄每次寫(xiě)命令喉童。
通過(guò)這種方式可以實(shí)現(xiàn)提供節(jié)點(diǎn)之間的數(shù)據(jù)復(fù)制、為系統(tǒng)提供外部的數(shù)據(jù)訂閱准给、調(diào)整節(jié)點(diǎn)之間的數(shù)據(jù)平衡等功能泄朴。Kafka的消息日志也是遵循上面的規(guī)則設(shè)計(jì)的重抖,是一段有序只能追加的寫(xiě)的物理文件露氮。
即使我們之前沒(méi)有使用過(guò)kafka,也聽(tīng)說(shuō)過(guò)kafka的高吞吐钟沛,但是kafka對(duì)消息日志做了持久化的處理畔规,我們都知道涉及到磁盤(pán)IO都想到一個(gè)慢字。kafka的高吞吐的一方面就是在于它日志的設(shè)計(jì)恨统。
-
append-only
官網(wǎng)提到don't fear the filesystem!叁扫,不要害怕文件系統(tǒng)三妈。我們固定思維以為涉及到磁盤(pán)文件會(huì)很慢,是因?yàn)槲覀兪褂玫姆绞讲粚?duì)莫绣,只要使用方式正確磁盤(pán)文件也可以像網(wǎng)絡(luò)一樣快畴蒲。磁盤(pán)系統(tǒng)慢是因?yàn)樗膶ぶ罚疟P(pán)的順序?qū)懕入S機(jī)寫(xiě)快6000倍以上对室,這是因?yàn)椴僮飨到y(tǒng)提供了 read-ahead 和 write-behind 技術(shù)模燥,read-ahead 是以大的 data block 為單位預(yù)先讀取數(shù)據(jù),而 write-behind 是將多個(gè)小型的邏輯寫(xiě)合并成一次大型的物理磁盤(pán)寫(xiě)入掩宜。 -
batch and zero-copy
使用順序?qū)懴舜疟P(pán)訪問(wèn)慢的情況蔫骂,關(guān)于IO操作低下的主要原因就剩下了兩個(gè):大量的小型 I/O 操作,以及過(guò)多的字節(jié)拷貝牺汤。
為了提高效率消息按照批次寫(xiě)入kafka辽旋,批次就是一組消息,這些消息都屬于來(lái)自同一個(gè)主題和分區(qū)檐迟。這樣減少了小型的I/O操作补胚,但是消息的實(shí)時(shí)性就有所損耗。
另外一個(gè)就是zero-copy追迟,關(guān)于零拷貝我之前有文章介紹了零拷貝的概念糖儡,這里不多講。簡(jiǎn)單來(lái)說(shuō)怔匣,傳統(tǒng)的I/O操作涉及多次數(shù)據(jù)的拷貝握联,從內(nèi)存空間到內(nèi)核空間,但是零拷貝使用sendfile的指令每瞒,可以允許操作系統(tǒng)將數(shù)據(jù)從 內(nèi)核空間 直接發(fā)送到網(wǎng)絡(luò)金闽,這樣避免重新復(fù)制數(shù)據(jù)。
客戶端
Kafka的客戶端分為兩部分剿骨,生產(chǎn)者與消費(fèi)者代芜。
生產(chǎn)者
生產(chǎn)者程序通常持續(xù)不斷地向一個(gè)或多個(gè)主題發(fā)送消息,生產(chǎn)者默認(rèn)情況下把消息均勻的分布到主題的分區(qū)上浓利,也可以將消息發(fā)送到指定的分區(qū)挤庇,通常是通過(guò)消息鍵和分區(qū)策略實(shí)現(xiàn)的,后續(xù)會(huì)詳細(xì)介紹贷掖。
消費(fèi)者
消費(fèi)者讀取消息嫡秕。消費(fèi)者可以訂閱一個(gè)或者多個(gè)主題,并按照消息的生成順序讀取它們苹威。每個(gè)消息日志都有自己的偏移量(offset)昆咽,是一個(gè)不斷遞增的整數(shù)值,在創(chuàng)建消息的時(shí)候會(huì)保存進(jìn)去。在給定的分區(qū)里面掷酗,每個(gè)消息的偏移量是唯一的调违。消費(fèi)者把每個(gè)分區(qū)讀取的消息偏移量存入zookeeper(之前版本)或kafka,這樣在消費(fèi)者關(guān)閉或者重啟泻轰,它的讀取狀態(tài)也不會(huì)消息技肩。
為了提高消息的消費(fèi)速度和擴(kuò)展與容錯(cuò),kafka引入消費(fèi)者組(consumer group)的概念浮声。也就是說(shuō)亩鬼,會(huì)有一個(gè)消費(fèi)者或者多個(gè)消費(fèi)者讀取一個(gè)主題。群組保證一個(gè)分區(qū)只能被一個(gè)消費(fèi)者使用阿蝶。
通過(guò)這種方式雳锋,消費(fèi)者可以提高消費(fèi)的速率,而且當(dāng)一個(gè)一個(gè)消費(fèi)者失效之后羡洁,集群中其他消費(fèi)者可以接管失效消費(fèi)者的工作玷过,這就是消費(fèi)者重平衡,后續(xù)會(huì)介紹這個(gè)概念筑煮。
服務(wù)端與集群
有客戶端就有服務(wù)端辛蚊,一個(gè)獨(dú)立的kafka服務(wù)器被稱(chēng)為broker。broker處理客戶端的請(qǐng)求真仲,接受生產(chǎn)者的消息袋马,為消息設(shè)置偏移量,并提交消息到磁盤(pán)保存秸应。為消費(fèi)者提供服務(wù)虑凛,對(duì)提取的分區(qū)做出相應(yīng),返回提交到磁盤(pán)的消息软啼。
Kafka集群由多個(gè)broker組成桑谍,broker的信息存儲(chǔ)在zookeeper上,通過(guò)zookeeper可監(jiān)控和管理集群每個(gè)broker祸挪。在集群多個(gè)broker中會(huì)有一個(gè)broker充當(dāng)控制器的角色(controller)锣披,kafka使用zookeeper的臨時(shí)節(jié)點(diǎn)選舉控制器,控制器的作用很多比如主題的管理贿条、集群成員管理等雹仿,這里就不詳細(xì)介紹了。
在kafka文檔中介紹“一個(gè)分布式整以、可分區(qū)的胧辽、可復(fù)制的提交日志服務(wù)”,復(fù)制是分布式系統(tǒng)中保證可用性的關(guān)鍵悄蕾。
前面提高kafka使用topic組織數(shù)據(jù)票顾,一個(gè)topic被分為若干個(gè)個(gè)分區(qū)础浮,每個(gè)分區(qū)有多個(gè)副本帆调。這些副本保存在broker上奠骄,每個(gè)broker可以保存多個(gè)屬于不同主題和分區(qū)的副本。
副本有兩種類(lèi)型
- leader:每個(gè)分區(qū)都有一個(gè)leader副本番刊,為了保證數(shù)據(jù)一致性含鳞,所有生產(chǎn)者和消費(fèi)者的請(qǐng)求都是處理的這個(gè)副本。
- follower:leader以外的副本都是follower副本芹务。follower不處理客戶端的請(qǐng)求蝉绷,唯一的任務(wù)就是從leader那里復(fù)制消息,保持和leader一樣的狀態(tài)枣抱。如果leader崩潰熔吗,其中一個(gè)將會(huì)升為新leader。
總結(jié)
本文介紹了kafka的一些概念佳晶,比如消息日志桅狠、生產(chǎn)者、消費(fèi)者轿秧、broker中跌,下面一張圖詳細(xì)的展示了它們之間的關(guān)系。
關(guān)于kafka菇篡,早在去年的時(shí)候就在斷斷續(xù)續(xù)的接觸和學(xué)習(xí)漩符,我學(xué)習(xí)kafka更多的側(cè)重點(diǎn)是它系統(tǒng)的設(shè)計(jì),一個(gè)分布式的流服務(wù)器是怎么設(shè)計(jì)的驱还。它是如何做到高可用嗜暴、高吞吐的,這是很吸引人的東西议蟆。相反在關(guān)于kafka的使用和搭建我關(guān)注的就比較少灼伤,本文是我自己的在看了一些資料后的總結(jié)和一些看法,接下來(lái)的時(shí)間應(yīng)該也會(huì)繼續(xù)寫(xiě)kafka相關(guān)的文章咪鲜。
參考
《Kafka權(quán)威指南》
kafka官網(wǎng)
極客時(shí)間《Kafka核心技術(shù)與實(shí)戰(zhàn)》