基于 JDK 17 的 Kafka 部署需重点关注Kafka 版本与 JDK 17 的兼容性(Kafka 3.3.0 及以上正式支持 JDK 17,3.2.0 为实验性支持,推荐选择 3.3.0 + 版本,如 3.6.1、3.7.0),其余部署逻辑(Zookeeper 模式、KRaft 模式)与 JDK 8/11 基本一致,仅 JDK 安装和少量 JVM 参数需调整。以下为具体部署步骤:
一、版本选择与环境准备
1. 版本组合推荐
- Kafka 版本:3.6.1(稳定版,对 JDK 17 支持完善)
- JDK 版本:OpenJDK 17(推荐开源版本,Oracle JDK 17 需注意许可证)
- 操作系统:CentOS 7/8/9、Ubuntu 20.04+(Linux 系统,生产环境首选)
2. 系统基础配置(Linux)
与常规部署一致,需完成:
-
关闭防火墙 / 开放端口(Zookeeper 2181、Kafka 9092、KRaft 控制器 9093)
-
关闭 SELinux
-
配置主机名与 hosts(集群必需)
-
配置 NTP 时间同步(集群节点时间偏差≤100ms)
-
调整 Linux 内核参数(优化文件描述符、内存等):
bash# 临时调整文件描述符数 ulimit -n 65535 # 永久调整(编辑/etc/security/limits.conf) echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf echo "* soft nproc 65535" >> /etc/security/limits.conf echo "* hard nproc 65535" >> /etc/security/limits.conf # 调整vm.swappiness(减少交换分区使用) echo "vm.swappiness=1" >> /etc/sysctl.conf sysctl -p
二、JDK 17 安装(OpenJDK 为例)
1. 安装 OpenJDK 17
-
CentOS/RHEL :
bash# 安装OpenJDK 17 yum install -y java-17-openjdk java-17-openjdk-devel # 验证版本 java -version # 输出示例:openjdk version "17.0.8" 2023-07-18 LTS -
Ubuntu/Debian :
bash# 更新源 apt update # 安装OpenJDK 17 apt install -y openjdk-17-jdk openjdk-17-jre # 验证版本 java -version -
手动解压安装(可选,如 Oracle JDK 17) :
bash# 下载Oracle JDK 17(需从官网获取) wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz # 解压到/usr/local tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/ # 重命名 mv /usr/local/jdk-17.0.x /usr/local/jdk17 # 配置环境变量(编辑/etc/profile) vi /etc/profile # 添加以下内容 export JAVA_HOME=/usr/local/jdk17 export PATH=$PATH:$JAVA_HOME/bin # 生效配置 source /etc/profile
2. 确认 JDK 17 为默认版本
bash
# 列出已安装的JDK
update-alternatives --list java
# 配置默认Java(根据实际路径选择)
update-alternatives --config java
# 选择JDK 17的路径编号即可
三、Kafka 部署(以 3.6.1 为例)
1. 下载并解压 Kafka
bash
# 下载Kafka 3.6.1(Scala 2.13版本,兼容JDK 17)
wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz
# 解压
tar -zxvf kafka_2.13-3.6.1.tgz -C /usr/local/
# 重命名
mv /usr/local/kafka_2.13-3.6.1 /usr/local/kafka
2. 调整 Kafka 的 JVM 参数(适配 JDK 17)
Kafka 默认 JVM 参数为 JDK 8 优化,JDK 17 下可调整bin/kafka-server-start.sh中的KAFKA_HEAP_OPTS和KAFKA_JVM_PERFORMANCE_OPTS(建议根据服务器内存调整,示例为 8GB 内存配
bash
vi /usr/local/kafka/bin/kafka-server-start.sh
# 找到以下两行,修改为:
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G" # 堆内存设为4GB(物理内存的50%左右)
export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/kafka/logs/heapdump.hprof -Djava.security.egd=file:/dev/./urandom"
- JDK 17 中 G1GC 为默认垃圾收集器,无需额外指定
-XX:+UseG1GC(但显式指定更兼容旧版本配置); - 移除 JDK 17 中废弃的参数(如
-XX:+UseConcMarkSweepGC、-XX:+UseCMSInitiatingOccupancyOnly等,这些参数在 JDK 14 + 已废弃)。
四、单机部署(KRaft 模式,无 Zookeeper,推荐 JDK 17 + 使用)
KRaft 模式是 Kafka 未来的主流方向,且 JDK 17 下运行更高效,步骤如下:
bash
cd /usr/local/kafka
CLUSTER_ID=$(bin/kafka-storage.sh random-uuid)
echo $CLUSTER_ID # 记录集群ID,如:d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m
2. 格式化存储目录
bash
bin/kafka-storage.sh format -t $CLUSTER_ID -c config/kraft/server.properties
3. 配置 KRaft 模式的server.properties
properties
vi /usr/local/kafka/config/kraft/server.properties
# 关键配置(其余保持默认或按需调整)
node.id=1
cluster.id=${CLUSTER_ID} # 替换为实际生成的集群ID
process.roles=controller,broker
controller.listener.names=CONTROLLER
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
advertised.listeners=PLAINTEXT://192.168.1.101:9092 # 替换为节点IP/主机名
controller.quorum.voters=1@192.168.1.101:9093
log.dirs=/usr/local/kafka/data/kraft-logs
num.partitions=3
default.replication.factor=1
min.insync.replicas=1
创建日志目录:
bash
mkdir -p /usr/local/kafka/data/kraft-logs
4. 启动 Kafka(KRaft 模式)
bash
bin/kafka-server-start.sh -daemon config/kraft/server.properties
5. 验证部署
bash
# 查看进程(JDK 17下Kafka进程名为kafka.Kafka)
jps # 应看到Kafka进程
# 创建Topic
bin/kafka-topics.sh --create --topic test-jdk17 --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
# 生产消息
bin/kafka-console-producer.sh --topic test-jdk17 --bootstrap-server localhost:9092
# 消费消息(新开终端)
bin/kafka-console-consumer.sh --topic test-jdk17 --bootstrap-server localhost:9092 --from-beginning
五、集群部署(KRaft 模式,3 节点,JDK 17)
1. 同步配置到所有节点
- 所有节点安装 JDK 17 并配置环境变量;
- 所有节点解压 Kafka 到
/usr/local/kafka,并调整 JVM 参数; - 所有节点使用相同的集群 ID(在任意节点生成后,同步到其他节点)。
2. 每个节点的server.properties配置
-
节点 1(192.168.1.101) :
properties
node.id=1 cluster.id=d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m # 实际集群ID process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://192.168.1.101:9092 controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 2(192.168.1.102) :
properties
node.id=2 cluster.id=d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://192.168.1.102:9092 controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 3(192.168.1.103) :
properties
node.id=3 cluster.id=d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://192.168.1.103:9092 controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2
3. 格式化并启动集群
-
每个节点执行格式化(仅首次部署时执行,且需使用相同集群 ID ):
bashbin/kafka-storage.sh format -t d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m -c config/kraft/server.properties -
每个节点启动 Kafka:
bashbin/kafka-server-start.sh -daemon config/kraft/server.properties
4. 验证集群状态
bash
# 查看集群节点信息
bin/kafka-broker-api-versions.sh --bootstrap-server 192.168.1.101:9092
# 查看Topic副本分布
bin/kafka-topics.sh --create --topic cluster-jdk17 --bootstrap-server 192.168.1.101:9092 --partitions 3 --replication-factor 3
bin/kafka-topics.sh --describe --topic cluster-jdk17 --bootstrap-server 192.168.1.101:9092
六、Zookeeper 模式部署(兼容 JDK 17)
若需使用 Zookeeper 模式,步骤与常规部署一致,但需注意:
- Zookeeper 3.8.0 及以上正式支持 JDK 17(推荐使用 Zookeeper 3.8.2);
- 若使用 Kafka 内置 Zookeeper(kafka_2.13-3.6.1 内置 Zookeeper 3.8.1,支持 JDK 17),无需额外调整,仅需配置
zookeeper.properties并启动即可。
七、JDK 17 下的常见问题与注意事项
- 模块化限制 :JDK 17 为模块化系统(JPMS),Kafka 已适配模块化,无需手动添加
--add-modules参数(Kafka 启动脚本已处理); - SSL/TLS 配置 :JDK 17 默认禁用 TLS 1.0/1.1,若 Kafka 配置 SSL/TLS,需确保使用 TLS 1.2+(在
server.properties中配置ssl.protocol=TLSv1.2或TLSv1.3); - 权限问题 :JDK 17 加强了文件系统权限,Kafka 的日志目录、数据目录需确保运行用户有读写权限(建议创建普通用户
kafka运行 Kafka,避免 root 用户); - JVM 参数废弃 :移除 JDK 17 中废弃的 JVM 参数(如
-XX:+UseCMSInitiatingOccupancyOnly、-XX:+UseParNewGC等),否则启动时会报错; - Kafka 版本兼容性:避免使用 Kafka 3.2.0 及以下版本(实验性支持 JDK 17,可能存在兼容性问题),优先选择 3.3.0 + 稳定版本。
八、停止 Kafka 服务
bash
cd /usr/local/kafka
bin/kafka-server-stop.sh
以上为基于 JDK 17 的 Kafka 部署完整流程,重点关注版本兼容性和 JVM 参数调整,其余步骤与常规部署一致。生产环境中,建议结合 Kafka 官方文档和 JDK 17 的特性优化配置,以提升性能和稳定性。