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 /root/kafka-zookeeper-cluster/zookeeper1/conf /root/kafka-zookeeper-cluster/zookeeper2
cp -r /root/kafka-zookeeper-cluster/zookeeper1/conf /root/kafka-zookeeper-cluster/zookeeper3
Zookeeper集群部署(3个)
1. 启动Zookeeper节点1
命令功能解析
该命令通过
启动一个基于
docker run
镜像的容器,运行一个启用了认证的 ZooKeeper 节点(
bitnami/zookeeper
),并配置为集群模式(与
zoo1
、
zoo2
组成集群)。以下是各参数的详细说明:
zoo3
核心参数说明
-d
以后台(守护进程)模式运行容器。
--name zoo1
将容器命名为
,便于后续管理。
zoo1
--network wdzm_network
指定容器使用名为
的自定义 Docker 网络,用于容器间通信。
wdzm_network
挂载卷配置
-v
将宿主机目录映射到容器内,确保数据持久化:
→ ZooKeeper 数据目录
/root/kafka-zookeeper-cluster/zookeeper1/data
→ 事务日志目录
/root/kafka-zookeeper-cluster/zookeeper1/datalog
→ 自定义配置文件目录
/root/kafka-zookeeper-cluster/zookeeper1/conf
环境变量配置
-e
:当前节点的 ID,必须与
ZOO_MY_ID=1
中的
ZOO_SERVERS
对应。
server.1
:定义集群节点列表,格式为
ZOO_SERVERS
。
server.<id>=<host>:<follower_port>:<election_port>
:启用 ZooKeeper 的 SASL/Digest-MD5 认证。
ZOO_ENABLE_AUTH=yes
和
ZOO_SERVER_USERS
:设置服务端通信的用户名和密码。
ZOO_SERVER_PASSWORDS
和
ZOO_CLIENT_USER
:设置客户端连接的用户名和密码。
ZOO_CLIENT_PASSWORD
:传递额外的 JVM 参数,例如指定 JAAS 配置文件路径(需提前在挂载的
ZOO_CFG_EXTRA_ARGS
目录中配置)。
conf
-p 2181:2181
将容器的 ZooKeeper 客户端端口(默认 2181)映射到宿主机的 2181 端口。
bitnami/zookeeper:latest
使用的镜像名称及标签(最新版)。
关键注意事项
集群配置:
需确保
中所有节点的主机名(如
ZOO_SERVERS
、
zoo1
)能通过 Docker 网络解析。每个节点的
zoo2
必须唯一,且与
ZOO_MY_ID
的
server.x
一致。
x
认证配置:
需在挂载的
目录中提供
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";
};
数据目录权限:
确保宿主机挂载目录(如
)对容器用户可写(Bitnami 镜像默认用户为
/root/kafka-zookeeper-cluster/zookeeper1/data
)。
1001
典型问题排查
节点无法加入集群:检查
配置的端口和主机名是否可达,防火墙是否放行
ZOO_SERVERS
( follower 通信)和
2888
(选举)端口。认证失败:确认
3888
文件路径正确,且用户名/密码与环境变量一致。数据持久化失效:检查挂载目录权限及路径是否正确。
jaas.conf
docker run -d
--name zoo1
--network wdzm_network
-v /root/kafka-zookeeper-cluster/zookeeper1/data:/bitnami/zookeeper/data
-v /root/kafka-zookeeper-cluster/zookeeper1/datalog:/bitnami/zookeeper/datalog
-v /root/kafka-zookeeper-cluster/zookeeper1/conf:/bitnami/zookeeper/conf
-e ZOO_MY_ID=1
-e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888"
-e ZOO_ENABLE_AUTH=yes
-e ZOO_SERVER_USERS="root"
-e ZOO_SERVER_PASSWORDS="123456"
-e ZOO_CLIENT_USER="root"
-e ZOO_CLIENT_PASSWORD="123456"
-e ZOO_CFG_EXTRA_ARGS="-Djava.security.auth.login.config=/bitnami/zookeeper/conf/jaas.conf"
-p 2181:2181
bitnami/zookeeper:latest
2. 启动Zookeeper节点2
docker run -d
--name zoo2
--network wdzm_network
-v /root/kafka-zookeeper-cluster/zookeeper2/data:/bitnami/zookeeper/data
-v /root/kafka-zookeeper-cluster/zookeeper2/datalog:/bitnami/zookeeper/datalog
-v /root/kafka-zookeeper-cluster/zookeeper2/conf:/bitnami/zookeeper/conf
-e ZOO_MY_ID=2
-e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888"
-e ZOO_ENABLE_AUTH=yes
-e ZOO_SERVER_USERS="root"
-e ZOO_SERVER_PASSWORDS="123456"
-e ZOO_CLIENT_USER="root"
-e ZOO_CLIENT_PASSWORD="123456"
-e ZOO_CFG_EXTRA_ARGS="-Djava.security.auth.login.config=/bitnami/zookeeper/conf/jaas.conf"
-p 2182:2181
bitnami/zookeeper:latest
3. 启动Zookeeper节点3
docker run -d
--name zoo3
--network wdzm_network
-v /root/kafka-zookeeper-cluster/zookeeper3/data:/bitnami/zookeeper/data
-v /root/kafka-zookeeper-cluster/zookeeper3/datalog:/bitnami/zookeeper/datalog
-v /root/kafka-zookeeper-cluster/zookeeper3/conf:/bitnami/zookeeper/conf
-e ZOO_MY_ID=3
-e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888"
-e ZOO_ENABLE_AUTH=yes
-e ZOO_SERVER_USERS="root"
-e ZOO_SERVER_PASSWORDS="123456"
-e ZOO_CLIENT_USER="root"
-e ZOO_CLIENT_PASSWORD="123456"
-e ZOO_CFG_EXTRA_ARGS="-Djava.security.auth.login.config=/bitnami/zookeeper/conf/jaas.conf"
-p 2183:2181
bitnami/zookeeper:latest
Kafka集群部署(3节点)
创建 Kafka 的 JAAS 文件
// 创建 Kafka JAAS 配置文件
mkdir -p /root/kafka-zookeeper-cluster/kafka1/conf
cat <<EOF > /root/kafka-zookeeper-cluster/kafka1/conf/jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="root"
password="123456"
user_root="123456";
};
EOF
// 复制到 kafka2 kafka3
cp -r /root/kafka-zookeeper-cluster/kafka1/conf /root/kafka-zookeeper-cluster/kafka2/conf
cp -r /root/kafka-zookeeper-cluster/kafka1/conf /root/kafka-zookeeper-cluster/kafka3/conf
1. 启动Kafka节点1
后台启动容器
使用
参数以 detached 模式运行容器,使容器在后台运行,不占用当前终端。
-d
命名容器
通过
指定容器名称为
--name kafka1
,便于后续通过名称管理容器(如启动、停止或查看日志)。
kafka1
连接自定义网络
通过
将容器连接到预先创建的 Docker 网络
--network wdzm_network
,确保 Kafka 能够与同一网络中的其他服务(如 ZooKeeper 集群
wdzm_network
、
zoo1
、
zoo2
)通信。需提前创建该网络:
zoo3
docker network create wdzm_network
数据持久化
通过
挂载卷将容器内的
-v
(Kafka 数据存储目录)映射到宿主机目录,确保数据在容器重启后不丢失。例如:
/bitnami/kafka/data
-v /host/path/kafka1-data:/bitnami/kafka/data
将
替换为宿主机实际路径。
/host/path/kafka1-data
完整命令示例
命令功能概述
该命令用于在后台启动一个名为
的Kafka容器实例,连接到自定义网络
kafka1
,配置数据卷、环境变量及端口映射,实现与ZooKeeper集群的集成。
wdzm_network
参数解析
基础运行参数
:以守护进程(后台)模式运行容器
-d
:指定容器名称为
--name kafka1
kafka1
:将容器接入预先创建的
--network wdzm_network
网络
wdzm_network
数据卷配置
:挂载宿主机目录作为Kafka数据存储
-v /root/.../kafka1/data:/bitnami/kafka/data
:挂载宿主机目录作为Kafka配置文件目录
-v /root/.../kafka1/conf:/bitnami/kafka/conf
核心环境变量
:设置当前Kafka节点的唯一ID
KAFKA_BROKER_ID=1
:指定ZooKeeper集群地址
KAFKA_CFG_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181"
:声明对外暴露的服务地址
KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://192.168.0.64:9091"
:配置监听所有IP的9091端口
KAFKA_CFG_LISTENERS="PLAINTEXT://0.0.0.0:9091"
安全相关配置
:ZooKeeper认证凭据
KAFKA_CFG_ZOOKEEPER_USER/PASSWORD
:允许未加密的PLAINTEXT协议
ALLOW_PLAINTEXT_LISTENER=yes
网络端口映射
:将宿主机9091端口映射到容器9091端口
-p 9091:9091
关键配置说明
监听器配置逻辑
表示容器内监听所有网络接口
PLAINTEXT://0.0.0.0:9091
需设置为客户端实际连接的地址(此处为宿主机IP)
ADVERTISED_LISTENERS
指定Broker间通信使用的监听器名称
INTER_BROKER_LISTENER_NAME
ZooKeeper集成
使用
主机名需确保这些ZooKeeper容器在同一网络2181为ZooKeeper默认客户端连接端口
zoo1/zoo2/zoo3
典型应用场景
基于Docker搭建多节点Kafka集群需要与现有ZooKeeper集群集成的测试环境需要持久化Kafka数据的开发环境
注意事项
宿主机目录
需提前创建若ZooKeeper启用ACL,需同步配置
/root/kafka-zookeeper-cluster/
环境变量生产环境建议使用SSL加密替代PLAINTEXT协议
KAFKA_OPTS
docker run -d
--name kafka1
--network wdzm_network
-v /root/kafka-zookeeper-cluster/kafka1/data:/bitnami/kafka/data
-e KAFKA_BROKER_ID=1
-e KAFKA_CFG_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181"
-e KAFKA_CFG_ZOOKEEPER_USER="root"
-e KAFKA_CFG_ZOOKEEPER_PASSWORD="123456"
-e KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://192.168.0.64:9091"
-e KAFKA_CFG_LISTENERS="PLAINTEXT://0.0.0.0:9091"
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP="PLAINTEXT:PLAINTEXT"
-e KAFKA_CFG_INTER_BROKER_LISTENER_NAME="PLAINTEXT"
-e ALLOW_PLAINTEXT_LISTENER=yes
-p 9091:9091
bitnami/kafka:latest
2. 启动Kafka节点2
docker run -d
--name kafka2
--network wdzm_network
-v /root/kafka-zookeeper-cluster/kafka2/data:/bitnami/kafka/data
-e KAFKA_BROKER_ID=2
-e KAFKA_CFG_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181"
-e KAFKA_CFG_ZOOKEEPER_USER="root"
-e KAFKA_CFG_ZOOKEEPER_PASSWORD="123456"
-e KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://192.168.0.64:9092"
-e KAFKA_CFG_LISTENERS="PLAINTEXT://0.0.0.0:9092"
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP="PLAINTEXT:PLAINTEXT"
-e KAFKA_CFG_INTER_BROKER_LISTENER_NAME="PLAINTEXT"
-e ALLOW_PLAINTEXT_LISTENER=yes
-p 9092:9092
bitnami/kafka:latest
3. 启动Kafka节点3
docker run -d
--name kafka3
--network wdzm_network
-v /root/kafka-zookeeper-cluster/kafka3/data:/bitnami/kafka/data
-e KAFKA_BROKER_ID=3
-e KAFKA_CFG_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181"
-e KAFKA_CFG_ZOOKEEPER_USER="zk_client"
-e KAFKA_CFG_ZOOKEEPER_PASSWORD="secure_client_password"
-e KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://192.168.0.64:9093"
-e KAFKA_CFG_LISTENERS="PLAINTEXT://0.0.0.0:9093"
-p 9093:9093
bitnami/kafka:latest
检查容器状态
docker ps -a | grep -E 'zoo|kafka'
暂无评论内容