了解 Kafka

一、Kafka簡介

Apache Kafka發(fā)源于LinkedIn,于2012年成為Apache的主要項目之一。由Scala和Java編寫。Apache Kafka是一個具有高吞吐量、內(nèi)置分區(qū)、支持數(shù)據(jù)副本和可容錯性的分布式-發(fā)布訂閱消息系統(tǒng),適合在大規(guī)模消息處理場景中使用。

二、消息系統(tǒng):兩種消息模式

1.目前有兩種類型的消息模式可用,一種是點對點,另一種是發(fā)布-訂閱消息系統(tǒng)

1.1點對點消息系統(tǒng)(11

??在點對點系統(tǒng)中,消息持久化到一個隊列中。?一個或多個消費者可以消費隊列中的消息,但是一條消息只能被消費一次。?當(dāng)一個消費者消費了隊列中的某條數(shù)據(jù)之后,該條數(shù)據(jù)則從消息隊列中刪除。該系統(tǒng)的典型示例是訂單處理系統(tǒng),其中每個訂單將由一個訂單處理器處理,但多個訂單處理器也可以同時工作。


1.2發(fā)布-?訂閱消息系統(tǒng)(1對多)

??在發(fā)布-訂閱消息系統(tǒng)中,消息被持久化到一個topic中。與點對點消息系統(tǒng)不同的是,消費者可以訂閱一個或多個topic,消費者可以消費該topic中所有的數(shù)據(jù),同一條數(shù)據(jù)可以被多個消費者消費,數(shù)據(jù)被消費后不會立馬刪除。(kafka可以設(shè)置消息的保存策略為N天,在消息發(fā)布的N天內(nèi)都是可以被消費的,N天后它將被丟棄以釋放資源)在發(fā)布-訂閱消息系統(tǒng)中,消息的生產(chǎn)者稱為發(fā)布者,消費者稱為訂閱者。一個現(xiàn)實生活的例子是電視,它發(fā)布不同的渠道,如運動,電影,音樂等,任何人都可以訂閱自己的頻道集,并獲得他們訂閱的頻道時可用。


三、kafka概述

1.Kafka的特性:

高性能:Kafka在數(shù)據(jù)發(fā)布和訂閱過程中都能保證數(shù)據(jù)的高吞吐量。即便在TB級數(shù)據(jù)存儲的情況下,仍然能保證穩(wěn)定的性能

可擴展性:Kafka消息系統(tǒng)支持集群規(guī)模的熱擴展(熱擴展:在運行狀態(tài)下擴展集群)

持久性、可靠性:消息被持久化到本地磁盤,并且支持數(shù)據(jù)備份防止數(shù)據(jù)丟失

容錯性:允許集群中節(jié)點失敗

高并發(fā):支持數(shù)千個客戶端同時讀寫

2.kafka的使用場景

1、消息系統(tǒng)

對于一些常規(guī)的消息系統(tǒng),kafka是個不錯的選擇;partitions/replication和容錯,可以使kafka具有良好的擴展性和性能優(yōu)勢.不過到目前為止,我們應(yīng)該很清楚認識到,kafka并沒有提供JMS(JMS是Java提供的一套技術(shù)規(guī)范和關(guān)于消息中間件的協(xié)議)中的"事務(wù)性""消息傳輸擔(dān)保(消息確認機制)""消息分組"等企業(yè)級特性;kafka只能使用作為"常規(guī)"的消息系統(tǒng),在一定程度上,尚未確保消息的發(fā)送與接收絕對可靠(比如,消息重發(fā),消息發(fā)送丟失等)

:消息丟失情況:客戶端默認情況下是自動提交offset,這樣可能存在消息丟失的可能性,比如客戶端接收到一批消息并進行處理,在處理過程中達到了客戶端offset定時提交的時間點,這批數(shù)據(jù)的offset被提交,但是可能這批數(shù)據(jù)的處理還沒有結(jié)束,甚至這些數(shù)據(jù)可能還存在一些數(shù)據(jù)處理不了或者處理出錯,甚至出現(xiàn)宕機的可能性,這時未處理的消息將會丟失,因為offset已經(jīng)提交,下次讀取會從新的offset處讀取。

2、用戶活動跟蹤

kafka可以作為"網(wǎng)站活性跟蹤"的最佳工具;可以將網(wǎng)頁/用戶操作等信息發(fā)送到kafka中.并實時監(jiān)控,或者離線統(tǒng)計分析等

3、日志收集

kafka的特性決定它非常適合作為"日志收集中心";application可以將操作日志"批量""異步"的發(fā)送到kafka集群中,而不是保存在本地或者DB中;kafka可以批量提交消息/壓縮消息等,這對producer端而言,幾乎感覺不到性能的開支.此時consumer端可以使hadoop等其他系統(tǒng)化的存儲和分析系統(tǒng).(hadoop:分布式文件系統(tǒng),用來告訴運算和存儲,它提供了高吞吐量來訪問應(yīng)用程序數(shù)據(jù),適合有著超大數(shù)據(jù)集的應(yīng)用程序)

四、Kafka基本概念及一些術(shù)語

1、Producer即:消息生產(chǎn)者,是消息的產(chǎn)生的源頭,負責(zé)生成消息并發(fā)送到Kafka服務(wù)器上。

2、Consumer即:消息消費者,是消息的使用方,負責(zé)消費Kafka服務(wù)器上的消息。

3、Topic即:主題,Kafka將消息以topic為單位進行歸納,一個topic是對一組消息的歸納,用于建立生產(chǎn)者和消息者之間的訂閱關(guān)系:生產(chǎn)者發(fā)送消息到指定的Topic下,消息者從這個Topic下消費消息。

4、Partition即:?消息分區(qū),一個?topic可以分為多個?partition,每個?partition?是一個有序的隊列。每個partition在存儲層面是append log文件。任何發(fā)布到此partition的消息都會被直接追加到log文件的尾部,分區(qū)中的每個消息都有一個連續(xù)的序列號叫做offset(偏移量),offset為一個long型數(shù)字,它是唯一標(biāo)記一條消息。分區(qū)是kafka獨有的東西,也是kafka實現(xiàn)橫向擴展和高并發(fā)的一個重要設(shè)計。將日志分區(qū)可以達到以下目的:首先這使得每個日志的數(shù)量不會太大,可以在單個服務(wù)上保存。另外每個分區(qū)可以單獨發(fā)布和消費,為并發(fā)操作topic提供了一種可能。

5、Broker:即Kafka的服務(wù)器,Kafka以集群的方式運行,可以由一個或多個服務(wù)組成,每個服務(wù)節(jié)點叫做broker.

6、ConsumerGroup即:消費者分組,用于歸組同類消費者,在Kafka中,多個消費者可以共同消費一個Topic下的消息,每個消費者消費其中的部分消息,這些消費者就組成了一個分組,擁有同一個分組名稱,通常也被稱為消費者集群。

注:一個Consumer在某個時刻只會消費一個partition,不存在多個Consumer共同消費一個partition中的消息。(一個consumer對應(yīng)一個partition)

7、Replicas of partition:即:副本,副本是一個分區(qū)的備份。副本不會被消費者消費,副本只用于防止數(shù)據(jù)丟失,即消費者不從為follower的partition中消費數(shù)據(jù),而是從為leader的partition中讀取數(shù)據(jù)。

8、Leader:?每個partition有多個副本分布到各個broker上(副本數(shù)小于等于broker數(shù)),其中有且僅有一個作為Leader,Leader是當(dāng)前負責(zé)數(shù)據(jù)的讀寫的partition。

9、Follower:Follower跟隨Leader,所有寫請求都通過Leader路由,數(shù)據(jù)變更會廣播給所有Follower.如果領(lǐng)導(dǎo)失敗,一個追隨者將自動成為新的領(lǐng)導(dǎo)者。

10、Zookeeper:是一個分布式應(yīng)用程序協(xié)調(diào)服務(wù),負責(zé)維護和協(xié)調(diào)broker。當(dāng)Kafka系統(tǒng)中新增了broker或者某個broker發(fā)生故障失效時,由ZooKeeper通知生產(chǎn)者和消費者。生產(chǎn)者和消費者依據(jù)Zookeeper的broker狀態(tài)信息與broker協(xié)調(diào)數(shù)據(jù)的發(fā)布和訂閱任務(wù)。broker使用Zookeeper維護集群的狀態(tài)。Leader的選舉也由Zookeeper負責(zé)。實現(xiàn)動態(tài)的集群擴展,不需要更改客戶端的配置(producer和consumer),zookeeper上保存元數(shù)據(jù)(topic,partiotions信息等,不包括發(fā)送給topic本身的數(shù)據(jù))

11、?ISR(In-Sync Replica):是Replicas的一個子集,是一個列表,表示目前Alive且與Leader能夠“Catch-up”的Replicas集合(就是一個含符合要求的follower的集合)。由于讀寫都是首先落到Leader上,所以一般來說通過同步機制從Leader上拉取數(shù)據(jù)的Replica都會和Leader有一些延遲(包括了延遲時間和延遲條數(shù)兩個維度),任意一個超過閾值都會把該Replica踢出ISR。每Partition都有它自己獨立的ISR。Leader會從ISR中選取。


下面舉個例子,幫助我們更好的了解他們之間的關(guān)系

例:場景一:?topic1?下有partition1和partition2?,topic2下有partition3,Consumer group下有consumer1和consumer2和consumer3?,所有consumer只有一個線程。

消費情況:?consumer1只消費partition1的數(shù)據(jù)

? ? ? ? ? ? ? ? ?consumer2只消費partition2的數(shù)據(jù)

? ? ? ? ? ? ? ? ?consumer3只消費partition3的數(shù)據(jù)

? ? ? ? ? ? ? ? ?consumer4不會消費到任何數(shù)據(jù)

? ? ? 原因:?Consumer只能接受一個partition(分區(qū))的數(shù)據(jù)

場景二: ? ?topic1?下有partition1和partition2,group下有consumer1

? ? ? ? ? ? ? ? ?consumer只有一個線程,且消費topic1的消息.

消費情況:?consumer1先消費partition1的數(shù)據(jù)

? ? ? ? ? ? ? ? ? consumer1消費完partition1數(shù)據(jù)后開始消費partition2的數(shù)據(jù)

注:?consumer在消費消息時必須指定topic,可以不指定partition,場景二的情況就是發(fā)生在不指定partition的情況下,如果consumer1指定了partition1,那么consumer1消費完partition1后哪怕處于空閑狀態(tài)了也是不會消費partition2的消息的.


五、Kafka的設(shè)計思想、可容錯性

1.leader的選舉

kafka將每個partition數(shù)據(jù)備份到多個broker上,kafka會為partition選出一個leader,之后所有該partition的請求,實際操作的都是leader,然后再同步到其他的follower。當(dāng)一個broker宕機后,所有l(wèi)eader在該broker上的partition都會重新選舉,選出一個leader。關(guān)于partition的分配,還有l(wèi)eader的選舉,總得有個執(zhí)行者。在kafka中,這個執(zhí)行者就叫controller。kafka使用zookeeper在broker中選出一個controller,用于partition分配和leader選舉.

2.controller的選舉

Controller的選舉與leader的選舉類似:Kakfa Broker集群受Zookeeper管理。所有的Kafka Broker節(jié)點一起去Zookeeper上注冊一個臨時節(jié)點,因為只有一個Kafka Broker會注冊成功,其他的都會失敗,所以這個成功在Zookeeper上注冊臨時節(jié)點的這個Kafka Broker會成為Kafka Broker Controller,其他的Kafka broker叫Kafka Broker follower。這個Controller會監(jiān)聽其他的Kafka Broker的所有信息,如果這個kafka broker controller宕機了,在zookeeper上面的那個臨時節(jié)點就會消失,此時所有的kafka broker又會一起去Zookeeper上注冊一個臨時節(jié)點,因為只有一個Kafka Broker會注冊成功,其他的都會失敗,所以這個成功在Zookeeper上注冊臨時節(jié)點的這個Kafka Broker會成為Kafka Broker Controller,


六、Kafka如何做到高吞吐量的?

1.順序讀寫

硬盤是機械結(jié)構(gòu),需要指針尋址找到存儲數(shù)據(jù)的位置,如果是隨機IO,磁盤會進行頻繁的尋址,導(dǎo)致寫入速度下降。kafka的消息是不斷追加到文件中的,這個特性使kafka可以充分利用磁盤的順序讀寫性能,順序讀寫不需要硬盤磁頭的尋址時間,只需很少的扇區(qū)旋轉(zhuǎn)時間,所以速度遠快于隨機讀寫,Kafka使用了順序IO提高了磁盤的寫入速度。關(guān)于磁盤I/O的性能。

引用一組Kafka官方給出的測試數(shù)據(jù)(Raid-5,7200rpm):Sequence I/O: 600MB/s,Random I/O: 100KB/s

2.零拷貝

傳統(tǒng)網(wǎng)絡(luò)IO:1.?操作系統(tǒng)將數(shù)據(jù)從磁盤文件中讀取到內(nèi)核空間的頁面緩存;

2.?應(yīng)用程序?qū)?shù)據(jù)從內(nèi)核空間讀入用戶空間緩沖區(qū);

3.?應(yīng)用程序?qū)⒆x到數(shù)據(jù)寫回內(nèi)核空間并放入socket緩沖區(qū);

4.?操作系統(tǒng)將數(shù)據(jù)從socket緩沖區(qū)復(fù)制到網(wǎng)卡接口,此時數(shù)據(jù)才能通過網(wǎng)絡(luò)發(fā)送。

備注:內(nèi)核空間:操作系統(tǒng);?用戶空間:應(yīng)用程序



通常情況下,Kafka的消息會有多個訂閱者,生產(chǎn)者發(fā)布的消息會被不同的消費者多次消費,為了優(yōu)化這個流程,Kafka使用了“零拷貝技術(shù)”,

“零拷貝技術(shù)”只用將磁盤文件的數(shù)據(jù)復(fù)制到頁面緩存中一次,然后將數(shù)據(jù)從頁面緩存直接發(fā)送到網(wǎng)絡(luò)中(發(fā)送給不同的訂閱者時,都可以使用同一個頁面緩存),減少了兩次數(shù)據(jù)的拷貝,避免了重復(fù)的復(fù)制操作。

如果有10個消費者,傳統(tǒng)方式下,數(shù)據(jù)復(fù)制次數(shù)為4*10=40次,而使用“零拷貝技術(shù)”只需要1+10=11次,一次為從磁盤復(fù)制到頁面緩存,10次表示10個消費者各自讀取一次頁面緩存。

3.分區(qū)

kafka中的topic中的內(nèi)容可以被分為多分partition存在,所以每次操作都是針對一小部分做操作,很輕便,并且增加并行操作的能力。(一個partition相當(dāng)于一個并發(fā))

4.數(shù)據(jù)壓縮

Kafka還支持對消息集合進行壓縮,Producer可以通過GZIP或Snappy格式對消息集合進行壓縮,壓縮的好處就是減少傳輸?shù)臄?shù)據(jù)量,減輕對網(wǎng)絡(luò)傳輸?shù)膲毫?/p>

5.生產(chǎn)者客戶端緩存消息批量發(fā)送,消費者批量從broker獲取消息,減少網(wǎng)絡(luò)io次數(shù),充分利用磁盤順序讀寫的性能。(producer中配置batch.size)

七、Kafka和rabbitMQ的區(qū)別

1.在吞吐量方面

Kafka是嚴(yán)格保證了消息隊列的順序,就是一個topic下面的一個分區(qū)內(nèi)只能給一個消費者消費,對于一個分區(qū)來說,kafka是不支持并發(fā),但是可以通過擴大分區(qū)實現(xiàn)并發(fā),追求吞吐量,對消息的重復(fù)、丟失、錯誤沒有嚴(yán)格要求,適合產(chǎn)生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務(wù)的數(shù)據(jù)收集業(yè)務(wù)。

Rabbitmq?不承諾消息的順序性,因此可以并發(fā)多線程處理。在隊列中不必排隊。如果對處理的順序沒有要求,就可以用Rabbitmq較容易的實現(xiàn)并發(fā)。更多用在企業(yè)系統(tǒng)內(nèi),對數(shù)據(jù)一致性、穩(wěn)定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

2.在實際生產(chǎn)應(yīng)用中

通常會使用kafka作為消息傳輸?shù)臄?shù)據(jù)管道,rabbitmq作為交易數(shù)據(jù)作為數(shù)據(jù)傳輸管道,主要的取舍因素則是是否存在丟數(shù)據(jù)的可能;rabbitmq在金融場景中經(jīng)常使用,具有較高的嚴(yán)謹性,數(shù)據(jù)丟失的可能性更小,同時具備更高的實時性;而kafka優(yōu)勢主要體現(xiàn)在吞吐量上,雖然可以通過策略實現(xiàn)數(shù)據(jù)不丟失,但從嚴(yán)謹性角度來講,大不如rabbitmq;而且由于kafka保證每條消息最少送達一次,有較小的概率會出現(xiàn)數(shù)據(jù)重復(fù)發(fā)送的情況;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容