認識kafka

  • 理解kafka
Apache kafka是消息中間件的一種,我發現不少人不知道消息中間件是什麼,在開始學習以前,我這邊就先簡單的解釋一下什麼是消息中間件,只是粗略的講解,目前kafka已經能夠作更多的事情。
舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產一個雞蛋,消費者就消費一個雞蛋,假設消費者消費雞蛋的時候噎住了(系統宕機了),生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再好比生產者很強勁(大交易量的狀況),生產者1秒鐘生產100個雞蛋,消費者1秒鐘只能吃50個雞蛋,那要不了一會,消費者就吃不消了(消息堵塞,最終致使系統超時),消費者拒絕再吃了,」雞蛋「又丟失了,這個時候咱們放個籃子在它們中間,生產出來的雞蛋都放到籃子裏,消費者去籃子裏拿雞蛋,這樣雞蛋就不會丟失了,都在籃子裏,而這個籃子就是」kafka「。
雞蛋其實就是「數據流」,系統之間的交互都是經過「數據流」來傳輸的(就是tcp、http什麼的),也稱爲報文,也叫「消息」。
消息隊列滿了,其實就是籃子滿了,」雞蛋「 放不下了,那趕忙多放幾個籃子,其實就是kafka的擴容。
各位如今知道kafka是幹什麼的了吧,它就是那個"籃子"。

 

 
  • Kafka的特性:
- 高吞吐量、低延遲:kafka每秒能夠處理幾十萬條消息,它的延遲最低只有幾毫秒,每一個topic能夠分多個partition, consumer group 對partition進行consume操做。
- 可擴展性:kafka集羣支持熱擴展
- 持久性、可靠性:消息被持久化到本地磁盤,而且支持數據備份防止數據丟失
- 容錯性:容許集羣中節點失敗(若副本數量爲n,則容許n-1個節點失敗)
- 高併發:支持數千個客戶端同時讀寫
 
  • kafka名詞解釋
  • producer:生產者。
  • consumer:消費者。
  • topic: 消息以topic爲類別記錄,Kafka將消息種子(Feed)分門別類,每一類的消息稱之爲一個主題(Topic)。
  • broker:以集羣的方式運行,能夠由一個或多個服務組成,每一個服務叫作一個broker;消費者能夠訂閱一個或多個主題(topic),並從Broker拉數據,從而消費這些已發佈的消息。
  • 每一個消息(也叫做record記錄,也被稱爲消息)是由一個key,一個value和時間戳構成。
 
  • 使用場景
1:Building real-time streaming data pipelines that reliably get data between systems or applications.在系統或應用程序之間構建可靠的用於傳輸實時數據的管道,消息隊列功能
2:Building real-time streaming applications that transform or react to the streams of data。構建實時的流數據處理程序來變換或處理數據流,數據處理功能
 
  • kafka結構拓撲圖
 

 

  • Topics and Logs
生產者的數據流量按照不一樣種類分爲不一樣的topic,一個topic可能有多個消費者進行消費。一個topic包含多個分區。
每一個分區都是有序的寫入日誌,每一個消息都是按照offset做爲惟一標識按照連續順序存儲在分區裏面。
生產者向kafka發送消息的時候,能夠指定分區進行寫入,若是不指定分區,它會按照均衡策略隨機寫入分區。
producer使用push模式將消息發佈到broker,consumer使用pull模式從broker訂閱並消費消息。
 

 

  • Leader選舉
Kafka經過Zookeeper管理集羣配置,選舉leader,以及在consumer group發生變化時進行rebalance。爲了保證較高的處理效率,消息的讀寫都是在固定的一個副本上完成。這個副本就是所謂的Leader,而其餘副本則是Follower。而Follower則會按期地到Leader上同步數據。
若是某個分區所在的服務器除了問題,不可用,kafka會從該分區的其餘的副本中選擇一個做爲新的Leader。以後全部的讀寫就會轉移到這個新的Leader上。如今的問題是應當選擇哪一個做爲新的Leader。顯然,只有那些跟Leader保持同步的Follower才應該被選做新的Leader。
  Kafka會在Zookeeper上針對每一個Topic維護一個稱爲ISR(in-sync replica,已同步的副本)的集合,該集合中是一些分區的副本。只有當這些副本都跟Leader中的副本同步了以後,kafka纔會認爲消息已提交,並反饋給消息的生產者。若是這個集合有增減,kafka會更新zookeeper上的記錄。
  若是某個分區的Leader不可用,Kafka就會從ISR集合中選擇 一個副本做爲新的Leader。
  顯然經過ISR,kafka須要的冗餘度較低,能夠容忍的失敗數比較高。假設某個topic有f+1個副本,kafka能夠容忍f個服務器不可用。
 
  • 消費者
  在消費者消費消息時,kafka使用offset來記錄當前消費的位置
  在kafka的設計中,能夠有多個不一樣的group來同時消費同一個topic下的消息,如圖,咱們有兩個不一樣的group同時消費,他們的的消費的記錄位置offset各不項目,不互相干擾。
  對於一個group而言,消費者的數量不該該多餘分區的數量,由於在一個group中,每一個分區至多隻能綁定到一個消費者上,即一個消費者能夠消費多個分區,一個分區只能給一個消費者消費
    所以,若一個group中的消費者數量大於分區數量的話,多餘的消費者將不會收到任何消息。
  • kafka優缺點
優勢:
  1. 可擴展。Kafka集羣能夠透明的擴展,增長新的服務器進集羣。
  2. 高性能。Kafka性能遠超過傳統的ActiveMQ、RabbitMQ等,Kafka支持Batch操做。
  3. 容錯性。Kafka每一個Partition數據會複製到幾臺服務器,當某個Broker失效時,Zookeeper將通知生產者和消費者從而使用其餘的Broker。
  4. 持久化:消息被持久化到本地磁盤(線性的按順序寫入磁盤,不會形成阻塞),而且支持數據備份防止數據丟失
缺點:
  1. 重複消息。Kafka保證每條消息至少送達一次,雖然概率很小,但一條消息可能被送達屢次。
  2. 消息亂序。Kafka某一個固定的Partition內部的消息是保證有序的,若是一個Topic有多個Partition,partition之間的消息送達不保證有序。
  3. 複雜性。Kafka須要Zookeeper的支持,Topic通常須要人工建立,部署和維護比通常MQ成本更高。

 

  • partiton中segment文件存儲結構
partition是分段的,每一個段叫LogSegment,包括了一個數據文件和一個索引文件,下圖是某個partition目錄下的文件:

每一個part在內存中對應一個index,記錄每一個segment中的第一條消息偏移。
  • segment file組成:由2大部分組成,分別爲index file和data file,此2個文件一一對應,成對出現,後綴".index"和「.log」分別表示爲segment索引文件、數據文件.
  • segment文件命名規則:partion全局的第一個segment從0開始,後續每一個segment文件名爲上一個全局partion的最大offset(偏移message數)。數值最大爲64位long大小,19位數字字符長度,沒有數字用0填充。
每一個segment中存儲不少條消息,消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。
下面文件列表是筆者在Kafka broker上作的一個實驗,建立一個topicXXX包含1 partition,設置每一個segment大小爲500MB,並啓動producer向Kafka broker寫入大量數據,以下圖2所示segment文件列表形象說明了上述2個規則:
相關文章
相關標籤/搜索