JDK17下Kafka部署全指南

基于 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_OPTSKAFKA_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 ):

    bash 复制代码
    bin/kafka-storage.sh format -t d4e2f8a0-1b3c-4d5e-6f7g-8h9i0j1k2l3m -c config/kraft/server.properties
  • 每个节点启动 Kafka:

    bash 复制代码
    bin/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 下的常见问题与注意事项

  1. 模块化限制 :JDK 17 为模块化系统(JPMS),Kafka 已适配模块化,无需手动添加--add-modules参数(Kafka 启动脚本已处理);
  2. SSL/TLS 配置 :JDK 17 默认禁用 TLS 1.0/1.1,若 Kafka 配置 SSL/TLS,需确保使用 TLS 1.2+(在server.properties中配置ssl.protocol=TLSv1.2TLSv1.3);
  3. 权限问题 :JDK 17 加强了文件系统权限,Kafka 的日志目录、数据目录需确保运行用户有读写权限(建议创建普通用户kafka运行 Kafka,避免 root 用户);
  4. JVM 参数废弃 :移除 JDK 17 中废弃的 JVM 参数(如-XX:+UseCMSInitiatingOccupancyOnly-XX:+UseParNewGC等),否则启动时会报错;
  5. 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 的特性优化配置,以提升性能和稳定性。

相关推荐
yqj2344 小时前
kafka使用教程
kafka
BullSmall5 小时前
MinIO分布式存储实战指南
分布式
回家路上绕了弯5 小时前
数据模型设计实战指南:从业务到落地的全流程方法论
分布式·后端
吃好喝好玩好睡好5 小时前
OpenHarmony 分布式环境下 Electron+Flutter 应用的增量更新设计
分布式·flutter·eclipse·electron
西***63475 小时前
人机分离・全域互联!分布式 KVM 坐席系统:应急指挥与多领域管控的硬核支撑
分布式
爬山算法5 小时前
Redis(170)如何使用Redis实现分布式限流?
数据库·redis·分布式
Macbethad5 小时前
WPF工业设备远程控制程序技术方案
分布式·wpf
8Qi85 小时前
Redis之Lua脚本与分布式锁改造
java·redis·分布式·lua
明月出天山_6 小时前
【金融科技理论与实践】常见知识点汇总——北大软微期末考复习
分布式·科技·金融·区块链·智能合约