Kafka學習之路 (一)Kafka的簡介

1、簡介

1.1 概述

Kafka是最初由Linkedin公司開發,是一個分佈式、分區的、多副本的、多訂閱者,基於zookeeper協調的分佈式日誌系統(也能夠當作MQ系統),常見能夠用於web/nginx日誌、訪問日誌,消息服務等等,Linkedin於2010年貢獻給了Apache基金會併成爲頂級開源項目。nginx

主要應用場景是:日誌收集系統和消息系統。web

Kafka主要設計目標以下:數據庫

  • 可靠性 - Kafka是分佈式,分區,複製和容錯的。
  • 可擴展性 - Kafka消息傳遞系統輕鬆縮放,無需停機。
  • 耐用性 - Kafka使用分佈式提交日誌,這意味着消息會盡量快地保留在磁盤上,所以它是持久的。
  • 性能 - Kafka對於發佈和訂閱消息都具備高吞吐量。即便存儲了許多TB的消息,它也保持穩定的性能。

Kafka很是快,並保證零停機和零數據丟失。安全

Kafka能夠在許多用例中使用。 其中一些列出以下:服務器

  • 指標 - Kafka一般用於操做監控數據。這涉及聚合來自分佈式應用程序的統計信息,以產生操做數據的集中饋送。
  • 日誌聚合解決方案 - Kafka可用於跨組織從多個服務收集日誌,並使它們以標準格式提供給多個服務器。
  • 流處理 - 流行的框架(如Storm和SparkStreaming)從主題中讀取數據,對其進行處理,並將處理後的數據寫入新主題,供用戶和應用程序使用。 Kafka的強耐久性在流處理的上下文中也很是有用。

1.2 消息系統介紹

一個消息系統負責將數據從一個應用傳遞到另一個應用,應用只需關注於數據,無需關注數據在兩個或多個應用間是如何傳遞的。分佈式消息傳遞基於可靠的消息隊列,在客戶端應用和消息系統之間異步傳遞消息。有兩種主要的消息傳遞模式:點對點傳遞模式、發佈-訂閱模式。大部分的消息系統選用發佈-訂閱模式。Kafka就是一種發佈-訂閱模式架構

1.3 點對點消息傳遞模式

在點對點消息系統中,消息持久化到一個隊列中。此時,將有一個或多個消費者消費隊列中的數據。可是一條消息只能被消費一次。當一個消費者消費了隊列中的某條數據以後,該條數據則從消息隊列中刪除。該模式即便有多個消費者同時消費數據,也能保證數據處理的順序。這種架構描述示例圖以下:
Kafka學習之路 (一)Kafka的簡介
生產者發送一條消息到queue,只有一個消費者能收到。負載均衡

1.4 發佈-訂閱消息傳遞模式

在發佈-訂閱消息系統中,消息被持久化到一個topic中。與點對點消息系統不一樣的是,消費者能夠訂閱一個或多個topic,消費者能夠消費該topic中全部的數據,同一條數據能夠被多個消費者消費,數據被消費後不會立馬刪除。在發佈-訂閱消息系統中,消息的生產者稱爲發佈者,消費者稱爲訂閱者。該模式的示例圖以下:
Kafka學習之路 (一)Kafka的簡介
發佈者發送到topic的消息,只有訂閱了topic的訂閱者纔會收到消息。框架

2、Kafka的優勢

2.1 解耦

在項目啓動之初來預測未來項目會碰到什麼需求,是極其困難的。消息系統在處理過程當中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口。這容許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵照一樣的接口約束。異步

2.2 冗餘(副本)

有些狀況下,處理數據的過程會失敗。除非數據被持久化,不然將形成丟失。消息隊列把數據進行持久化直到它們已經被徹底處理,經過這一方式規避了數據丟失風險。許多消息隊列所採用的"插入-獲取-刪除"範式中,在把一個消息從隊列中刪除以前,須要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。分佈式

2.3 擴展性

由於消息隊列解耦了你的處理過程,因此增大消息入隊和處理的頻率是很容易的,只要另外增長處理過程便可。不須要改變代碼、不須要調節參數。擴展就像調大電力按鈕同樣簡單。

2.4 靈活性&峯值處理能力

在訪問量劇增的狀況下,應用仍然須要繼續發揮做用,可是這樣的突發流量並不常見;若是爲以能處理這類峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列可以使關鍵組件頂住突發的訪問壓力,而不會由於突發的超負荷的請求而徹底崩潰。

2.5 可恢復性

系統的一部分組件失效時,不會影響到整個系統。消息隊列下降了進程間的耦合度,因此即便一個處理消息的進程掛掉,加入隊列中的消息仍然能夠在系統恢復後被處理。

2.6 順序保證

在大多使用場景下,數據處理的順序都很重要。大部分消息隊列原本就是排序的,而且能保證數據會按照特定的順序來處理。Kafka保證一個Partition內的消息的有序性。

2.7 緩衝

在任何重要的系統中,都會有須要不一樣的處理時間的元素。例如,加載一張圖片比應用過濾器花費更少的時間。消息隊列經過一個緩衝層來幫助任務最高效率的執行——寫入隊列的處理會盡量的快速。該緩衝有助於控制和優化數據流通過系統的速度。

2.8 異步通訊

不少時候,用戶不想也不須要當即處理消息。消息隊列提供了異步處理機制,容許用戶把一個消息放入隊列,但並不當即處理它。想向隊列中放入多少消息就放多少,而後在須要的時候再去處理它們。

3、經常使用Message Queue對比

3.1 RabbitMQ

RabbitMQ是使用Erlang編寫的一個開源的消息隊列,自己支持不少的協議:AMQP,XMPP, SMTP, STOMP,也正因如此,它很是重量級,更適合於企業級的開發。同時實現了Broker構架,這意味着消息在發送給客戶端時先在中心隊列排隊。對路由,負載均衡或者數據持久化都有很好的支持。

3.2 Redis

Redis是一個基於Key-Value對的NoSQL數據庫,開發維護很活躍。雖然它是一個Key-Value數據庫存儲系統,但它自己支持MQ功能,因此徹底能夠當作一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操做,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不一樣大小的數據。實驗代表:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而若是數據大小超過了10K,Redis則慢的沒法忍受;出隊時,不管數據大小,Redis都表現出很是好的性能,而RabbitMQ的出隊性能則遠低於Redis。

3.3 ZeroMQ

ZeroMQ號稱最快的消息隊列系統,尤爲針對大吞吐量的需求場景。ZeroMQ可以實現RabbitMQ不擅長的高級/複雜的隊列,可是開發人員須要本身組合多種技術框架,技術上的複雜度是對這MQ可以應用成功的挑戰。ZeroMQ具備一個獨特的非中間件的模式,你不須要安裝和運行一個消息服務器或中間件,由於你的應用程序將扮演這個服務器角色。你只須要簡單的引用ZeroMQ程序庫,可使用NuGet安裝,而後你就能夠愉快的在應用程序之間發送消息了。可是ZeroMQ僅提供非持久性的隊列,也就是說若是宕機,數據將會丟失。其中,Twitter的Storm 0.9.0之前的版本中默認使用ZeroMQ做爲數據流的傳輸(Storm從0.9版本開始同時支持ZeroMQ和Netty做爲傳輸模塊)。

3.4 ActiveMQ

ActiveMQ是Apache下的一個子項目。 相似於ZeroMQ,它可以以代理人和點對點的技術實現隊列。同時相似於RabbitMQ,它少許代碼就能夠高效地實現高級應用場景。

3.5 Kafka/Jafka

Kafka是Apache下的一個子項目,是一個高性能跨語言分佈式發佈/訂閱消息隊列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具備如下特性:快速持久化,能夠在O(1)的系統開銷下進行消息持久化;高吞吐,在一臺普通的服務器上既能夠達到10W/s的吞吐速率;徹底的分佈式系統,Broker、Producer、Consumer都原生自動支持分佈式,自動實現負載均衡;支持Hadoop數據並行加載,對於像Hadoop的同樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka經過Hadoop的並行加載機制統一了在線和離線的消息處理。Apache Kafka相對於ActiveMQ是一個很是輕量級的消息系統,除了性能很是好以外,仍是一個工做良好的分佈式系統。

4、Kafka中的術語解釋

4.1 概述

在深刻理解Kafka以前,先介紹一下Kafka中的術語。下圖展現了Kafka的相關術語以及之間的關係:
Kafka學習之路 (一)Kafka的簡介
上圖中一個topic配置了3個partition。Partition1有兩個offset:0和1。Partition2有4個offset。Partition3有1個offset。副本的id和副本所在的機器的id剛好相同。

若是一個topic的副本數爲3,那麼Kafka將在集羣中爲每一個partition建立3個相同的副本。集羣中的每一個broker存儲一個或多個partition。多個producer和consumer可同時生產和消費數據。

4.2 broker

Kafka 集羣包含一個或多個服務器,服務器節點稱爲broker。

broker存儲topic的數據。若是某topic有N個partition,集羣有N個broker,那麼每一個broker存儲該topic的一個partition。

若是某topic有N個partition,集羣有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition數據。

若是某topic有N個partition,集羣中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘可能避免這種狀況的發生,這種狀況容易致使Kafka集羣數據不均衡。

4.3 Topic

每條發佈到Kafka集羣的消息都有一個類別,這個類別被稱爲Topic。(物理上不一樣Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic便可生產或消費數據而沒必要關心數據存於何處)。

相似於數據庫的表名。

4.4 Partition

topic中的數據分割爲一個或多個partition。每一個topic至少有一個partition。每一個partition中的數據使用多個segment文件存儲。partition中的數據是有序的,不一樣partition間的數據丟失了數據的順序。若是topic有多個partition,消費數據時就不能保證數據的順序。在須要嚴格保證消息的消費順序的場景下,須要將partition數目設爲1。

4.5 Producer

生產者即數據的發佈者,該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到當前用於追加數據的segment文件中。生產者發送的消息,存儲到一個partition中,生產者也能夠指定數據存儲的partition。

4.6 Consumer

消費者能夠從broker中讀取數據。消費者能夠消費多個topic中的數據。

4.7 Replica

partition 的副本,保障 partition 的高可用。
  

4.8 Consumer Group

每一個Consumer屬於一個特定的Consumer Group(可爲每一個Consumer指定group name,若不指定group name則屬於默認的group)。

4.9 Leader

每一個partition有多個副本,其中有且僅有一個做爲Leader,Leader是當前負責數據的讀寫的partition。

4.10 Follower

Follower跟隨Leader,全部寫請求都經過Leader路由,數據變動會廣播給全部Follower,Follower與Leader保持數據同步。若是Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從「in sync replicas」(ISR)列表中刪除,從新建立一個Follower。

4.11 controller:

kafka 集羣中的其中一個服務器,用來進行 leader election 以及 各類 failover。

4.12 Zookeeper:

kafka 經過 zookeeper 來存儲集羣的 meta 信息。

相關文章
相關標籤/搜索