3 min read

Kafka kraft 模式非容器化部署

Kafka kraft  模式非容器化部署

版本

  • OpenJDK:jdk-17.0.17+10
  • Kafka:3.9.1

配置JDK环境

直接将包解压并创建软链接

tar acvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.17_10.tar.gz -C /usr/local
cd /usr/local && ln -svf /usr/local/jdk-17.0.17+10 jdk

设置系统环境变量

cat >/etc/profile.d/java.sh<<EOF
export PATH=\$PATH:/usr/local/jdk/bin
EOF

完成验证如下:

$ java -version
openjdk version "17.0.17" 2025-10-21
OpenJDK Runtime Environment Temurin-17.0.17+10 (build 17.0.17+10)
OpenJDK 64-Bit Server VM Temurin-17.0.17+10 (build 17.0.17+10, mixed mode, sharing)

安装Kafka

下载并解压

tar axvf kafka_2.13-3.9.1.tgz -C /usr/local
cd /usr/local && ln -svf kafka_2.13-3.9.1 kafka

配置Kafka环境

单点配置

适用于开发、测试环境。

编辑 /usr/local/kafka/config/kraft/server.properties配置文件,内容如下:

process.roles=broker,controller

node.id=41

controller.quorum.voters=41@110.10.2.41

# 监听节点所有网卡
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093

# 客户端连接时使用的地址。必须设置为客户端能从其网络环境访问到的地址(如公网IP、域名、主机名),不填写将继承listeners
advertised.listeners=PLAINTEXT://110.10.2.41:9092

inter.broker.listener.name=PLAINTEXT
controller.listener.names=CONTROLLER

listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

num.partitions=1
num.recovery.threads.per.data.dir=1
num.network.threads=3
num.io.threads=8

offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

log.dirs=/data/kafka
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

集群配置

适用于生产环境。

编辑 /usr/local/kafka/config/kraft/server.properties配置文件,内容如下:

process.roles=broker,controller

node.id=41

controller.quorum.voters=41@110.10.2.41:9093,42@110.10.2.42:9093,43@110.10.2.43:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

inter.broker.listener.name=PLAINTEXT

advertised.listeners=PLAINTEXT://110.10.2.41:9092

controller.listener.names=CONTROLLER

listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

num.partitions=3
num.recovery.threads.per.data.dir=1
num.network.threads=3
num.io.threads=8

# 复制因子和ISR配置
default.replication.factor=3
min.insync.replicas=2

# 领导均衡
auto.leader.rebalance.enable=true
leader.imbalance.per.broker.percentage=10
leader.imbalance.check.interval.seconds=300

offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2

log.dirs=/data/kafka
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

初始化集群数据

生成UUID

$ bin/kafka-storage.sh random-uuid
s9xNEMd-QkeBCwmMkyXwCw

创建数据目录

# install -d -o vqiu -g vqiu /data/kafka

初始化数据目录

$ bin/kafka-storage.sh format -t s9xNEMd-QkeBCwmMkyXwCw  -c /usr/local/kafka/config/kraft/server.properties
如果为集群,每节点都需要执行。

添加环境变量

cat >/etc/profile.d/kafka.sh<<EOF
export KAFKA_HOME=/usr/local/kafka
export PATH=\$PATH:${KAFKA_HOME}/bin
EOF

使用systemd来控制kafka

cat  >/usr/lib/systemd/system/kafka.service<<EOF
[Unit]
Description=Apache Kafka server with Kraft mode
Documentation=http://kafka.apache.org/documentation.html
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=vqiu
Group=vqiu
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=1048576
Environment=JAVA_HOME=/usr/local/jdk
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh \
          /usr/local/kafka/config/kraft/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target
EOF

检查 Kafka 是否正在运行:

jcmd | grep kafka

查看集群全景

  1. 列出集群中所有的 Broker 节点(这是首要检查项)
kafka-broker-api-versions.sh --bootstrap-server <当前节点IP>:9092

2.查看所有 Topic 的详细状态(分区、副本、Leader分布)

bin/kafka-topics.sh --bootstrap-server <当前节点IP>:9092 --describe

关于堆内存分配

默认通常只分配1G大小,如果需要额外分配JVM 堆内存,可以编辑 bin/kafka-server-start.sh 文件。