Apache Kafka Controller 是 Kafka 集群的核心協調組件,主要承擔兩大核心職責:
一、核心作用
- 分區領導者選舉 1
// 分區領導者選舉邏輯示例(偽代碼)
def electLeader(partition: Partition): Unit = {val isr = partition.inSyncReplicasval newLeader = isr.minBy(_.brokerId) // 實際使用更復雜算法partition.leader = newLeader
}
- 副本狀態管理
- 維護所有分區的 ISR(In-Sync Replicas)列表
- 監控副本同步狀態(通過 replica.lag.time.max.ms 參數)
- 集群元數據維護
- 處理 Broker 上下線事件
- 觸發分區重分配(如使用 kafka-reassign-partitions 時)
二、故障恢復機制
- Controller 選舉流程 2
# ZooKeeper 臨時節點路徑
ls /controller # 查看當前 Controller ID# 選舉過程偽代碼
1. 監控 /controller 節點消失
2. 各 Broker 嘗試創建臨時節點
3. 最先創建成功的成為新 Controller
- 故障恢復步驟:
- 元數據重建:從 ZooKeeper 加載 topics/brokers 數據
- 狀態機重置:重建分區狀態機(PartitionStateMachine)和副本狀態機(ReplicaStateMachine)
- 補償操作:處理故障期間未完成的管控請求
補充說明:
- 從 Kafka 2.8 版本開始支持 KRaft 模式(不依賴 ZooKeeper),故障恢復機制改為基于 Raft 共識算法 3
- Controller 故障期間,已有生產消費不受影響,但無法執行管理操作(如創建 topic)