Kafka 監控對於叢集穩定性和效能至關重要。本文詳細介紹了 Kafka 的各項監控指標,包含主題層級的位元組流入/流出速率、訊息流入速率、請求成功/失敗率等,以及分割槽層級的分割槽大小、日誌段數量、偏移量等。此外,文章也涵蓋了 JVM 層級的 GC 監控,例如 G1 GC 的 CollectionCount 和 CollectionTime,以及作業系統層級的 CPU 使用率、系統負載、記憶體和磁碟使用率、網路流量等關鍵指標。最後,文章也說明瞭日誌管理的重要性,並建議啟用特定日誌記錄器以取得更詳細的資訊,方便工程師針對不同層級的指標進行分析,快速找出並解決 Kafka 叢集的效能瓶頸。
Kafka 監控指標詳解
在 Kafka 叢集的維運過程中,監控指標的收集和分析至關重要。這些指標不僅能幫助我們瞭解叢集的執行狀態,還能及時發現潛在問題,確保叢集的穩定性和效能。
主題層級指標
Kafka 提供了一系列主題層級的指標,用於監控特定主題的效能和執行狀態。這些指標包括:
位元組流入速率
- 指標名稱:BytesInPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=TOPICNAME - 描述:該指標表示每秒流入特定主題的位元組數,反映了生產者向該主題寫入資料的速率。
位元組流出速率
- 指標名稱:BytesOutPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=TOPICNAME - 描述:該指標表示每秒從特定主題流出的位元組數,反映了消費者從該主題讀取資料的速率。
失敗的抓取請求速率
- 指標名稱:FailedFetchRequestsPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec,topic=TOPICNAME - 描述:該指標表示每秒失敗的抓取請求數量,可能指示消費者在讀取資料時遇到的問題。
失敗的生產請求速率
- 指標名稱:FailedProduceRequestsPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=TOPICNAME - 描述:該指標表示每秒失敗的生產請求數量,可能指示生產者在寫入資料時遇到的問題。
訊息流入速率
- 指標名稱:MessagesInPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=TOPICNAME - 描述:該指標表示每秒流入特定主題的訊息數量,反映了生產者的寫入速率。
抓取請求速率
- 指標名稱:TotalFetchRequestsPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=TotalFetchRequestsPerSec,topic=TOPICNAME - 描述:該指標表示每秒對特定主題的抓取請求數量,反映了消費者的讀取頻率。
生產請求速率
- 指標名稱:TotalProduceRequestsPerSec
- JMX MBean:
kafka.server:type=BrokerTopicMetrics,name=TotalProduceRequestsPerSec,topic=TOPICNAME - 描述:該指標表示每秒對特定主題的生產請求數量,反映了生產者的寫入頻率。
分割槽層級指標
除了主題層級的指標,Kafka 還提供了分割槽層級的指標,用於更細粒度地監控每個分割槽的狀態。這些指標包括:
分割槽大小
- 指標名稱:Size
- JMX MBean:
kafka.log:type=Log,name=Size,topic=TOPICNAME,partition=0 - 描述:該指標表示特定分割槽在磁碟上佔用的位元組數,反映了該分割槽儲存的資料量。
// 檢視分割槽大小範例程式碼
public class PartitionSizeChecker {
public static void main(String[] args) {
// 建立 Kafka 管理客戶端
AdminClient adminClient = AdminClient.create(KafkaProperties.adminProps());
// 取得主題的分割槽資訊
DescribeTopicsResult result = adminClient.describeTopics(Collections.singleton("TOPICNAME"));
// 處理分割槽資訊
result.all().get().forEach((topic, description) -> {
description.partitions().forEach(partition -> {
// 使用 JMX 取得分割槽大小
ObjectName objectName = new ObjectName("kafka.log:type=Log,name=Size,topic=" + topic + ",partition=" + partition.partition());
// ...
});
});
}
}
日誌段數量
- 指標名稱:NumLogSegments
- JMX MBean:
kafka.log:type=Log,name=NumLogSegments,topic=TOPICNAME,partition=0 - 描述:該指標表示特定分割槽的日誌段檔案數量,反映了該分割槽的日誌管理狀況。
日誌結束偏移量
- 指標名稱:LogEndOffset
- JMX MBean:
kafka.log:type=Log,name=LogEndOffset,topic=TOPICNAME,partition=0 - 描述:該指標表示特定分割槽當前最新的偏移量,反映了該分割槽最新的資料寫入位置。
日誌起始偏移量
- 指標名稱:LogStartOffset
- JMX MBean:
kafka.log:type=Log,name=LogStartOffset,topic=TOPICNAME,partition=0 - 描述:該指標表示特定分割槽當前最早的偏移量,反映了該分割槽最早的資料儲存位置。
內容解密:
- 分割槽大小(Size)用於監控每個分割槽在磁碟上的資料量,有助於評估儲存使用情況和資料分佈是否均勻。
- 日誌段數量(NumLogSegments)用於監控分割槽的日誌管理狀況,多個日誌段可能影響效能。
- 日誌結束偏移量(LogEndOffset)和日誌起始偏移量(LogStartOffset)用於監控分割槽的偏移量範圍,可以間接推斷分割槽內的訊息數量(需考慮日誌壓縮的影響)。
JVM 監控
除了 Kafka 自身的指標外,監控 JVM 的執行狀態對於確保 Kafka 叢集的穩定性至關重要。重點監控的 JVM 指標包括垃圾回收(GC)的相關資訊。
G1 垃圾回收指標
對於使用 Oracle Java 1.8 和 G1 垃圾回收器的環境,需要監控以下指標:
- 完全 GC 週期次數:
java.lang:type=GarbageCollector,name=G1 Old GenerationCollectionCount:JVM 啟動以來完全 GC 的次數。CollectionTime:JVM 啟動以來完全 GC 總耗時(毫秒)。
// 檢視 G1 GC 指標範例程式碼
public class G1GcMonitor {
public static void main(String[] args) throws Exception {
// 建立 JMX 連線
JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"));
MBeanServerConnection mbeanServer = connector.getMBeanServerConnection();
// 取得 G1 Old Generation GC 的 CollectionCount 和 CollectionTime
ObjectName g1OldGenName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation");
long collectionCount = (long) mbeanServer.getAttribute(g1OldGenName, "CollectionCount");
long collectionTime = (long) mbeanServer.getAttribute(g1OldGenName, "CollectionTime");
System.out.println("G1 Old Gen GC Count: " + collectionCount);
System.out.println("G1 Old Gen GC Time: " + collectionTime + " ms");
}
}
內容解密:
CollectionCount和CollectionTime是累積值,可以用來計算單位時間內的 GC 次數和耗時。LastGcInfo提供了最近一次 GC 的詳細資訊,其中duration表示最近一次 GC 的耗時(毫秒)。- JVM 的 GC 狀態直接影響 Kafka 的效能,因此需要密切監控 GC 指標,以便及時發現和處理潛在問題。
Kafka 監控與效能最佳化
Kafka 作為一個分散式串流處理平台,其監控與效能最佳化至關重要。本篇文章將探討 Kafka 的監控指標、效能最佳化策略以及相關的最佳實踐。
JVM 監控
Kafka 是根據 JVM 執行,因此 JVM 的監控對於 Kafka 的穩定執行至關重要。其中,OpenFileDescriptorCount 屬性告訴我們目前開啟的檔案描述符數量。每個日誌段和網路連線都會佔用檔案描述符,如果網路連線沒有正確關閉,可能會導致代理伺服器迅速耗盡允許的檔案描述符數量。
OS 監控
除了 JVM 監控之外,我們還需要監控作業系統的相關指標。主要的監控指標包括:
CPU 使用率
- 系統負載平均值(system load average)
- CPU 使用率百分比(按型別劃分):
- us(使用者空間時間)
- sy(核心空間時間)
- ni(低優先順序程式時間)
- id(閒置時間)
- wa(等待磁碟時間)
- hi(處理硬體中斷時間)
- si(處理軟體中斷時間)
- st(等待虛擬化管理程式時間)
系統負載
系統負載是指正在執行或等待執行的程式數量。Linux 也會將處於不可中斷睡眠狀態的執行緒(如等待磁碟)計入系統負載。單 CPU 系統中,負載值為 1 表示系統已滿載。多 CPU 系統中,滿載的負載值等於 CPU 數量。
記憶體與磁碟監控
- 記憶體使用率:Kafka 通常執行在相對較小的 JVM 堆積大小下,大部分系統記憶體將用於快取。
- 磁碟使用率:Kafka 的效能嚴重依賴磁碟效能,因此需要監控磁碟空間和 inode 使用率。
- 磁碟 I/O 統計:監控讀寫速度、平均佇列大小、平均等待時間和磁碟利用率百分比。
網路監控
- 網路利用率:監控輸入和輸出的網路流量,通常以每秒位元數報告。
- 注意:由於 Kafka 的複製因子和消費者數量,輸出網路流量可能會遠大於輸入流量。
日誌管理
適當的日誌管理對於取得有用的資訊至關重要。Kafka 代理伺服器預設會將大量日誌訊息寫入磁碟。建議啟用適當的日誌記錄器並設定正確的日誌級別。
建議分離的日誌記錄器
kafka.controller:記錄叢集控制器的相關資訊。kafka.server.ClientQuotaManager:記錄與生產和消費配額活動相關的訊息。kafka.log.LogCleaner、kafka.log.Cleaner和kafka.log.LogCleanerManager:在 DEBUG 級別下記錄日誌壓縮執行緒的狀態。
此圖示展示了 Kafka 監控的主要方面及其相互關係。
詳細解析
JVM 監控的重要性
Kafka 是根據 Java 虛擬機器(JVM)執行的,因此 JVM 的效能直接影響 Kafka 的執行狀態。監控 JVM 的關鍵指標,如堆積記憶體使用率、垃圾收集頻率和執行緒狀態,可以幫助我們及時發現並解決潛在的效能問題。
OpenFileDescriptorCount 的作用
OpenFileDescriptorCount 屬性告訴我們目前開啟的檔案描述符數量。每個日誌段和網路連線都會佔用檔案描述符。如果網路連線沒有正確關閉,可能會導致代理伺服器迅速耗盡允許的檔案描述符數量,從而影響 Kafka 的正常執行。
OS 監控的關鍵指標
除了 JVM 監控之外,作業系統的相關指標也至關重要。主要的監控指標包括 CPU 使用率、系統負載、記憶體使用率和磁碟 I/O 統計等。
CPU 使用率的詳細解析
CPU 使用率是衡量系統效能的重要指標。透過監控 CPU 使用率,我們可以瞭解系統的負載情況,並及時發現潛在的效能瓶頸。
CPU 使用率百分比的劃分
- us(使用者空間時間):CPU 在使用者空間執行程式所花費的時間。
- sy(核心空間時間):CPU 在核心空間執行程式所花費的時間。
- ni(低優先順序程式時間):CPU 處理低優先順序程式所花費的時間。
- id(閒置時間):CPU 處於閒置狀態的時間。
- wa(等待磁碟時間):CPU 等待磁碟 I/O 操作完成所花費的時間。
- hi(處理硬體中斷時間):CPU 處理硬體中斷所花費的時間。
- si(處理軟體中斷時間):CPU 處理軟體中斷所花費的時間。
- st(等待虛擬化管理程式時間):在虛擬化環境中,CPU 等待虛擬化管理程式所花費的時間。
系統負載的深入理解
系統負載是指正在執行或等待執行的程式數量。Linux 也會將處於不可中斷睡眠狀態的執行緒(如等待磁碟)計入系統負載。單 CPU 系統中,負載值為 1 表示系統已滿載。多 CPU 系統中,滿載的負載值等於 CPU 數量。
記憶體與磁碟監控的重要性
Kafka 的效能嚴重依賴磁碟效能,因此需要監控磁碟空間和 inode 使用率。同時,記憶體使用率也是重要的監控指標。
磁碟 I/O 統計的詳細解析
- 讀寫速度:監控磁碟的讀寫速度,可以瞭解磁碟的負載情況。
- 平均佇列大小:監控磁碟的平均佇列大小,可以瞭解磁碟的繁忙程度。
- 平均等待時間:監控磁碟操作的平均等待時間,可以瞭解磁碟的回應速度。
- 磁碟利用率百分比:監控磁碟的利用率,可以瞭解磁碟的使用情況。
網路監控的重要性
Kafka 的複製因子和消費者數量會對網路流量產生重大影響,因此需要監控網路利用率。
網路利用率的詳細解析
- 輸入和輸出的網路流量:監控輸入和輸出的網路流量,可以瞭解網路的負載情況。
- 複製因子和消費者數量的影響:由於 Kafka 的複製因子和消費者數量,輸出網路流量可能會遠大於輸入流量。
日誌管理的重要性
適當的日誌管理對於取得有用的資訊至關重要。Kafka 代理伺服器預設會將大量日誌訊息寫入磁碟。建議啟用適當的日誌記錄器並設定正確的日誌級別。
日誌記錄器的詳細解析
kafka.controller:記錄叢集控制器的相關資訊。kafka.server.ClientQuotaManager:記錄與生產和消費配額活動相關的訊息。kafka.log.LogCleaner、kafka.log.Cleaner和kafka.log.LogCleanerManager:在 DEBUG 級別下記錄日誌壓縮執行緒的狀態。
Kafka 生產者監控與調優
Kafka 生產者客戶端提供了多項指標,用於監控和調優生產者的效能和可靠性。這些指標可以分為整體生產者指標、每個代理指標和每個主題指標。
整體生產者指標
整體生產者指標提供了關於生產者整體狀態的資訊,包括訊息批次大小、記憶體緩衝區利用率等。其中一些重要的指標包括:
record-error-rate:訊息錯誤率,表示生產者丟棄訊息的頻率。該指標應始終為零,如果大於零,表示生產者正在丟棄訊息。request-latency-avg:請求延遲平均值,表示生產者向代理傳送請求的平均延遲時間。該指標可用於建立基準值,並在延遲時間超過基準值時發出警示。
訊息流量指標
outgoing-byte-rate:輸出位元組率,表示生產者每秒輸出的位元組數。record-send-rate:訊息傳送率,表示生產者每秒傳送的訊息數。request-rate:請求率,表示生產者每秒向代理傳送的請求數。
批次和請求大小指標
request-size-avg:請求大小平均值,表示生產者向代理傳送的請求的平均大小(以位元組為單位)。batch-size-avg:批次大小平均值,表示生產者的訊息批次的平均大小(以位元組為單位)。record-size-avg:訊息大小平均值,表示生產者的訊息的平均大小(以位元組為單位)。
佇列時間指標
record-queue-time-avg:訊息佇列時間平均值,表示訊息在生產者中等待的時間(以毫秒為單位)。該指標可用於評估生產者的效能和調優。
程式碼範例
// 建立 Kafka 生產者
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
// 設定 JMX 監控
props.put("metrics.sample.window.ms", "30000"); // 30 秒
props.put("metrics.num.samples", "2");
producer.initTransactions();
內容解密:
- 建立 Kafka 生產者:使用
Properties物件設定 Kafka 生產者的屬性,包括bootstrap.servers、key.serializer和value.serializer。 - 設定 JMX 監控:使用
metrics.sample.window.ms和metrics.num.samples屬性設定 JMX 監控的視窗大小和樣本數量。 initTransactions()方法:初始化交易,用於支援 Kafka 的交易功能。