Kafka 簡介
Kafka 是一個分布式流處理平臺,由 LinkedIn 開發并開源,主要用于高吞吐量的實時數據管道和流處理。
核心特性
- 高吞吐量:支持每秒百萬級消息處理,適合大數據場景。
- 持久化存儲:消息可持久化到磁盤,并支持多副本備份。
- 分布式架構:支持水平擴展,通過分區(Partition)實現并行處理。
- 多客戶端支持:提供 Producer、Consumer 和 Stream API,支持多種語言。
核心概念
- Topic:消息的分類單位,邏輯上的數據流。
- Partition:Topic 的物理分片,每個 Partition 是有序的消息隊列。
- Broker:Kafka 集群中的單個節點,負責存儲和轉發消息。
- Producer:向 Topic 發布消息的客戶端。
- Consumer:從 Topic 訂閱消息的客戶端,支持消費者組(Consumer Group)實現負載均衡。
典型應用場景
- 實時日志收集與分析(如 ELK 棧)。
- 事件溯源(Event Sourcing)和消息隊列。
- 流處理(如與 Flink、Spark Streaming 集成)。
ZooKeeper 簡介
ZooKeeper 是一個分布式協調服務,由 Apache 開發,用于解決分布式系統中的一致性和管理問題。
核心特性
- 高可用性:基于多節點集群,避免單點故障。
- 強一致性:通過 ZAB 協議(ZooKeeper Atomic Broadcast)保證數據一致性。
- 輕量級:提供簡單的 API 和基于內存的數據模型。
- 觀察機制:支持 Watcher 機制,實時監聽節點變化。
核心概念
- ZNode:ZooKeeper 中的數據單元,類似文件系統的節點,可存儲少量數據。
- Session:客戶端與 ZooKeeper 服務器的連接會話,通過心跳保持活性。
- Watcher:監聽 ZNode 的變化(如創建、刪除、數據更新)。
典型應用場景
- 分布式鎖(如實現互斥訪問)。
- 配置管理(集中式存儲配置信息)。
- 服務注冊與發現(如 Dubbo、Kafka 依賴 ZooKeeper)。
Kafka 與 ZooKeeper 的關系
- 早期版本:Kafka 依賴 ZooKeeper 存儲元數據(如 Topic 配置、Broker 列表、消費者偏移量)。
- Kafka 2.8+:逐步引入 KRaft 模式(基于 Raft 協議),替代 ZooKeeper 實現自管理元數據。
- 關鍵作用:ZooKeeper 幫助 Kafka 實現 Broker 選舉、分區 Leader 選舉和集群狀態同步。
區別對比
維度 | Kafka | ZooKeeper |
---|---|---|
核心功能 | 高吞吐量消息隊列和流處理 | 分布式協調與一致性服務 |
數據模型 | 基于 Topic 和 Partition 的消息流 | 基于 ZNode 的樹形結構 |
一致性協議 | 依賴 ZooKeeper 或 KRaft 協議 | 基于 ZAB 協議 |
典型依賴 | 早期依賴 ZooKeeper | 獨立運行,被其他系統依賴 |
安裝 ZooKeeper 和 kafka
// ZooKeeper
docker pull bitnami/zookeeper:latest// kafka
docker pull bitnami/kafka:latest
創建目錄結構
// 創建目錄
sudo mkdir -p /root/kafka-zookeeper-cluster/{zookeeper1,zookeeper2,zookeeper3}/{data,datalog,conf} /root/kafka-zookeeper-cluster/{kafka1,kafka2,kafka3}// 修改目錄所有權為 UID 1001(Bitnami 默認用戶)
sudo chown -R 1001:1001 /root/kafka-zookeeper-cluster// 確保目錄可讀寫
sudo chmod -R 755 /root/kafka-zookeeper-cluster
為每個 ZooKeeper 節點生成 JAAS 文件
// 創建 ZooKeeper JAAS 配置文件
cat <<EOF > /root/kafka-zookeeper-cluster/zookeeper1/conf/jaas.conf
Server {org.apache.zookeeper.server.auth.DigestLoginModule requireduser_root="123456";
};
Client {org.apache.zookeeper.server.auth.DigestLoginModule requiredusername="root"password="123456";
};
EOF// 復制到其他 ZooKeeper 節點
cp -r /ro