## 架構解決問題 ### 背景 - Kafka 作為分散式訊息系統,需要在多節點環境中維持高可用性(HA)與元數據一致性(Metadata Consistency)。 - 隨著 KRaft 模式引入,系統從 ZooKeeper 過渡到內建 Raft 共識機制,進一步提升一致性與簡化部署。 ### 問題 - Metadata 更新衝突:多個 Broker 更新 metadata 易造成資料不一致。 - 單點故障風險:如果 metadata 管理集中在單一節點,會有故障風險。 - 動態變更難題:需要在不中斷服務情況下動態修改 ACL、Config 等。 - 強一致性需求:關鍵 metadata(如 topic/broker 狀態)必須在整個系統中保持同步。 ### 整體設計解法 - 將系統明確分成 Broker 與 Controller 角色。 - 由 Broker 將重要操作透過 Forwarding 轉送給 Controller 處理。 - Controller 透過 KafkaRaftServer (RaftClient) 進行 Raft 共識,確保元數據一致。 - 引入 Publishers 機制,支援動態設定更新。 ### 各個 Component 的角色與解決的問題 #### Client 端 - **Producer / Consumer / Admin / Kafka Streams / Connect** - 解決問題:提供各種應用層級的操作介面,如寫入、讀取、管理等。 - 目的:讓外部服務或用戶與 Kafka 互動。 #### Broker 端 - **SocketServer** - 解決問題:接收 Client 的請求,處理 TCP 連線。 - **KafkaApis** - 解決問題:統一解析與分派請求,例如 Produce、Fetch、Metadata 查詢等。 - **GroupCoordinator** - 解決問題:管理 Consumer Group,確保 group rebalancing 正確運作。 - **TransactionCoordinator** - 解決問題:支援跨 partition 的兩階段提交(2PC),實現精確一次(Exactly-Once)處理。 - **ReplicaManager** - 解決問題:管理 partition 副本同步,確保資料可靠性與副本一致性。 - **MetadataCache (Broker)** - 解決問題:本地快取 Controller 更新後的 Metadata,減少查詢延遲。 - **AutoTopicCreationManager** - 解決問題:當 Consumer/Producer 請求不存在的 topic 時,自動創建 topic。 - **ForwardingManager** - 解決問題:將需要修改 metadata 的操作,轉送到 Controller,避免直接修改產生衝突。 - **RaftClient** - 解決問題:與其他節點共同參與 Raft 共識,維護 metadata log 的一致性。 - **BrokerLifecycleManager** - 解決問題:維護 broker 的生命週期(啟動、關閉、heartbeat 狀態同步到 Controller)。 #### Controller 端 - **SocketServer (Controller)** - 解決問題:接受來自 Broker 的 forwarding 請求。 - **ControllerApis** - 解決問題:解析 Broker 發來的 Controller 專屬請求,如 Metadata 更新、ACL 變更等。 - **QuorumController** - 解決問題:主導 Metadata Mutation(變更元數據),確保更新經過 Raft 共識並持久化。 - **MetadataCache (Controller)** - 解決問題:本地緩存最新的元數據,提供快速回應。 - **CredentialProvider** - 解決問題:管理並存取安全認證資訊(如 SCRAM 憑證、ACL 規則等)。 - **Publishers** - **DynamicConfigPublisher** - 解決問題:支援動態更新 Broker/Topic/Client 層級的設定。 - **ScramPublisher** - 解決問題:支援 SCRAM 資料的即時變更與同步。 - **AclPublisher** - 解決問題:支援 ACL(Access Control List)即時變更,強化安全性。 ### 成效 - 高可用性(HA):故障時自動重新選舉 Controller,持續服務不中斷。 - 強一致性:透過 Raft 保證 metadata 同步。 - 動態配置能力:支援動態變更設定與存取控制,無需重啟服務。 - 系統簡化:移除 ZooKeeper 依賴,降低運維負擔。 ## 程式碼位置 Client Producer (把資料送到 Kafka Topic)、Consumer (從 Kafka Topic 讀取資料)、Admin (管理 Kafka Cluster 例如建立 Topic、管理 ACL) https://github.com/apache/kafka/tree/trunk/clients/src/main/java/org/apache/kafka/clients Streams (在 Kafka 上做資料流轉換與處理) https://github.com/apache/kafka/tree/trunk/streams/src/main/java/org/apache/kafka/streams Connect (連接外部系統:資料同步到 Kafka 或從 Kafka 匯出) https://github.com/apache/kafka/tree/trunk/connect Server SocketServer https://github.com/apache/kafka/core/src/main/scala/kafka/network/SocketServer.scala KafkaApis https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/KafkaApis.scala GroupCoordinator https://github.com/apache/kafka/tree/trunk/core/src/main/scala/kafka/coordinator/group TransactionCoordinator https://github.com/apache/kafka/tree/trunk/core/src/main/scala/kafka/coordinator/transaction https://github.com/apache/kafka/tree/trunk/transaction-coordinator/src ReplicaManager https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/ReplicaManager.scala LogManager https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/log/LogManager.scala Topics/Partitions MetadataCache https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/metadata/KRaftMetadataCache.scala AutoTopicCreationManager https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/AutoTopicCreationManager.scala QuorumController https://github.com/apache/kafka/blob/trunk/metadata/src/main/java/org/apache/kafka/controller/QuorumController.java KafkaRaftServer https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/KafkaRaftServer.scala RaftClient https://github.com/apache/kafka/blob/trunk/raft/src/main/java/org/apache/kafka/raft/RaftClient.java BrokerLifecycleManager https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/server/BrokerLifecycleManager.scala __cluster_metadata Topic 沒有單獨的 code,屬於 Kafka 內建處理(由 QuorumController 和 LogManager 共同維護)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up