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 required
user_root="123456";
};
Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="root"
password="123456";
};
EOF
// 复制到其他 ZooKeeper 节点
cp -r /ro