跳到主要内容

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,接下来让我们学习 主题与分区 的管理和使用。