消息队列
大约 6 分钟frameworkkafka
Apache Kafka 3.9.0(KRaft模式)集群部署与性能调优手册
相关信息
本文档详细介绍 Apache Kafka 3.9.0 版本在生产环境下的集群部署方案及性能优化最佳实践。Kafka 3.x 版本引入了 KRaft 模式,允许用户在无需 ZooKeeper 的情况下部署 Kafka 集群,从而降低运维复杂性并提高整体性能。
本文提供两种部署方式:
- Linux 原生部署
- Docker Compose 部署
一、Kafka 3.9.0 与 KRaft 模式简介
Kafka 从 2.8.0 版本开始引入了 Kafka Raft(简称 KRaft)模式,KRaft 是一种基于 Raft 共识算法的元数据管理机制,旨在取代传统的 ZooKeeper,简化部署架构并提升性能与可维护性。
Kafka 3.9.0 已经稳定支持 KRaft 模式,推荐生产环境使用。
二、Kafka 3.9.0 KRaft 集群部署(Linux 原生方式)
2.1 环境准备
推荐以下软硬件环境:
项目 | 推荐配置 |
---|---|
OS | Debian 12.x 或 Ubuntu 20.x |
CPU | 8核以上 |
内存 | 16GB以上 |
存储 | SSD磁盘,建议500GB以上 |
网络 | 千兆或万兆网络,节点间延迟<1ms |
JDK版本 | OpenJDK 17 LTS |
安装JDK:
sudo yum install java-11-openjdk-devel -y
java -version
2.2 下载 Kafka 3.9.0 二进制包
wget https://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz
tar zxvf kafka_2.13-3.9.0.tgz -C /opt/
cd /opt/kafka_2.13-3.9.0
2.3 配置 KRaft 集群节点(以3节点为例)
编辑 config/kraft/server.properties
:
process.roles=broker,controller
node.id=1
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
advertised.listeners=PLAINTEXT://<broker1_ip>:9092
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
controller.quorum.voters=1@<broker1_ip>:9093,2@<broker2_ip>:9093,3@<broker3_ip>:9093
controller.listener.names=CONTROLLER
inter.broker.listener.name=PLAINTEXT
log.dirs=/data/kafka/logs
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
num.partitions=3
default.replication.factor=3
min.insync.replicas=2
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
注意:
- 每个节点的
node.id
和advertised.listeners
需单独配置。- 建议 Kafka 日志目录单独挂载高性能 SSD 磁盘。
2.4 初始化并启动 Kafka KRaft 集群
# 生成集群唯一标识符UUID
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
# 格式化存储目录(每个节点都需执行)
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
# 启动 Kafka(每个节点执行)
bin/kafka-server-start.sh -daemon config/kraft/server.properties
2.5 验证集群状态
bin/kafka-broker-api-versions.sh --bootstrap-server <broker1_ip>:9092
三、Kafka 3.9.0 KRaft 集群部署(Docker Compose 方式)
提示
- 注意:新版docker已无需单独安装
docker-compose
,直接采用docker compose up -d
命令代替便可 - 若使用旧版docker,可参考以下步骤安装
docker-compose
,且需要在docker-compose.yml
头部增加version: "3"
配置
3.1 Docker 环境准备
安装 Docker 与 Docker Compose:
curl -fsSL https://get.docker.com | bash
sudo systemctl enable docker && sudo systemctl start docker
# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
3.2 创建 Docker Compose 文件
注意:可直接替换配置中的HOST_IP
变量,也可以外部创建.env
文件进行环境变量配置
# 定义网络配置
networks:
blade_net:
driver: bridge # 使用 bridge 驱动,创建一个桥接网络
ipam: # IP 地址管理配置
config:
- subnet: 172.30.0.0/16 # 定义子网,IP 范围从 172.30.0.0 到 172.30.255.255
# 定义服务配置
services:
#kafka管理界面服务
links-kafka-ui:
container_name: links-kafka-ui
image: provectuslabs/kafka-ui
ports:
- 9090:8080
depends_on:
- links-kafka1
- links-kafka2
- links-kafka3
environment:
- KAFKA_CLUSTERS_0_NAME=kafkaCluster
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=${HOST_IP}:9192,${HOST_IP}:9292,${HOST_IP}:9392
- DYNAMIC_CONFIG_ENABLED=true
networks:
blade_net:
ipv4_address: 172.30.0.89
# 第一个Kafka节点配置
links-kafka1:
image: bitnami/kafka:3.9.0
container_name: links-kafka1
user: root
ports:
- 9192:9092
- 9193:9093
environment:
### KRaft模式基础配置
# 启用KRaft模式以替代ZooKeeper
- KAFKA_ENABLE_KRAFT=yes
# 节点角色配置,同时作为broker和controller
- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 配置controller监听器名称
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 配置多重监听器
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 监听器安全协议映射设置
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 集群唯一标识符
- KAFKA_KRAFT_CLUSTER_ID=AYSX1ybBBFXykXQVtnLmRF
# 集群控制器节点配置
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@links-kafka1:9093,2@links-kafka2:9093,3@links-kafka3:9093
# 开启明文传输支持
- ALLOW_PLAINTEXT_LISTENER=yes
# JVM内存配置参数
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 启用主题自动创建功能
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息留存时间配置
- KAFKA_LOG_RETENTION_MS=604800000
### 节点专属配置
# 外部访问地址配置
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://${HOST_IP}:9192
# 节点唯一标识符
- KAFKA_CFG_NODE_ID=1
volumes:
- ./data/bitnami/kafka1:/bitnami/kafka
networks:
blade_net:
ipv4_address: 172.30.0.91
# 第二个Kafka节点配置
links-kafka2:
image: bitnami/kafka:3.9.0
container_name: links-kafka2
user: root
ports:
- 9292:9092
- 9293:9093
environment:
### KRaft模式基础配置
# 启用KRaft模式以替代ZooKeeper
- KAFKA_ENABLE_KRAFT=yes
# 节点角色配置,同时作为broker和controller
- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 配置controller监听器名称
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 配置多重监听器
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 监听器安全协议映射设置
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 集群唯一标识符
- KAFKA_KRAFT_CLUSTER_ID=AYSX1ybBBFXykXQVtnLmRF
# 集群控制器节点配置
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@links-kafka1:9093,2@links-kafka2:9093,3@links-kafka3:9093
# 开启明文传输支持
- ALLOW_PLAINTEXT_LISTENER=yes
# JVM内存配置参数
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 启用主题自动创建功能
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息留存时间配置
- KAFKA_LOG_RETENTION_MS=604800000
### 节点专属配置
# 外部访问地址配置
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://${HOST_IP}:9292
# 节点唯一标识符
- KAFKA_CFG_NODE_ID=2
volumes:
- ./data/bitnami/kafka2:/bitnami/kafka
networks:
blade_net:
ipv4_address: 172.30.0.92
# 第三个Kafka节点配置
links-kafka3:
image: bitnami/kafka:3.9.0
container_name: links-kafka3
user: root
ports:
- 9392:9092
- 9393:9093
environment:
### KRaft模式基础配置
# 启用KRaft模式以替代ZooKeeper
- KAFKA_ENABLE_KRAFT=yes
# 节点角色配置,同时作为broker和controller
- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 配置controller监听器名称
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 配置多重监听器
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 监听器安全协议映射设置
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 集群唯一标识符
- KAFKA_KRAFT_CLUSTER_ID=AYSX1ybBBFXykXQVtnLmRF
# 集群控制器节点配置
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@links-kafka1:9093,2@links-kafka2:9093,3@links-kafka3:9093
# 开启明文传输支持
- ALLOW_PLAINTEXT_LISTENER=yes
# JVM内存配置参数
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 启用主题自动创建功能
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息留存时间配置
- KAFKA_LOG_RETENTION_MS=604800000
### 节点专属配置
# 外部访问地址配置
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://${HOST_IP}:9392
# 节点唯一标识符
- KAFKA_CFG_NODE_ID=3
volumes:
- ./data/bitnami/kafka3:/bitnami/kafka
networks:
blade_net:
ipv4_address: 172.30.0.93
3.3 启动 Kafka 集群(Docker Compose)
docker compose up -d
3.4 验证 Kafka 集群状态(Docker)
docker logs -f links-kafka1
四、Kafka 性能调优
4.1 JVM 参数优化
建议设置以下 JVM 参数:
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:+UseCompressedOops -XX:+DisableExplicitGC"
4.2 网络与线程优化
根据 CPU 核数优化线程:
num.network.threads=CPU核数 x 1~2
num.io.threads=CPU核数 x 2~4
4.3 存储优化
- 使用 SSD 存储,优化日志段大小:
log.segment.bytes=1073741824
log.retention.hours=168
- Linux 系统优化(
/etc/sysctl.conf
):
vm.swappiness=1
vm.dirty_background_ratio=5
vm.dirty_ratio=10
net.core.somaxconn=4096
net.ipv4.tcp_tw_reuse=1
五、Kafka Topic 分区与副本配置原则
5.1 分区(Partitions)
- 分区数决定消费并行度,建议分区数为 CPU 核数的倍数,生产环境通常设置在 3~50 之间。
- 分区数一旦设定,后期修改代价较高,需提前规划。
5.2 副本(Replicas)
- 推荐副本数为 3(1 Leader + 2 Followers),最多不超过 5。
- ISR 设置:
min.insync.replicas
推荐为(replication factor / 2) + 1
,例如副本为 3 时设置为 2。
六、监控与管理工具推荐
- Kafka UI(已在 Docker Compose 中提供)
- Kafka Exporter + Prometheus + Grafana(推荐企业级监控方案)
七、总结
本文档详细介绍了 Kafka 3.9.0 基于 KRaft 模式的两种集群部署方案,并提供了相应的性能优化和最佳实践建议。通过以上部署及优化手段,可以有效提升 Kafka 集群的稳定性、高可用性及性能表现,满足企业级生产环境的严格要求。