Kafka 的核心價值是 「解耦」 —— 對來源數據與下游消費端的時間、空間解耦。這帶來兩種典型的使用場景:
一源多用
高併發流量
若你的需求只涉及單一來源與單一目的地,甚至對「順序性」與「持久化」沒有強烈要求,那麼 ETL 工具、Flink 實時串流、或 RabbitMQ、Redis Stream 都是更輕量的替代方案。
而在決定採用 Kafka 之後,接下來的挑戰就是「如何讓它穩定存在於基礎設施中」。
現今最常見、也最方便的方式,是直接在 Kubernetes 叢集上部署 Kafka,而這裡有兩個常見方案:
Strimzi Operator
Bitnami Kafka Chart
簡單來說,Strimzi 強調全面自動化與一致性,Bitnami 則追求快速啟動與輕量靈活。
選擇哪一個方案,取決於團隊的規模、基礎設施成熟度,以及對維運效率的需求。
--
而無論選擇哪種部署方式,真正的挑戰往往不在「如何部屬」,而在於長期維運:如何追蹤 offset、如何監控消費延遲、如何確保 broker 在災難時能快速恢復。
接下來,我們就來談談 Kafka 在維運面向上的幾個關鍵考量。
Kafka 雖然是分散式系統,但真正決定效能的,往往不是 Kafka 本身的程式碼,而是基礎資源的規劃。這一層看似直觀,卻是最常被忽略的,也是 SRE 或 Infra 團隊最需要優先關注的基石。
資源配置
Kafka 高度依賴 磁碟 I/O,效能瓶頸常常出現在儲存層,而不是 CPU 或記憶體。
在雲端環境中,實際效能取決於 VM 晶片類型(e.g. N2, C2, M 系列) 搭配的 儲存方案。同樣是 SSD,不同規格在 IOPS、吞吐量與延遲差異極大。
最佳實務:
網路規劃
Kafka 的本質是事件流,因此網路延遲與頻寬會直接影響 consumer lag 與 replication 效率。
跨區部署的隱憂:
雲端環境的注意事項:
最佳實務:
當基礎設施穩定後,維運的焦點會轉向 Kafka Broker 的狀態管理。
Broker 基於磁碟持久化,「儲存層」幾乎就是 Kafka 的生命線。無論是單一 broker 宕機、資料遺失,還是 Pod 重新排程,背後都依賴正確的儲存策略與狀態維護。
Kafka
CR(Custom Resource)定義,例如:storage:
type: persistent-claim
size: 100Gi
class: premium-ssd
最佳實務:
最佳實務:
好的,我幫你把 災難演練 + 多叢集(跨區 Geo-redundancy) 的內容整合到前面 Broker 與儲存章節的最後部分,並將重點明確放在 如何保持 Broker 狀態、如何利用狀態確保資料完整性與服務可用性。以下是優化後版本:
Kafka 的可靠性不僅取決於副本數量或 Operator 的自動化能力,更關鍵的是Broker 狀態的維護與復原策略。狀態包括 broker 本地 log、ISR、offset 與 replication 狀態,這些是保證資料完整性與服務持續性的核心。
模擬單個 broker 當機或 Pod 被重新排程。
核心檢查點:
最佳實務:
跨區多叢集部署是為了異地容錯,確保單一區域或整個 Region 失效時,仍能保持 Kafka 的狀態與資料完整性。
Region A Region B
┌─────────────┐ ┌─────────────┐
│ Kafka Cluster│ │ Kafka Cluster│
│ Broker 1 │ │ Broker 1 │
│ Broker 2 │ │ Broker 2 │
│ Broker 3 │ │ Broker 3 │
└─────────────┘ └─────────────┘
│ │
└── MirrorMaker 2.0 ───┘
運作與演練策略
跨區同步狀態
A/B 災難切換
當 Region A 全面不可用時,消費端切換到 Region B。
核心檢查點:
Runbook 建立
最佳實務:
在 Kafka 的維運中,除了關注 broker 的健康狀態,生產端(Producer)與消費端(Consumer)的管理同樣重要。核心挑戰通常不是訊息能否進入系統,而是如何精準追蹤與控制消費進度。以下提供實務做法與範例。
在日常維運中,我們經常需要對 offset 進行操作,例如:
以下是實務範例:
# 查看 consumer group 狀態
kafka-consumer-groups.sh --bootstrap-server <BROKER>:9092 \
--describe --group <CONSUMER_GROUP>
上述指令可查看每個 partition 的 offset 與 lag,方便判斷是否需要調整。
接著,如果想從最早的訊息重新消費:
# 從 earliest 開始重置 offset
kafka-consumer-groups.sh --bootstrap-server <BROKER>:9092 \
--group <CONSUMER_GROUP> --reset-offsets \
--to-earliest --execute --topic <TOPIC>
或者,想依特定時間戳重新消費:
# 指定 timestamp 位置開始消費
kafka-consumer-groups.sh --bootstrap-server <BROKER>:9092 \
--group <CONSUMER_GROUP> --reset-offsets \
--to-datetime 2025-10-02T00:00:00 \
--execute --topic <TOPIC>
⚠️ 注意:執行
--execute
前建議先用--dry-run
模擬,確認操作結果,避免意外跳過重要訊息。
Offset 操作只是手段,更重要的是持續監控消費進度。這裡建議從 Partition 級別著手:
Lag 定義:Producer 已寫入但 Consumer 尚未消費的訊息數量。
常用指標:
consumer_lag
:分區 lag 數量consumer_lag_seconds
:Lag 對應時間監控工具範例:
使用 Prometheus Kafka Exporter:
kafka_consumergroup_lag{consumergroup="order-service", topic="orders", partition="0"}
配合 Grafana Dashboard 可視化各 topic 與 partition 的 lag 變化。
透過監控 lag,我們能快速判斷異常:
- Lag 持續上升 → 消費端可能卡住或無法處理資料。
- Lag 突然降為 0 → Consumer 可能重置 offset 或跳過訊息,需要檢查。
單看 Consumer Lag 有時不足以判斷問題源頭,我們還需要結合 Producer 速率 進行雙端監控:
Producer 速率:確保上游訊息產生速度與消費能力匹配。
BytesInPerSec
/ MessagesInPerSec
kafka_server_brokertopicmetrics_messagesin_total
結合 Consumer Lag 分析:
建議實作方式:
建立 Grafana Dashboard:
- Producer throughput(topic 級別)
- Consumer Lag(Partition 級別)
設定告警規則:
- Lag > N 且持續 T 分鐘 → 發送告警
透過這種雙端追蹤,維運團隊可以快速定位問題源頭,是上游流量過大還是下游消費能力不足,並採取相應措施。
今天我們介紹了 Kafka 的使用與維運經驗,整理如下:
Kafka 適用場景
部署方案選擇
資源與網路規劃
Broker 與儲存維運
災難演練與跨區多叢集
Offset 操作與消費監控
以上內容是我在 Kafka 維運上的經驗分享,供讀者參考。
其實 Kafka 的服務細節很多,可設定的參數也不少,但它的核心概念很簡單——提供一個訊息主題,讓多個服務能共享與消費資料。
今天的分享希望能對讀者在理解與使用 Kafka 上提供一些幫助,也讓大家對維運 Kafka 的思路有初步概念。
感謝各位的閱讀,我們明天見!