最近需要了解 Kafka 源碼, 通過翻看 Kafka 源碼, 發(fā)現(xiàn)該項目的模塊化做的非常好. 簡單來說可以分成如下幾個模塊:
參考2012年 Jay Kreps 畫的一張 Kafka Broker Internals 的圖:
感嘆2012年至今, Kafka 大的架構基本上沒有變化.
API/Network
通信模塊. 官方文檔 A Guide to the Kafka Protocol 不在多說
Metrics
發(fā)現(xiàn)這個方面沒有人寫的非常明白. 多說幾句. Kafka 使用 Yammer 的 metrics-core 2.2 版本, 2.X 版本與 3.X 版本有很大區(qū)別. metrics-core 是支持 CSV 等方式吐出 Metric 數(shù)據(jù)的, 但是 Kafka 做了一層封裝, 并且默認僅僅支持 JMX 方式暴露, 比較好的是 Kafka 集成了 MX4J 組件, 通過在server.properties
中指定 kafka_mx4jenable=true mx4jport=端口
方式開啟.
如果想使用 CSV 等其他方式暴露 Kafka Metric 數(shù)據(jù), 需要做兩件事:
- 實現(xiàn)
kafka.metrics.KafkaMetricsReporter
這個 trait(再早的版本沒有看源碼), 包裝一層, 實現(xiàn)數(shù)據(jù)獲取的邏輯 (之前自己看錯, 0.10.0.0 與0.8.2 版本相同) - 在
server.properties
中使用metric.reporters=實現(xiàn)的Reporters逗號分隔
方式開啟對應的 Reporter
獲取到了 Kafka 的 metrics 數(shù)據(jù), 列幾個我認為比較重要的 metric:
** kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions **
- 含義: 正在復制的 Partition 的數(shù)量.
- 建議報警閾值: > 0 就建議報警. 但如果 Kafka 集群正在 reassign partition 時, 這個值也會 >0
kafka.controller:type=KafkaController,name=OfflinePartitionsCount
- 含義: 沒有 Leader 的 Partition 的數(shù)量. 處于這個狀態(tài)的 Partition 是不可讀也不可寫
- 建議報警閾值: >0 一旦出現(xiàn)就報警.
kafka.controller:type=KafkaController,name=ActiveControllerCount
- 含義: 活躍的 Controller 的數(shù)量.
- 建議報警閾值: != 0 就趕緊報警
kafka.server:type=ReplicaManager,name=PartitionCount
- 含義: 集群中 Partition 的總數(shù)
- 建議報警閾值: 感覺這個報警不可控.
關于 metric 就說到這里.
參考: How We Monitor and Run Kafka at Scale -- by Signalfx
LogManager
日志子系統(tǒng)負責日志的存儲和讀取. 美團技術團隊的博客的文章 Kafka文件存儲機制那些事 寫的非常好. 不多說.
ReplicaManager
Kafka 的 Topic 支持多個 Replica 高可用. 官方文檔 Kafka Replication
KafkaController
一個 Kafka 集群中有會有一個Broker 作為 Controller 負責集群. 該子系統(tǒng)包含多個模塊. 具體參考官方文檔 Kafka Controller Internals
DynamicConfigManager
DynamicConfigManager
負責所有 Zookeeper 上的 /config
路徑下的配置相關工作. 包含兩個大的模塊:
-
/config/clients
客戶端相關的配置 -
/config/topics
Topic 相關的配置
GroupCoordinator
參考文檔:
- Kafka Detailed Consumer Coordinator Design
- Kafka 0.9 Consumer Rewrite Design
- Introducing the Kafka Consumer: Getting Started with the New Apache Kafka 0.9 Consumer Client
總結
今天是第一天翻看 Kafka 源碼, 整理一下系統(tǒng)和知識結構, 后續(xù)再挨個模塊深入.
Kafka 依賴的多了, 熟悉源代碼是必需的, 一旦出現(xiàn)未知的問題再去翻代碼肯定是來不及的. 這也是我選擇開源項目作為重要系統(tǒng)組件的一個原則.
-- EOF --