乾貨 | Kafka 內核知識梳理,附思維導圖

前面我們已經分享過幾篇Kafka的文章,最近簡單梳理了下Kafka內核相關的知識,涵蓋了Kafka架構總結,副本機制,控制器,高水位機制,日誌或消息存儲,消息發送與消費機制等方面知識。文末含對應的Kafka內核思維導圖,供參考

1、 架構總結

1)Kafka實際上也是一個主從架構,有一個Controller角色即控制器,協調管理整個集羣;

2)有幾個Kafka術語肯定是不陌生的:broker,topic,partition,segment,生產者producer,消費者consumer;

2、消費發送機制

1)序列化器:序列化消息對象轉成字節數組,然後通過網絡傳輸。

2)分區器:計算消息發往的具體分區;如果顯示指定了partition,便不會走分區器。

3)消息緩衝池:客戶端的消息緩衝池,默認大小32M,見參數buffer.memory。

4)批量發送:緩衝池中消息會按batch分批次發送,默認批次大小16KB,見參數batch.size。

3、副本機制

1)分區副本默認1,見參數default.replication.factor。

2)副本作用(並不提供讀寫分離)

  • 實現冗餘,提高消息可靠性;

  • 實現高可用,參與leader選舉,在leader不可用時提高可用性。

3)leader副本選舉

  • 由控制器負責;

  • 選舉機制或策略:首先要弄明白AR,ISR的概念,基本策略是從AR中找第一個存活的副本,且該副本在ISR中。

4)Unclean leader選舉

參數unclean.leader.election.enable,用於控制是否允許非同步副本參與leader 選舉,默認false。如果開啓,則當ISR爲空時就會從這些副本中選舉新的leader,這個過程就稱爲Unclean leader選舉。

4、控制器概述

1)作用:協調與管理整個集羣,5個主要職責:

  • 主題增刪改

  • 分區重分配

  • leader選舉

  • 元數據管理

  • broker成員管理,宕機或加入

2)控制器選舉:基於zookeeper實現,利用了zookeeper的znode模型與監聽機制。

3)控制器故障轉移

  • 存在單點故障,但是每個broker節點都可以成爲controller;

  • 故障轉移即failover也是基於zookeeper實現的,znode模型與監聽機制,/controller節點。

5、HW機制

1)概念

HW即高水位,是Kafka副本對象的重要屬性,分區的高水位由leader副本的高水位表示,含義是被follower副本同步之後的位置。

2)作用

  • 定義消息可見性,只有分區高水位以下的消息才能被消費;

  • 幫助kafka完成副本同步,kafka是基於高水位實現的異步的副本同步機制。

3)LEO的概念

含義是日誌末端位移(Log End Offset),下一條消息寫入的位移。

6、消息消費機制

1)拉取機制

Kafka生產端是推的機制即Push,消費端是拉的機制即Pull。

2)Pull的優缺點

  • 優點是消費端可以自己控制消息的讀取速度和數量;

  • 缺點是不知道服務端有沒有數據,所以要一直pull或隔一定時間pull,可能要pull多次並等待。

3)消息投遞語義:

Kafka默認保證at-least-once delivery,容許用戶實現at-most-once語義,exactly-once的實現取決於目的存儲系統。

4)分區分配策略

  • RangeAssignor:按照分區範圍分配,當前默認策略;

  • RoundRobinAssignor:輪詢的方式分配;

  • StickyAssignor:Kafka 0.11版本引入,根據更多指標比如負載,儘可能均勻。

7、日誌存儲機制

1)原理

  • 分段存儲,這裏的段segment指的是日誌段文件,Kafka中的日誌含義即是消息或數據,日誌回滾受log.segment.bytes控制,默認1G;

  • 索引文件,一個稀疏格式的索引,受參數log.index.interval.bytes控制,默認4KB。即不是每條數據都會寫索引,默認每寫4KB數據纔會寫一條索引。

$ ll
-rw-r--r-- 1 kafka kafka    1002496 Apr 25 17:08 00000000000051402174.index
-rw-r--r-- 1 kafka kafka 1073741338 Apr 25 17:08 00000000000051402174.log
-rw-r--r-- 1 kafka kafka   10485760 Apr 26 15:03 00000000000051638285.index
-rw-r--r-- 1 kafka kafka  219984088 Apr 26 15:04 00000000000051638285.log

2)日誌留存策略

Kafka 會定期檢查是否要刪除舊消息,見參數 log.retention.check.interval.ms,默認5分鐘。當前有三種日誌留存策略:

  • 基於空間:log.retention.bytes,默認未開啓;

  • 基於時間:log.retention.hours(mintues/ms),默認7天;

  • 基於起始位移:Kafka 0.11.0.0版本引入,解決流處理場景中已處理的中間消息刪除問題。

目前基於時間的日誌留存策略最常使用。


爲了更好的精進學習Kafka,筆者參考本文製作了的一張思維導圖,分享:

關注本公衆號,後臺回覆 kafka2020 即可下載Kafka內核高清PDF文檔。

往期推薦

1、如何快速全面掌握Kafka?5000字吐血整理

2、HBase原理 | HBase Compaction介紹與參數調優

3、MapReduce Shuffle 和 Spark Shuffle 結業篇

4、實時數倉 | 你想要的數倉分層設計與技術選型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章