Apache Kafka 安装与配置指南:从单机部署到高可用集群 本指南提供完整、可落地的 Apache Kafka 安装与配置实践方案,涵盖 Java 环境准备、ZooKeeper 依赖配置、Kafka 单节点部署、多节点集群搭建、核心参数详解及高可用保障策略,适用于生产环境部署与开发测试场景。 环境准备 Apache Kafka 基于 JVM 运行,依赖 ZooKeeper(Kafka 3.3.0 及之前版本)进行元数据协调与集群管理。部署前需确保基础运行环境就绪。 1.1 安装 Java 运行环境 Kafka 要求 Java 8 或更高版本(推荐 OpenJDK 11/17,兼容性更优)。
本指南提供完整、可落地的 Apache Kafka 安装与配置实践方案,涵盖 Java 环境准备、ZooKeeper 依赖配置、Kafka 单节点部署、多节点集群搭建、核心参数详解及高可用保障策略,适用于生产环境部署与开发测试场景。
Apache Kafka 基于 JVM 运行,依赖 ZooKeeper(Kafka 3.3.0 及之前版本)进行元数据协调与集群管理。部署前需确保基础运行环境就绪。
Kafka 要求 Java 8 或更高版本(推荐 OpenJDK 11/17,兼容性更优)。执行以下命令验证当前 Java 环境:
java -version
若未安装,按系统类型执行对应安装命令:
Ubuntu/Debian 系统:
sudo apt update sudo apt install openjdk-11-jdk -y
CentOS/RHEL 8+ 系统:
sudo dnf install java-11-openjdk-devel -y
CentOS/RHEL 7 系统:
sudo yum install java-11-openjdk-devel -y
设置 JAVA_HOME 环境变量(以 OpenJDK 11 为例):
echo "export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))" >> ~/.bashrc echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc source ~/.bashrc
验证配置:
echo $JAVA_HOME java -version
⚠️ 注意:自 Kafka 3.3.0 起,Kafka 已支持 KRaft 模式(Kafka Raft Metadata mode),可完全替代 ZooKeeper。本节面向仍使用 ZooKeeper 模式的主流生产环境(如 Kafka 2.8.x–3.2.x)。如需 KRaft 配置,请参阅官方 KRaft 迁移指南。
从 Apache ZooKeeper 官网 获取稳定版本(推荐 3.7.1 或 3.8.3),或使用命令行下载:
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz tar -xzf apache-zookeeper-3.7.1-bin.tar.gz mv apache-zookeeper-3.7.1-bin /opt/zookeeper
创建数据目录并授权:
sudo mkdir -p /var/lib/zookeeper sudo chown -R $USER:$USER /var/lib/zookeeper
复制并编辑配置文件:
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg vi /opt/zookeeper/conf/zoo.cfg
关键配置项(保持默认值或按需调整):
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 admin.enableServer=true
/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/bin/zkServer.sh status
预期输出包含 Mode: standalone,表示单节点模式运行正常。
访问 Apache Kafka 官网下载页,选择与 ZooKeeper 兼容的稳定版本(如 kafka_2.13-3.2.3.tgz),或执行:
wget https://downloads.apache.org/kafka/3.2.3/kafka_2.13-3.2.3.tgz tar -xzf kafka_2.13-3.2.3.tgz mv kafka_2.13-3.2.3 /opt/kafka
server.properties编辑主配置文件:
vi /opt/kafka/config/server.properties
按生产环境要求修改以下关键参数:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
broker.id |
0(单节点)或唯一整数(集群) |
Kafka 节点唯一标识,集群中不可重复 |
listeners |
PLAINTEXT://localhost:9092 |
外部客户端连接地址,生产环境需替换为服务器真实 IP |
advertised.listeners |
PLAINTEXT://localhost:9092 |
向客户端广播的访问地址,必须可被生产者/消费者解析 |
log.dirs |
/var/lib/kafka-logs |
日志存储路径,建议使用独立磁盘分区 |
zookeeper.connect |
localhost:2181 |
ZooKeeper 连接字符串,多节点格式:zk1:2181,zk2:2181,zk3:2181 |
num.partitions |
12 |
新建主题默认分区数,建议 ≥ broker 数 × 2 |
default.replication.factor |
3 |
新建主题默认副本数(生产环境最低要求) |
min.insync.replicas |
2 |
ISR(In-Sync Replicas)最小数量,保障写入一致性 |
auto.create.topics.enable |
false |
生产环境强烈建议禁用,主题需显式创建 |
创建日志目录并授权:
sudo mkdir -p /var/lib/kafka-logs sudo chown -R $USER:$USER /var/lib/kafka-logs
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
验证进程:
jps -l | grep kafka # 应输出类似:/opt/kafka/bin/../libs/kafka_2.13-3.2.3.jar
✅ 提示:使用
-daemon参数后台启动;如需前台调试,移除此参数。
在每台 Kafka 服务器上执行以下操作:
broker.id(如 0, 1, 2)log.dirs(避免磁盘争用)listeners 与 advertised.listeners 为本机 IP
listeners=PLAINTEXT://192.168.1.10:9092 advertised.listeners=PLAINTEXT://192.168.1.10:9092
zookeeper.connect 指向 ZooKeeper 集群地址在每台 ZooKeeper 服务器的 /opt/zookeeper/conf/zoo.cfg 中添加:
server.1=192.168.1.10:2888:3888 server.2=192.168.1.11:2888:3888 server.3=192.168.1.12:2888:3888
并在每台服务器的 $ZOOKEEPER_HOME/data/myid 文件中写入对应 ID(1 / 2 / 3)。
启动全部 ZooKeeper 实例后,执行:
/opt/zookeeper/bin/zkServer.sh status # 每台应返回 Mode: follower 或 Mode: leader
/opt/kafka/bin/kafka-topics.sh \ --create \ --topic quickstart-topic \ --bootstrap-server localhost:9092 \ --partitions 3 \ --replication-factor 3
🔍 验证主题:
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
启动控制台生产者:
/opt/kafka/bin/kafka-console-producer.sh \ --topic quickstart-topic \ --bootstrap-server localhost:9092
输入任意文本(如 Hello Kafka!),按 Ctrl+D 结束。
启动控制台消费者(从头读取):
/opt/kafka/bin/kafka-console-consumer.sh \ --topic quickstart-topic \ --bootstrap-server localhost:9092 \ --from-beginning
应立即看到已发送的消息。
server.properties 核心参数| 参数 | 生产环境建议值 | 作用说明 |
|---|---|---|
unclean.leader.election.enable |
false |
禁用非 ISR 副本选举为 Leader,防止数据丢失 |
delete.topic.enable |
true |
允许通过 API 删除主题(需配合权限控制) |
log.retention.hours |
168(7天) |
日志保留时长,按业务合规性调整 |
log.segment.bytes |
1073741824(1GB) |
单个日志段大小,影响刷盘频率与恢复速度 |
message.max.bytes |
1048588(1MB) |
单条消息最大字节数,需与客户端 max.request.size 一致 |
kafka-server-start.sh)在 /opt/kafka/bin/kafka-server-start.sh 开头添加:
export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=96m -XX:+UseG1GC" export KAFKA_JVM_PERFORMANCE_OPTS="-XX:MaxGCPauseMillis=20 -XX:InitiatingOccupancyFraction=35"
💡 建议:Kafka 堆内存不超过 6GB,避免 GC 停顿过长;优先使用 G1 垃圾收集器。
replication-factor ≥ 3min.insync.replicas = 2 确保至少 2 个副本同步成功才返回 ACKacks=all(生产者配置)实现强一致性写入/opt/kafka/bin/kafka-topics.sh --describe --topic quickstart-topic --bootstrap-server localhost:9092
关键 MBean 路径:
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSeckafka.server:type=ReplicaManager,name=UnderReplicatedPartitions(值 > 0 需告警)kafka.network:type=RequestMetrics,name=RequestsPerSec,request=Produce建议集成 Prometheus + JMX Exporter 实现可视化监控。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
Connection refused(连接 ZooKeeper 失败) |
ZooKeeper 未启动 / 防火墙拦截 | 检查 zkServer.sh status;开放 2181 端口 |
LEADER_NOT_AVAILABLE |
主题未创建 / Leader 选举未完成 | 运行 kafka-topics.sh --describe 查看状态 |
| 消费者无法拉取消息 | auto.offset.reset=latest 且无新消息 |
改为 earliest 或确认生产者已发送 |
NotLeaderOrFollower 错误 |
客户端 bootstrap.servers 指向非 Leader 节点 |
使用 --bootstrap-server(自动发现)而非直连 Leader |
Apache Kafka 的稳定运行依赖于严谨的环境准备、精准的参数配置与科学的集群规划。本文系统覆盖了从单机快速启动到生产级高可用集群的完整路径,强调以下核心实践原则:
broker.id、advertised.listeners、min.insync.replicas 等参数必须按拓扑精确设定;auto.create.topics.enable,启用 unclean.leader.election.enable=false;UnderReplicatedPartitions 纳入核心告警;遵循本指南配置的 Kafka 集群,可支撑每秒百万级消息吞吐,满足金融、电商、IoT 等高要求业务场景的实时数据管道需求。