3. Kafka 安装与部署:单机部署、集群部署、常用配置项、启动与验证

Kafka 的部署方式直接影响消息系统的吞吐量、可用性与运维成本。本章从单机快速验证到多节点集群搭建,覆盖核心配置项与启动验证步骤,为后续 Go 项目压测提供稳定的基础设施。

3.1 环境准备与版本选择

Kafka 依赖 Java 运行环境,推荐使用 JDK 11+(长期支持版本)。Kafka 3.x 系列已内置 ZooKeeper 模式与 KRaft(去 ZooKeeper)模式,本章以 Kafka 3.5.0 为例,采用 ZooKeeper 模式讲解,兼容性更广。

组件 推荐版本 说明
JDK 11 / 17 Kafka 3.x 最低要求 JDK 11
ZooKeeper 3.8.x 用于集群元数据管理与 Leader 选举
Kafka 3.5.0 稳定版,支持生产级特性
操作系统 CentOS 7+ / Ubuntu 20.04+ Linux 环境性能最佳
提示:生产环境建议使用 KRaft 模式(Kafka 3.2+),减少 ZooKeeper 运维复杂度。本章为兼容传统架构,仍以 ZooKeeper 模式演示。

3.2 单机部署(快速验证)

单机部署适用于开发测试与功能验证,所有组件运行在同一节点。

3.2.1 下载与解压

# 下载 Kafka 二进制包
wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz

# 解压到指定目录
tar -xzf kafka_2.13-3.5.0.tgz -C /opt/
ln -s /opt/kafka_2.13-3.5.0 /opt/kafka

3.2.2 启动 ZooKeeper

Kafka 依赖 ZooKeeper 管理集群元数据。单机模式下使用内置脚本快速启动:

# 启动 ZooKeeper(默认端口 2181)
/opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties

# 验证 ZooKeeper 进程
jps | grep QuorumPeerMain

3.2.3 启动 Kafka Broker

修改 config/server.properties 中的核心参数:

# broker.id 单机唯一
broker.id=0
# 监听地址
listeners=PLAINTEXT://0.0.0.0:9092
# 日志存储目录
log.dirs=/data/kafka/logs
# ZooKeeper 连接地址
zookeeper.connect=localhost:2181
# 启动 Kafka Broker
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# 验证进程
jps | grep Kafka
关键检查点:启动后查看 /data/kafka/logs/server.log,确认无 ERROR 日志,且出现 started (kafka.server.KafkaServer) 字样。

3.3 集群部署(3 节点示例)

集群部署提供高可用与水平扩展能力。以下以 3 台服务器(node1、node2、node3)为例,每台部署一个 Broker。

3.3.1 节点规划

节点 IP 示例 Broker ID ZooKeeper 端口 Kafka 端口
node1 192.168.1.101 0 2181 9092
node2 192.168.1.102 1 2181 9092
node3 192.168.1.103 2 2181 9092

3.3.2 集群配置差异项

每台 Broker 的 server.properties 需修改以下参数:

# 每个节点不同
broker.id=0   # node1 为 0,node2 为 1,node3 为 2

# 监听地址改为本机 IP
listeners=PLAINTEXT://192.168.1.101:9092

# 日志目录建议使用独立磁盘
log.dirs=/data/kafka/logs

# ZooKeeper 集群地址(所有节点相同)
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

3.3.3 启动顺序

  1. 在所有节点启动 ZooKeeper(或使用独立 ZooKeeper 集群)。
  2. 依次启动各节点 Kafka Broker。
  3. 观察集群成员变化。
# 在 node1 执行
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# 在 node2 执行
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# 在 node3 执行
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
注意:集群模式下,所有节点的 listeners 必须使用真实 IP 或可解析主机名,不能使用 0.0.0.0,否则跨节点通信会失败。

3.4 常用配置项详解

以下配置项直接影响性能、可靠性与运维管理,需根据业务场景调整。

配置项 默认值 推荐值(压测场景) 说明
num.partitions 1 3~6 Topic 默认分区数,影响并行消费能力
default.replication.factor 1 2~3 副本因子,集群至少 2 保证高可用
log.retention.hours 168 24~72 日志保留时间(小时),压测可缩短
log.segment.bytes 1073741824 536870912 单个日志段大小(字节),512MB 减少文件数
socket.send.buffer.bytes 102400 131072 Socket 发送缓冲区,高吞吐场景适当增大
socket.receive.buffer.bytes 102400 131072 Socket 接收缓冲区
num.network.threads 3 4~8 网络线程数,处理客户端请求
num.io.threads 8 8~16 I/O 线程数,处理磁盘读写

3.5 启动与验证

部署完成后,通过以下步骤验证集群是否正常工作。

3.5.1 创建测试 Topic

# 创建名为 test-topic 的 Topic,3 分区,2 副本
/opt/kafka/bin/kafka-topics.sh --create \
  --bootstrap-server 192.168.1.101:9092 \
  --replication-factor 2 \
  --partitions 3 \
  --topic test-topic

3.5.2 查看 Topic 详情

# 查看 Topic 列表
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.1.101:9092

# 查看 Topic 详细信息(分区与副本分布)
/opt/kafka/bin/kafka-topics.sh --describe \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic

3.5.3 生产与消费验证

# 启动生产者,输入消息
/opt/kafka/bin/kafka-console-producer.sh \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic
> hello kafka
> cluster test

# 启动消费者,查看消息
/opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic \
  --from-beginning
hello kafka
cluster test

3.5.4 集群健康检查

  • 查看 Broker 列表:通过 ZooKeeper 查看 /brokers/ids 节点,确认所有 Broker 已注册。
  • 模拟故障:停止一个 Broker,观察 Leader 重新选举与 ISR 变化。
  • 监控指标:使用 kafka-run-class.sh kafka.tools.JmxTool 或集成 Prometheus + JMX Exporter。
# 通过 ZooKeeper 查看 Broker 列表
/opt/kafka/bin/zookeeper-shell.sh localhost:2181 ls /brokers/ids
[0, 1, 2]   # 表示 3 个 Broker 均在线
验证要点:集群部署后,务必测试 Broker 宕机恢复 与 数据一致性,确保生产环境可用。

3.6 部署架构图

下图展示 3 节点 Kafka 集群与 ZooKeeper 集群的部署关系,以及客户端(Go 应用)的连接方式。

Kafka 3 节点集群部署架构 ZooKeeper 集群 ZK1 ZK2 ZK3 Kafka Broker 集群 Broker 0 Broker 1 Broker 2 元数据同步 客户端(Go 应用 / 压测工具) 生产/消费 生产/消费 生产/消费 磁盘存储(log.dirs) 写入日志段 写入日志段 说明: ZooKeeper 管理 Broker 元数据与 Leader 选举;Broker 负责消息存储与读写;客户端通过 bootstrap-server 连接任意 Broker 即可发现集群。

3.7 常见问题与避坑

  • 端口冲突:ZooKeeper 默认 2181,Kafka 默认 9092,确保未被占用。
  • 磁盘空间:Kafka 日志默认不自动删除,压测时需设置 log.retention.bytes 或定时清理。
  • 网络防火墙:集群节点间需开放 9092(Kafka)与 2181(ZooKeeper)端口。
  • JVM 堆内存:修改 KAFKA_HEAP_OPTS 环境变量,生产环境建议 4G~8G。
# 设置 JVM 堆内存示例
export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g"
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
压测前置检查清单:
  1. 所有 Broker 已注册到 ZooKeeper(/brokers/ids 包含全部 ID)。
  2. Topic 分区与副本分布均匀(kafka-topics --describe 检查)。
  3. 生产者/消费者端网络连通性测试通过。
  4. 磁盘 I/O 性能满足预期(使用 fio 或 dd 测试)。