Kafka 环境安装
本章将详细介绍 Kafka 的安装和配置,包括单机模式和集群模式的搭建。
环境要求
硬件要求
| 配置 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4+ 核 |
| 内存 | 4 GB | 8+ GB |
| 磁盘 | 10 GB SSD | 50+ GB SSD |
| 网络 | 100 Mbps | 1 Gbps |
软件要求
- 操作系统:Linux(推荐)、macOS、Windows
- Java:JDK 8 或更高版本(Kafka 3.x 需要 JDK 11+)
- Zookeeper:Kafka 2.x 需要,Kafka 3.x+ 推荐使用 KRaft 模式
推荐
Kafka 3.x 推荐使用 KRaft 模式,无需额外安装 Zookeeper,架构更简单。
使用 Docker 安装(推荐)
Docker 是最快速的 Kafka 安装方式,适合开发和测试。
安装 Docker Desktop
- 下载并安装 Docker Desktop
- 启动 Docker 服务
单节点 Kafka(KRaft 模式)
# docker-compose.yml
version: '3.8'
services:
kafka:
image: apache/kafka:3.7.0
container_name: kafka
ports:
- "9092:9092"
environment:
# KRaft 模式配置
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_LOG_DIRS: /var/lib/kafka/data
# 启用删除主题功能
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
volumes:
- kafka-data:/var/lib/kafka/data
volumes:
kafka-data:
启动服务:
# 启动 Kafka
docker-compose up -d
# 查看日志
docker-compose logs -f kafka
# 停止服务
docker-compose down
多节点 Kafka 集群
# docker-compose-cluster.yml
version: '3.8'
services:
kafka-1:
image: apache/kafka:3.7.0
container_name: kafka-1
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_LOG_DIRS: /var/lib/kafka/data
kafka-2:
image: apache/kafka:3.7.0
container_name: kafka-2
ports:
- "9093:9092"
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_LOG_DIRS: /var/lib/kafka/data
kafka-3:
image: apache/kafka:3.7.0
container_name: kafka-3
ports:
- "9094:9092"
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:9092
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_LOG_DIRS: /var/lib/kafka/data
传统方式安装
安装 Java
Kafka 需要 Java 运行时环境:
# macOS (使用 Homebrew)
brew install openjdk@17
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install openjdk-17-jdk
# 验证安装
java -version
下载 Kafka
# 下载 Kafka(选择需要的版本)
wget https://downloads.apache.org/kafka/3.7.0/kafka_2.13-3.7.0.tgz
# 解压
tar -xzf kafka_2.13-3.7.0.tgz
cd kafka_2.13-3.7.0
配置 Kafka
编辑 config/kraft/server.properties:
# 节点 ID(每个 Broker 唯一)
node.id=1
# 角色配置(KRaft 模式)
process.roles=broker,controller
# 监听地址
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 对外公告地址(客户端连接使用)
advertised.listeners=PLAINTEXT://localhost:9092
# 控制器地址
controller.listener.names=CONTROLLER
# 控制器投票节点(所有 Broker 的 controller 地址)
controller.quorum.voters=1@localhost:9093
# 日志目录
log.dirs=/tmp/kafka-logs
# 主题配置
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
# 自动创建主题
auto.create.topics.enable=true
# 删除主题功能
delete.topic.enable=true
格式化存储(KRaft 模式首次启动)
# 生成集群 UUID
KAFKA_CLUSTER_ID=$(bin/kafka-storage.sh random-uuid)
echo $KAFKA_CLUSTER_ID
# 格式化存储目录
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
启动 Kafka
# 启动 Kafka Broker
bin/kafka-server-start.sh -daemon config/kraft/server.properties
# 查看日志
tail -f logs/kafka.log
# 检查 Kafka 是否启动成功
jps -l
停止 Kafka
# 优雅停止
bin/kafka-server-stop.sh
使用 Zookeeper 的 Legacy 模式
注意
Kafka 3.x 推荐使用 KRaft 模式,Zookeeper 模式将在未来版本中弃用。
启动 Zookeeper
# 使用 Kafka 自带的 Zookeeper
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
Zookeeper 配置示例 config/zookeeper.properties:
# 数据目录
dataDir=/tmp/zookeeper
# 端口
clientPort=2181
# _tickTime:Zookeeper 服务器之间或客户端与服务器之间心跳时间
tickTime=2000
# initLimit:Follower 启动时与 Leader 同步的最大时间
initLimit=10
# syncLimit:Follower 与 Leader 同步后,最大允许的延迟
syncLimit=5
启动 Kafka
# 使用 Zookeeper 配置启动
bin/kafka-server-start.sh -daemon config/server.properties
Docker + KRaft 快速测试脚本
创建一个完整的测试环境:
#!/bin/bash
# 创建 Docker 网络
docker network create kafka-network
# 启动 Zookeeper(可选,用于 Legacy 模式)
docker run -d \
--name zookeeper \
--network kafka-network \
-e ZOOKEEPER_CLIENT_PORT=2181 \
confluentinc/cp-zookeeper:7.5.0
# 启动 Kafka
docker run -d \
--name kafka \
--network kafka-network \
-p 9092:9092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
confluentinc/cp-kafka:7.5.0
验证安装
创建主题
# 进入 Kafka 容器
docker exec -it kafka bash
# 创建主题
kafka-topics --create \
--topic test-topic \
--bootstrap-server localhost:9092 \
--partitions 3 \
--replication-factor 1
# 查看主题列表
kafka-topics --list --bootstrap-server localhost:9092
# 查看主题详情
kafka-topics --describe --topic test-topic --bootstrap-server localhost:9092
生产消息
# 生产者交互模式
kafka-console-producer \
--topic test-topic \
--bootstrap-server localhost:9092
# 输入消息并回车发送
# > Hello Kafka
# > This is my first message
消费消息
# 消费者交互模式(从最新消息开始)
kafka-console-consumer \
--topic test-topic \
--from-beginning \
--bootstrap-server localhost:9092
验证集群状态
# 查看集群元数据
kafka-metadata --snapshot /var/lib/kafka/data/__cluster_metadata-0/0 \
--command "clusterId;nodeId;epoch"
常见问题
1. 端口被占用
# 查看端口占用
netstat -tlnp | grep 9092
# 杀死占用进程
kill -9 <PID>
2. 磁盘空间不足
# 清理 Kafka 日志
# 方法1:删除旧日志段
rm -rf /tmp/kafka-logs/*
# 方法2:配置日志保留策略
log.retention.hours=168
log.retention.check.interval.ms=300000
3. 内存不足
# 调整 JVM 堆内存
KAFKA_HEAP_OPTS="-Xmx2g -Xms2g" bin/kafka-server-start.sh
4. 无法连接到 Kafka
检查以下几点:
- Kafka 是否正常启动:
jps -l - 端口是否正确:
netstat -tlnp | grep 9092 - 防火墙是否开放:
firewall-cmd --list-ports - 监听地址配置是否正确
生产环境配置建议
JVM 配置
# 设置 JVM 参数
export KAFKA_HEAP_OPTS="-Xmx6g -Xms6g -XX:+UseG1GC"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35"
操作系统优化
# 增加文件描述符限制
ulimit -n 1000000
# 优化网络参数
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 禁用 Swap
sysctl -w vm.swappiness=0
磁盘配置
- 使用 SSD 存储
- 配置多数据目录:
log.dirs=/disk1/kafka,/disk2/kafka - 禁用文件系统日志:
log.flush.interval.ms=1000
下一步
现在你已经成功安装了 Kafka,接下来让我们学习 主题与分区 的管理和使用。