高速數(shù)據(jù)總線kafka介紹
1. Kafka的作用
在大數(shù)據(jù)系統(tǒng)中,常常會(huì)碰到一個(gè)問(wèn)題,整個(gè)大數(shù)據(jù)是由各個(gè)子系統(tǒng)組成,數(shù)據(jù)需要在各個(gè)子系統(tǒng)中高性能,低延遲的不停流轉(zhuǎn)。有沒(méi)有一個(gè)系統(tǒng)可以同時(shí)搞定在線應(yīng)用(消息)和離線應(yīng)用(數(shù)據(jù)文件,日志)?這就需要kafka。Kafka可以起到兩個(gè)作用:
- 降低系統(tǒng)組網(wǎng)復(fù)雜度。
- 降低編程復(fù)雜度,各個(gè)子系統(tǒng)不在是相互協(xié)商接口,各個(gè)子系統(tǒng)類似插口插在插座上,Kafka承擔(dān)高速數(shù)據(jù)總線的作用。
2. Kafka產(chǎn)生背景
Kafka是Linkedin于2010年12月份開(kāi)源的消息系統(tǒng),它主要用于處理活躍的流式數(shù)據(jù)?;钴S的流式數(shù)據(jù)在web網(wǎng)站應(yīng)用中非常常見(jiàn),這些數(shù)據(jù)包括網(wǎng)站的pv、用戶訪問(wèn)了什么內(nèi)容,搜索了什么內(nèi)容等。 這些數(shù)據(jù)通常以日志的形式記錄下來(lái),然后每隔一段時(shí)間進(jìn)行一次統(tǒng)計(jì)處理。
傳統(tǒng)的日志分析系統(tǒng)提供了一種離線處理日志信息的可擴(kuò)展方案,但若要進(jìn)行實(shí)時(shí)處理,通常會(huì)有較大延遲。而現(xiàn)有的消(隊(duì)列)系統(tǒng)能夠很好的處理實(shí)時(shí)或者近似實(shí)時(shí)的應(yīng)用,但未處理的數(shù)據(jù)通常不會(huì)寫(xiě)到磁盤(pán)上,這對(duì)于Hadoop之類(一小時(shí)或者一天只處理一部分?jǐn)?shù)據(jù))的離線應(yīng)用而言,可能存在問(wèn)題。Kafka正是為了解決以上問(wèn)題而設(shè)計(jì)的,它能夠很好地離線和在線應(yīng)用。
3. Kafka架構(gòu)
- 生產(chǎn)者(producer):消息和數(shù)據(jù)產(chǎn)生者
- 代理(Broker):緩存代理
- 消費(fèi)者(consumer):消息和數(shù)據(jù)消費(fèi)者
架構(gòu)很簡(jiǎn)單,Producer,consumer實(shí)現(xiàn)Kafka注冊(cè)的接口,數(shù)據(jù)從producer發(fā)送到broker,broker承擔(dān)一個(gè)中間緩存和分發(fā)的作用。broker分發(fā)注冊(cè)到系統(tǒng)中的consumer。
4. 設(shè)計(jì)要點(diǎn)
(1) 直接使用linux 文件系統(tǒng)的cache,來(lái)高效緩存數(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ù)在磁盤(pán)上存取代價(jià)為O(1)。
- 以topic來(lái)進(jìn)行消息管理,每個(gè)topic包含多個(gè)part(ition),每個(gè)part對(duì)應(yīng)一個(gè)邏輯log,有多個(gè)segment組成。
- 每個(gè)segment中存儲(chǔ)多條消息(見(jiàn)下圖),消息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í)間超過(guò)閾值時(shí),segment上的消息會(huì)被flush到磁盤(pán),只有flush到磁盤(pán)上的消息訂閱者才能訂閱到,segment達(dá)到一定的大小后將不會(huì)再往該segment寫(xiě)數(shù)據(jù),broker會(huì)創(chuàng)建新的segment。
(4) 顯式分布式,即所有的producer、broker和consumer都會(huì)有多個(gè),均為分布式的。Producer和broker之間沒(méi)有負(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ì)得到通知。
5. 類似的系統(tǒng)
RocketMQ:國(guó)內(nèi)淘寶團(tuán)隊(duì)參考開(kāi)源的實(shí)現(xiàn)的消息隊(duì)列,解決了kafka的一些問(wèn)題,如優(yōu)先級(jí)問(wèn)題。
6. 參考資料:
- http://blog.chinaunix.net/uid-20196318-id-2420884.html
- http://dongxicheng.org/search-engine/kafka/
【本文為51CTO專欄作者“大數(shù)據(jù)和云計(jì)算”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)獲取聯(lián)系和授權(quán)】