docker安装kafka、zookeeper详细步骤

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
启动一个基于
bitnami/zookeeper
镜像的容器,运行一个启用了认证的 ZooKeeper 节点(
zoo1
),并配置为集群模式(与
zoo2

zoo3
组成集群)。以下是各参数的详细说明:


核心参数说明


-d

以后台(守护进程)模式运行容器。


--name zoo1

将容器命名为
zoo1
,便于后续管理。


--network wdzm_network

指定容器使用名为
wdzm_network
的自定义 Docker 网络,用于容器间通信。


-v
挂载卷配置

将宿主机目录映射到容器内,确保数据持久化:


/root/kafka-zookeeper-cluster/zookeeper1/data
→ ZooKeeper 数据目录
/root/kafka-zookeeper-cluster/zookeeper1/datalog
→ 事务日志目录
/root/kafka-zookeeper-cluster/zookeeper1/conf
→ 自定义配置文件目录


-e
环境变量配置


ZOO_MY_ID=1
:当前节点的 ID,必须与
ZOO_SERVERS
中的
server.1
对应。
ZOO_SERVERS
:定义集群节点列表,格式为
server.<id>=<host>:<follower_port>:<election_port>

ZOO_ENABLE_AUTH=yes
:启用 ZooKeeper 的 SASL/Digest-MD5 认证。
ZOO_SERVER_USERS

ZOO_SERVER_PASSWORDS
:设置服务端通信的用户名和密码。
ZOO_CLIENT_USER

ZOO_CLIENT_PASSWORD
:设置客户端连接的用户名和密码。
ZOO_CFG_EXTRA_ARGS
:传递额外的 JVM 参数,例如指定 JAAS 配置文件路径(需提前在挂载的
conf
目录中配置)。


-p 2181:2181

将容器的 ZooKeeper 客户端端口(默认 2181)映射到宿主机的 2181 端口。


bitnami/zookeeper:latest

使用的镜像名称及标签(最新版)。


关键注意事项

集群配置

需确保
ZOO_SERVERS
中所有节点的主机名(如
zoo1

zoo2
)能通过 Docker 网络解析。每个节点的
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";
};

数据目录权限

确保宿主机挂载目录(如
/root/kafka-zookeeper-cluster/zookeeper1/data
)对容器用户可写(Bitnami 镜像默认用户为
1001
)。


典型问题排查

节点无法加入集群:检查
ZOO_SERVERS
配置的端口和主机名是否可达,防火墙是否放行
2888
( follower 通信)和
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

后台启动容器

使用
-d
参数以 detached 模式运行容器,使容器在后台运行,不占用当前终端。

命名容器

通过
--name kafka1
指定容器名称为
kafka1
,便于后续通过名称管理容器(如启动、停止或查看日志)。

连接自定义网络

通过
--network wdzm_network
将容器连接到预先创建的 Docker 网络
wdzm_network
,确保 Kafka 能够与同一网络中的其他服务(如 ZooKeeper 集群
zoo1

zoo2

zoo3
)通信。需提前创建该网络:


docker network create wdzm_network

数据持久化

通过
-v
挂载卷将容器内的
/bitnami/kafka/data
(Kafka 数据存储目录)映射到宿主机目录,确保数据在容器重启后不丢失。例如:


-v /host/path/kafka1-data:/bitnami/kafka/data


/host/path/kafka1-data
替换为宿主机实际路径。

完整命令示例

命令功能概述

该命令用于在后台启动一个名为
kafka1
的Kafka容器实例,连接到自定义网络
wdzm_network
,配置数据卷、环境变量及端口映射,实现与ZooKeeper集群的集成。

参数解析

基础运行参数


-d
:以守护进程(后台)模式运行容器
--name kafka1
:指定容器名称为
kafka1

--network wdzm_network
:将容器接入预先创建的
wdzm_network
网络

数据卷配置


-v /root/.../kafka1/data:/bitnami/kafka/data
:挂载宿主机目录作为Kafka数据存储
-v /root/.../kafka1/conf:/bitnami/kafka/conf
:挂载宿主机目录作为Kafka配置文件目录

核心环境变量


KAFKA_BROKER_ID=1
:设置当前Kafka节点的唯一ID
KAFKA_CFG_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181"
:指定ZooKeeper集群地址
KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://192.168.0.64:9091"
:声明对外暴露的服务地址
KAFKA_CFG_LISTENERS="PLAINTEXT://0.0.0.0:9091"
:配置监听所有IP的9091端口

安全相关配置


KAFKA_CFG_ZOOKEEPER_USER/PASSWORD
:ZooKeeper认证凭据
ALLOW_PLAINTEXT_LISTENER=yes
:允许未加密的PLAINTEXT协议

网络端口映射


-p 9091:9091
:将宿主机9091端口映射到容器9091端口

关键配置说明

监听器配置逻辑


PLAINTEXT://0.0.0.0:9091
表示容器内监听所有网络接口
ADVERTISED_LISTENERS
需设置为客户端实际连接的地址(此处为宿主机IP)
INTER_BROKER_LISTENER_NAME
指定Broker间通信使用的监听器名称

ZooKeeper集成

使用
zoo1/zoo2/zoo3
主机名需确保这些ZooKeeper容器在同一网络2181为ZooKeeper默认客户端连接端口

典型应用场景

基于Docker搭建多节点Kafka集群需要与现有ZooKeeper集群集成的测试环境需要持久化Kafka数据的开发环境

注意事项

宿主机目录
/root/kafka-zookeeper-cluster/
需提前创建若ZooKeeper启用ACL,需同步配置
KAFKA_OPTS
环境变量生产环境建议使用SSL加密替代PLAINTEXT协议


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'
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容