Apache Kafka綜述
在大數(shù)據(jù)中,會使用到大量的數(shù)據(jù)。面對這些海量的數(shù)據(jù),我們一是需要做到能夠收集這些數(shù)據(jù),其次是要能夠分析和處理這些海量數(shù)據(jù)。在此過程中,需要一套消息系統(tǒng)。
Kafka專門為分布式高吞吐量系統(tǒng)設(shè)計(jì)。作為一個(gè)消息代理的替代品,Kafka往往做的比其他消息中間件做的更好。
與其他消息隊(duì)列產(chǎn)品相比,它主要有以下優(yōu)點(diǎn):
- 吞吐量高
- 內(nèi)置分區(qū)
- 復(fù)制能力
- 固有的容錯能力
因此,Kafka非常適合大規(guī)模的消息處理應(yīng)用。
什么是消息系統(tǒng)?
消息系統(tǒng)負(fù)責(zé)將數(shù)據(jù)從一個(gè)應(yīng)用傳遞到另一個(gè)應(yīng)用,應(yīng)用就可以專注于數(shù)據(jù),而不用擔(dān)心數(shù)據(jù)如何共享。分布式消息傳遞基于可靠消息隊(duì)列的概念。消息在客戶端應(yīng)用程序和消息傳遞系統(tǒng)之間異步排隊(duì)。
有兩種類型的消息模式可用:
- 點(diǎn)對點(diǎn)模式
- 訂閱-發(fā)布模式(pub-sub),也是最常用的一種消息模式
點(diǎn)對點(diǎn)消息類型
在點(diǎn)對點(diǎn)的消息傳遞類型中,所有的消息都保留在消息隊(duì)列中。一個(gè)或多個(gè)消費(fèi)者可以消耗隊(duì)列中的消息,但特定的消息只能有最多一個(gè)消費(fèi)者消費(fèi)。一旦消費(fèi)者消費(fèi)了隊(duì)列中的消息,該消息將會在消息隊(duì)列中消失。
點(diǎn)對點(diǎn)消息系統(tǒng)最典型的例子是訂單處理系統(tǒng),其中每個(gè)訂單將有由訂單處理器處理,但多個(gè)訂單處理器也可以同時(shí)工作。
發(fā)布-訂閱消息類型
在發(fā)布-訂閱系統(tǒng)中,消息被保留在各個(gè)主題中。
與點(diǎn)對點(diǎn)系統(tǒng)不同的是,一個(gè)訂閱者可以訂閱一個(gè)或多個(gè)不同主題中的消息并使用這些主題中的所有消息。
在發(fā)布-訂閱系統(tǒng)中,消息的生產(chǎn)者稱為發(fā)布者,消息的使用者稱為訂閱者。
一個(gè)現(xiàn)實(shí)的例子是dish天線電視,它發(fā)布不同的渠道和主題,如運(yùn)動、音樂、電影等,任何人都可以訂閱自己需要的主題集,并接收到訂閱主題的消息。
什么是Kafka?
Kafka is a distributed,partitioned,replicated commit logservice.
- Apache Kafka 是一個(gè)分布式發(fā)布 - 訂閱消息系統(tǒng)和一個(gè)強(qiáng)大的隊(duì)列,可以處理大量的數(shù)據(jù),并使你能夠?qū)⑾囊粋€(gè)端點(diǎn)傳遞到另一個(gè)端點(diǎn)。
- Kafka 適合離線和在線消息消費(fèi)。
- Kafka 消息保留在磁盤上,并在群集內(nèi)復(fù)制以防止數(shù)據(jù)丟失。
- Kafka 構(gòu)建在 ZooKeeper 同步服務(wù)之上。 它與 Apache Storm 和 Spark 非常好地集成,用于實(shí)時(shí)流式數(shù)據(jù)分析。
優(yōu)點(diǎn)
- 可靠性
Kafka是分布式、分區(qū)復(fù)制、可容錯的 - 可擴(kuò)展性
消息傳遞系統(tǒng)可以輕松擴(kuò)縮容,不用關(guān)機(jī) - 耐用性
Kafka使用“分布式提交日志”,這意味著消息會盡可能快地保留在磁盤上,因此它是持久的。 - 高性能
Kafka無論是發(fā)布還是訂閱消息的吞吐量都是很高的。即使存儲了很多TB的消息,還是能夠保證高性能。
Kafka非常快,并且能保證零停機(jī)和零數(shù)據(jù)丟失
關(guān)鍵術(shù)語
- 生產(chǎn)者和消費(fèi)者:Productor & Customer
在Kafka中,消息的發(fā)布者稱為生產(chǎn)者Productor,消息的接受和使用者稱為消費(fèi)者Customer - broker:
Kafka消息隊(duì)列集群中有很多臺server,每一臺server都可以存儲消息,這每一臺server都可以稱做是Kafka的一個(gè)實(shí)例,也稱為broker - 主題:topic
一個(gè)topic中會保存同一類的消息,相當(dāng)于對消息進(jìn)行分類。productor在向Custom發(fā)送消息的時(shí)候,需要指定topic,也就是制定了該消息屬于哪一分類。 - 分區(qū):partition
每個(gè)topic都劃分為多個(gè)partition,每個(gè)partition在存儲層面都是一個(gè)append log文件。任何寫進(jìn)某partition的消息都會被追加在一個(gè)log文件的尾部。
分區(qū)的意義:Kafka基于文件進(jìn)行存儲,當(dāng)文件內(nèi)容過大的時(shí)候,很容易達(dá)到單個(gè)磁盤的上限。使用分區(qū)進(jìn)行存儲,一個(gè)分區(qū)存儲一個(gè)文件,保證單個(gè)文件不會過大的情況下,還能將數(shù)據(jù)存在不同的broker = Kafka server上,從而實(shí)現(xiàn)了負(fù)載均衡,能夠承載更多的消費(fèi)者 - 偏移量:offset
一個(gè)分區(qū)存儲一個(gè)文件,而消息在文件中的位置就稱為是偏移量offset,offset的字符類型為long長字符類型,它可以唯一標(biāo)記一條消息。由于Kafka并沒有提供額外的消息索引機(jī)制,因此文件只能順序讀寫,所以Kafka基本不允許對消息進(jìn)行“隨機(jī)讀寫”。
小結(jié)Kafka:
- 是基于發(fā)布-訂閱的分布式消息隊(duì)列
- 面向大數(shù)據(jù),消息存儲在topic中,而每個(gè)topic會分為多個(gè)patition分區(qū);
- 消息存儲在磁盤中,每個(gè)partition分區(qū)對應(yīng)一個(gè)磁盤上的一個(gè)文件來存儲消息,消息的寫入就是在log文件后追加內(nèi)容,文件可以在集群內(nèi)復(fù)制防止丟失;
- 即使消息被消費(fèi),消息也不會立刻消失,可以通過配置以實(shí)現(xiàn)自動刪除來釋放空間
- Kafka依賴分布式協(xié)調(diào)服務(wù)zookeeper,適合離線/在線消息的消費(fèi),與storm/spark等實(shí)時(shí)流式數(shù)據(jù)處理工具常常結(jié)合使用。
Kafka基本原理
-
分布式和分區(qū):distributed、partitioned
Kafka是一個(gè)分布式的發(fā)布-訂閱消息隊(duì)列,主要體現(xiàn)在哪些方面?
體現(xiàn)在大量的數(shù)據(jù)被保存在磁盤上,但單個(gè)磁盤的容量是有限的,于是消息被生產(chǎn)者生產(chǎn)的時(shí)候分為不同的topic主題來保存,每個(gè)topic又被分為多個(gè)partition分區(qū),而每個(gè)partition分區(qū)對應(yīng)一個(gè)文件,以文件的方式來保存消息數(shù)據(jù),每個(gè)文件又可以被保存在不同的broker上,這樣就實(shí)現(xiàn)了Kafka集群來分布式存儲消息隊(duì)列。
另外,每個(gè)partition都有一定的副本,可以備份到不同的borker上,從而提高可用性。
總的來說就是,一個(gè)topic對應(yīng)的多個(gè)partition上的文件分散保存在集群的多個(gè)不同broker上,存儲的方式是一個(gè)partition對應(yīng)一個(gè)文件,每個(gè)broker負(fù)責(zé)存儲在自己機(jī)器上的每個(gè)文件的讀寫。 -
副本:replicated
Kafka可以通過配置指定partition的備份個(gè)數(shù)(replicas),每個(gè)partition將會被備份到多臺機(jī)器上,提高了可用性,備份數(shù)量通過配置文件可以指定。
實(shí)質(zhì)上,冗余備份在分布式系統(tǒng)中很常見。
有副本的存在,就會涉及到同一個(gè)文件的多個(gè)副本如何管理和調(diào)度。
Kafka設(shè)置了“l(fā)eader機(jī)制”,每個(gè)partition選舉一個(gè)broker作為leader,用來負(fù)責(zé)對該分區(qū)的讀寫,其余broker則作為follower,只需簡單地和leader同步即可。如果原來的leader失效,partition則會選舉新的broker成為leader。
至于如何選取 leader,實(shí)際上如果我們了解 ZooKeeper,就會發(fā)現(xiàn)其實(shí)這正是 Zookeeper 所擅長的,Kafka 使用 ZK 在 Broker 中選出一個(gè) Controller,用于 Partition 分配和 Leader 選舉。
實(shí)際上,作為leader的server,承擔(dān)了整個(gè)分區(qū)的所有讀寫請求,負(fù)擔(dān)是比較大的。從整體考慮,有多少個(gè)partition就有多少個(gè)leader,Kafka將leader分?jǐn)偟讲煌腷roker上,也算是整體上的一種負(fù)載均衡。 -
Kafka數(shù)據(jù)流處理
(1)數(shù)據(jù)產(chǎn)生方式:produce
生產(chǎn)者寫入消息數(shù)據(jù)可以指定4個(gè)參數(shù),分別為topic,partition,key,value。其中topic和value(要寫入的數(shù)據(jù))必須指定,而key和partition是可選的。
對于一條記錄,要先對其進(jìn)行序列化,再按照topic和partition,發(fā)送到對應(yīng)的隊(duì)列中去。如果沒有指定partition,有兩種情況:
-
指定key,按照key進(jìn)行哈希,同一個(gè)key的消息進(jìn)一個(gè)partition
-
未指定key, round-robin進(jìn)行partition的選擇
producer將會和topic下的每個(gè)partiton leader保持socket連接,消息由producer直接發(fā)送給broker。
其中partition leader的身份在zookeeper中已經(jīng)注冊,producer作為zookeeper client,已經(jīng)注冊了watch用來監(jiān)聽partition leader的變更事件,因此可以準(zhǔn)確知道leader是誰。
producer端采用異步發(fā)送,先將一部分的消息存在客戶端的buffer里,并將其分批發(fā)送給broker,小數(shù)據(jù)io很多會增加整體網(wǎng)絡(luò)的延遲,批量延遲發(fā)送實(shí)際上是提供了網(wǎng)絡(luò)效率。
(2)數(shù)據(jù)消費(fèi)過程:custome -
對于消費(fèi)者,不是以單獨(dú)形式存在的,每個(gè)消費(fèi)者都屬于一個(gè)消費(fèi)群租customer group,一個(gè)group包含多個(gè)consumer。需要注意的是,消費(fèi)者的訂閱topic行為都是以customer group的形式來訂閱的,發(fā)送到topic的消息,只會被訂閱該topic的每個(gè)group中的每個(gè)customer消費(fèi)。
-
如果說所有的customer都有共同的group,那么就像是一個(gè)點(diǎn)對點(diǎn)的消息系統(tǒng);如果每個(gè)消費(fèi)者都屬于不同的group,那么消息會廣播給所有的消費(fèi)者。
-
實(shí)際上消息是根據(jù)partition來分的,一個(gè)partition只能被消費(fèi)組里的一個(gè)消費(fèi)者消費(fèi),但是可以多個(gè)不同的消費(fèi)組消費(fèi),消費(fèi)組里的每個(gè)消費(fèi)者是關(guān)聯(lián)到一個(gè)partition的;因此有一個(gè)說法:對同一個(gè)topic,同一個(gè)group中不能有多于partitions個(gè)數(shù)的customer同時(shí)消費(fèi),否則某些customer將無法得到消息。
-
同一個(gè)消費(fèi)組的兩個(gè)customer不能同時(shí)消費(fèi)一個(gè)partition
-
partition 中的消息只有一個(gè) consumer 在消費(fèi),且不存在消息狀態(tài)的控制,也沒有復(fù)雜的消息確認(rèn)機(jī)制,可見katka broker 端是相當(dāng)輕量級的。當(dāng)消息被 consumer 接收之后,需要保存 Offset 記錄消費(fèi)到哪,以前保存在ZK中,由于 ZK 的寫性能不好,以前的解決方法都是Consumer 每隔一分鐘上報(bào)一次,在0.10 版本后,Kafka 把這個(gè)Offset 的保存,從ZK 中剝離,保存在一個(gè)名叫 consumeroffsets topic 的Topic 中,由此可見consumer 客戶端也很輕量級文章來源:http://www.zghlxwxcb.cn/news/detail-729780.html
用例
Kafka可以在很多場景中使用,以下列出一些用例:文章來源地址http://www.zghlxwxcb.cn/news/detail-729780.html
- 指標(biāo)
Kafka通常用于操作監(jiān)控?cái)?shù)據(jù)。這涉及到聚合來自分布式應(yīng)用程序的統(tǒng)計(jì)信息,以產(chǎn)生操作數(shù)據(jù)的集中饋送。 - 日志聚合解決方案
可用于跨組織收集多個(gè)服務(wù)的日志,且以標(biāo)準(zhǔn)格式提供給多個(gè)服務(wù)器。 - 流處理
流行的框架(如Storm和Spark Streaming)從主題中讀取數(shù)據(jù),對其進(jìn)行處理,并將處理后的數(shù)據(jù)寫入新主題,供用戶和應(yīng)用程序使用。 Kafka的強(qiáng)耐久性在流處理的上下文中也非常有用。
到了這里,關(guān)于消息中間件(二)——kafka的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!