跳到主要内容

Kafka 环境安装

本章将详细介绍 Kafka 的安装和配置,包括单机模式和集群模式的搭建。

环境要求​

硬件要求​

配置最低要求推荐配置
CPU2 核4+ 核
内存4 GB8+ GB
磁盘10 GB SSD50+ GB SSD
网络100 Mbps1 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​

  1. 下载并安装 Docker Desktop
  2. 启动 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,接下来让我们学习 主题与分区 的管理和使用。