Kafka概述

什么是kafka

Kafka官網(wǎng)介紹kafka是一個分布式的流平臺。

  • 可以讓你發(fā)布和訂閱流式的記錄。這一方面與消息隊列或者企業(yè)消息系統(tǒng)類似。
  • 可以儲存流式的記錄,并且有較好的容錯性。
  • 可以在流式記錄產(chǎn)生時就進行處理。

平時對kafka的認識還是作為消息隊列比較多,其他特性在大數(shù)據(jù)領(lǐng)域應(yīng)用很廣。簡單來說kafka是一個基于消息、分布式、高吞吐的流平臺。

主題與日志

Kafka是以發(fā)布—訂閱的方式形式進行數(shù)據(jù)傳輸,數(shù)據(jù)的發(fā)送者(稱為發(fā)布者)不會將數(shù)據(jù)直接發(fā)送給特定的接收者(稱為訂閱者)。發(fā)布者以某種方式將消息進行分類,接受者訂閱它們,以便接收特定類型的消息。
在 Kafka 中,發(fā)布訂閱的對象是主題(Topic),你可以為每個業(yè)務(wù)、每個應(yīng)用甚至是每類數(shù)據(jù)都創(chuàng)建專屬的主題。Kafka 將每個主題劃分成多個分區(qū)(Partition),每個分區(qū)是一組有序的消息日志,消息日志是kafka的數(shù)據(jù)單元,由消息和鍵組成。

來自官網(wǎng)

這里重點說一下日志的概念,日志是分布式系統(tǒng)的靈魂。這里的日志并非日常開發(fā)中打印的日志,這里的日志通常是只能追加、按照時間完全有序(totally-ordered)的記錄序列,如mysql中的binlog是記錄所有數(shù)據(jù)庫表結(jié)構(gòu)變更,redis的AOF記錄每次寫命令。
通過這種方式可以實現(xiàn)提供節(jié)點之間的數(shù)據(jù)復(fù)制、為系統(tǒng)提供外部的數(shù)據(jù)訂閱、調(diào)整節(jié)點之間的數(shù)據(jù)平衡等功能。Kafka的消息日志也是遵循上面的規(guī)則設(shè)計的,是一段有序只能追加的寫的物理文件。
即使我們之前沒有使用過kafka,也聽說過kafka的高吞吐,但是kafka對消息日志做了持久化的處理,我們都知道涉及到磁盤IO都想到一個慢字。kafka的高吞吐的一方面就是在于它日志的設(shè)計。

  • append-only
    官網(wǎng)提到don't fear the filesystem!,不要害怕文件系統(tǒng)。我們固定思維以為涉及到磁盤文件會很慢,是因為我們使用的方式不對,只要使用方式正確磁盤文件也可以像網(wǎng)絡(luò)一樣快。磁盤系統(tǒng)慢是因為它的尋址,磁盤的順序?qū)懕入S機寫快6000倍以上,這是因為操作系統(tǒng)提供了 read-ahead 和 write-behind 技術(shù),read-ahead 是以大的 data block 為單位預(yù)先讀取數(shù)據(jù),而 write-behind 是將多個小型的邏輯寫合并成一次大型的物理磁盤寫入。
  • batch and zero-copy
    使用順序?qū)懴舜疟P訪問慢的情況,關(guān)于IO操作低下的主要原因就剩下了兩個:大量的小型 I/O 操作,以及過多的字節(jié)拷貝。
    為了提高效率消息按照批次寫入kafka,批次就是一組消息,這些消息都屬于來自同一個主題和分區(qū)。這樣減少了小型的I/O操作,但是消息的實時性就有所損耗。
    另外一個就是zero-copy,關(guān)于零拷貝我之前有文章介紹了零拷貝的概念,這里不多講。簡單來說,傳統(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)者與消費者。

生產(chǎn)者

生產(chǎn)者程序通常持續(xù)不斷地向一個或多個主題發(fā)送消息,生產(chǎn)者默認情況下把消息均勻的分布到主題的分區(qū)上,也可以將消息發(fā)送到指定的分區(qū),通常是通過消息鍵和分區(qū)策略實現(xiàn)的,后續(xù)會詳細介紹。

消費者

消費者讀取消息。消費者可以訂閱一個或者多個主題,并按照消息的生成順序讀取它們。每個消息日志都有自己的偏移量(offset),是一個不斷遞增的整數(shù)值,在創(chuàng)建消息的時候會保存進去。在給定的分區(qū)里面,每個消息的偏移量是唯一的。消費者把每個分區(qū)讀取的消息偏移量存入zookeeper(之前版本)或kafka,這樣在消費者關(guān)閉或者重啟,它的讀取狀態(tài)也不會消息。
為了提高消息的消費速度和擴展與容錯,kafka引入消費者組(consumer group)的概念。也就是說,會有一個消費者或者多個消費者讀取一個主題。群組保證一個分區(qū)只能被一個消費者使用。

消費者組

通過這種方式,消費者可以提高消費的速率,而且當(dāng)一個一個消費者失效之后,集群中其他消費者可以接管失效消費者的工作,這就是消費者重平衡,后續(xù)會介紹這個概念。

服務(wù)端與集群

有客戶端就有服務(wù)端,一個獨立的kafka服務(wù)器被稱為broker。broker處理客戶端的請求,接受生產(chǎn)者的消息,為消息設(shè)置偏移量,并提交消息到磁盤保存。為消費者提供服務(wù),對提取的分區(qū)做出相應(yīng),返回提交到磁盤的消息。
Kafka集群由多個broker組成,broker的信息存儲在zookeeper上,通過zookeeper可監(jiān)控和管理集群每個broker。在集群多個broker中會有一個broker充當(dāng)控制器的角色(controller),kafka使用zookeeper的臨時節(jié)點選舉控制器,控制器的作用很多比如主題的管理、集群成員管理等,這里就不詳細介紹了。
在kafka文檔中介紹“一個分布式、可分區(qū)的、可復(fù)制的提交日志服務(wù)”,復(fù)制是分布式系統(tǒng)中保證可用性的關(guān)鍵。
前面提高kafka使用topic組織數(shù)據(jù),一個topic被分為若干個個分區(qū),每個分區(qū)有多個副本。這些副本保存在broker上,每個broker可以保存多個屬于不同主題和分區(qū)的副本。
副本有兩種類型

  • leader:每個分區(qū)都有一個leader副本,為了保證數(shù)據(jù)一致性,所有生產(chǎn)者和消費者的請求都是處理的這個副本。
  • follower:leader以外的副本都是follower副本。follower不處理客戶端的請求,唯一的任務(wù)就是從leader那里復(fù)制消息,保持和leader一樣的狀態(tài)。如果leader崩潰,其中一個將會升為新leader。

總結(jié)

本文介紹了kafka的一些概念,比如消息日志、生產(chǎn)者、消費者、broker,下面一張圖詳細的展示了它們之間的關(guān)系。


極客時間《Kafka核心技術(shù)與實戰(zhàn)》

關(guān)于kafka,早在去年的時候就在斷斷續(xù)續(xù)的接觸和學(xué)習(xí),我學(xué)習(xí)kafka更多的側(cè)重點是它系統(tǒng)的設(shè)計,一個分布式的流服務(wù)器是怎么設(shè)計的。它是如何做到高可用、高吞吐的,這是很吸引人的東西。相反在關(guān)于kafka的使用和搭建我關(guān)注的就比較少,本文是我自己的在看了一些資料后的總結(jié)和一些看法,接下來的時間應(yīng)該也會繼續(xù)寫kafka相關(guān)的文章。

參考

《Kafka權(quán)威指南》
kafka官網(wǎng)
極客時間《Kafka核心技術(shù)與實戰(zhàn)》

最后編輯于
?著作權(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ù)。

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