无zookeeper Kafka 4.1.0 Raft 集群搭建 - 实践

Kafka 4.1.0 彻底遗弃zookeeper, 亲测,避坑,三节点集群搭建。

系统:buntu 24.04.3 LTS
JDK:jdk-17.0.12

一、下载软件
下载 Kafka 4.1.0 二进制包,解压到目标目录

wget https://archive.apache.org/dist/kafka/4.1.0/kafka_2.13-4.1.0.tgz
tar -xzf kafka_2.13-4.1.0.tgz -C /apps

二、Raft集群规划
实现高可用,集群若允许N个controller失败,则需要2N+1个controller组成集群。下面搭建一个3节点的Kafka集群,3个controller,3个broker。Controller的ID从1000起编,配置端口号为9093 。Broker的ID从2000起编,配置端口号为9092。

角色	ID	IP	端口
Controller	1000	192.168.2.24	9093
Controller	1001	192.168.2.25	9093
Controller	1002	192.168.2.26	9093
Broker	2000	192.168.2.24	9092
Broker	2001	192.168.2.25	9092
Broker	2002	192.168.2.26	9092

三、配置环境变量

3.1、JDK下载
(略)

3.2、配置变量

vim /etc/profile
export JAVA_HOME=/apps/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH

使配置生效

source /etc/profile

四、集群配置
以下为192.168.2.24节点的controller和broker的部分配置。其他节点按规划修改node.id,listeners,advertised.listeners的内容,参看如下配置

4.1 修改controller配置
路径:conf/controller.properties

process.roles=controller
node.id=1000
listeners=CONTROLLER://192.168.2.24:9093
advertised.listeners=CONTROLLER://192.168.2.24:9093
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-controller-logs

查看修改后的配置

root@ops-test-024:/apps/kafka_2.13-4.1.0/config# grep -v '^#' controller.properties
process.roles=controller
node.id=1000
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
listeners=CONTROLLER://192.168.2.24:9093
advertised.listeners=CONTROLLER://192.168.2.24:9093
controller.listener.names=CONTROLLER
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-controller-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
share.coordinator.state.topic.replication.factor=1
share.coordinator.state.topic.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
root@ops-test-024:/apps/kafka_2.13-4.1.0/config#

4.2 修改broker配置
路径:conf/broker.properties

process.roles=broker
node.id=2000
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
listeners=PLAINTEXT://192.168.2.24:9092
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://192.168.2.24:9092
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-broker-logs

查看修改后的配置

root@ops-test-024:/apps/kafka_2.13-4.1.0/config# grep -v '^#' broker.properties
process.roles=broker
node.id=2000
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
listeners=PLAINTEXT://192.168.2.24:9092
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://192.168.2.24:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-broker-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
share.coordinator.state.topic.replication.factor=1
share.coordinator.state.topic.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
root@ops-test-024:/apps/kafka_2.13-4.1.0/config#

4.3 、第二个节点的配置
Controller 配置 (conf/controller.properties)

process.roles=controller
node.id=1001
listeners=CONTROLLER://192.168.2.25:9093
advertised.listeners=CONTROLLER://192.168.2.25:9093
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-controller-logs

Broker 配置 (conf/broker.properties)

process.roles=broker
node.id=2001
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
listeners=PLAINTEXT://192.168.2.25:9092
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://192.168.2.25:9092
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-broker-logs

4.4 、第三个节点的配置
Controller 配置 (conf/controller.properties)

process.roles=controller
node.id=1002
listeners=CONTROLLER://192.168.2.26:9093
advertised.listeners=CONTROLLER://192.168.2.26:9093
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-controller-logs

Broker 配置 (conf/broker.properties)

process.roles=broker
node.id=2002
controller.quorum.bootstrap.servers=192.168.2.24:9093,192.168.2.25:9093,192.168.2.26:9093
listeners=PLAINTEXT://192.168.2.26:9092
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://192.168.2.26:9092
controller.listener.names=CONTROLLER
log.dirs=/apps/kafka_2.13-4.1.0/data/kraft-broker-logs

五、部署操作
Kafka kraft集群建议从1个controller搭建起,搭完后再通过add-controller的方式将controller扩展为3节点。步骤如下:

5.1、生成集群cluster-id

bin/kafka-storage.sh random-uuid
0VMe9kUwROS-0fcQn-0yzg

5.2、Standalone controller部署
在节点192.168.2.24上,使用cluster-id格式化controller目录。

bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --standalone --config config/controller.properties

执行结果:

root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --standalone --config config/controller.properties
Formatting dynamic metadata voter directory /apps/kafka_2.13-4.1.0/data/kraft-controller-logs with metadata.version 4.1-IV1.
root@ops-test-024:/apps/kafka_2.13-4.1.0#

格式化成功,会在controller的log.dir中生成集群元数据。

root@ops-test-024:/apps/kafka_2.13-4.1.0# ls -l data/kraft-controller-logs
total 12
drwxr-xr-x 2 root root 4096 Nov  3 15:43 __cluster_metadata-0
-rw-r--r-- 1 root root  355 Nov  3 15:43 bootstrap.checkpoint
-rw-r--r-- 1 root root  125 Nov  3 15:43 meta.properties
root@ops-test-024:/apps/kafka_2.13-4.1.0#

启动contoller

bin/kafka-server-start.sh -daemon config/controller.properties

查看controller日志确认节点运行正常

root@ops-test-024:/apps/kafka_2.13-4.1.0# tail -f logs/controller.log
[2025-11-03 16:16:49,135] INFO [QuorumController id=1000] Replayed a FeatureLevelRecord setting metadata.version to 4.1-IV1 (org.apache.kafka.controller.FeatureControlManager)
[2025-11-03 16:16:49,136] INFO [QuorumController id=1000] Replayed a FeatureLevelRecord setting feature eligible.leader.replicas.version to 1 (org.apache.kafka.controller.FeatureControlManager)
[2025-11-03 16:16:49,136] INFO [QuorumController id=1000] Replayed a FeatureLevelRecord setting feature group.version to 1 (org.apache.kafka.controller.FeatureControlManager)
[2025-11-03 16:16:49,137] INFO [QuorumController id=1000] Replayed a FeatureLevelRecord setting feature transaction.version to 2 (org.apache.kafka.controller.FeatureControlManager)
[2025-11-03 16:16:49,137] INFO [QuorumController id=1000] Replayed ConfigRecord for ConfigResource(type=BROKER, name='') which set configuration min.insync.replicas to 1 (org.apache.kafka.controller.ConfigurationControlManager)
[2025-11-03 16:16:49,137] INFO [QuorumController id=1000] Replayed EndTransactionRecord() at offset 9. (org.apache.kafka.controller.OffsetControlManager)
[2025-11-03 16:16:49,212] INFO [QuorumController id=1000] Becoming the active controller at epoch 2, next write offset 3825. (org.apache.kafka.controller.QuorumController)
[2025-11-03 16:16:49,219] WARN [QuorumController id=1000] Performing controller activation. (org.apache.kafka.controller.QuorumController)
[2025-11-03 16:16:49,224] INFO [QuorumController id=1000] Activated periodic tasks: electPreferred, electUnclean, expireDelegationTokens, generatePeriodicPerformanceMessage, maybeFenceStaleBroker, writeNoOpRecord (org.apache.kafka.controller.PeriodicTaskControlManager)
[2025-11-03 16:16:49,413] INFO [QuorumController id=1000] Replayed RegisterControllerRecord containing ControllerRegistration(id=1000, incarnationId=Nbj6HR7ASSysBoXkTX7y3w, zkMigrationReady=false, listeners=[Endpoint(listenerName='CONTROLLER', securityProtocol=PLAINTEXT, host='192.168.2.24', port=9093)], supportedFeatures={eligible.leader.replicas.version: 0-1, group.version: 0-1, kraft.version: 0-1, metadata.version: 7-27, share.version: 0-1, transaction.version: 0-2}). (org.apache.kafka.controller.ClusterControlManager)
[2025-11-03 16:17:13,889] INFO [QuorumController id=1000] No previous registration found for broker 2000. New incarnation ID is 5usoWUoIQDq8w68c0Bp3GA.  Generated 0 record(s) to clean up previous incarnations. New broker epoch is 3875. (org.apache.kafka.controller.ClusterControlManager)
[2025-11-03 16:17:13,906] INFO [QuorumController id=1000] Replayed initial RegisterBrokerRecord for broker 2000: RegisterBrokerRecord(brokerId=2000, isMigratingZkBroker=false, incarnationId=5usoWUoIQDq8w68c0Bp3GA, brokerEpoch=3875, endPoints=[BrokerEndpoint(name='PLAINTEXT', host='192.168.2.24', port=9092, securityProtocol=0)], features=[BrokerFeature(name='group.version', minSupportedVersion=0, maxSupportedVersion=1), BrokerFeature(name='kraft.version', minSupportedVersion=0, maxSupportedVersion=1), BrokerFeature(name='metadata.version', minSupportedVersion=7, maxSupportedVersion=27), BrokerFeature(name='share.version', minSupportedVersion=0, maxSupportedVersion=1), BrokerFeature(name='transaction.version', minSupportedVersion=0, maxSupportedVersion=2), BrokerFeature(name='eligible.leader.replicas.version', minSupportedVersion=0, maxSupportedVersion=1)], rack=null, fenced=true, inControlledShutdown=false, logDirs=[wLuTIWTiCkk9DBgKqj1wGQ]) (org.apache.kafka.controller.ClusterControlManager)

5.2、Kafka broker集群部署
在节点192.168.2.24上,使用cluster-id格式化broker目录。

bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --config config/broker.properties
root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --config config/broker.properties
Formatting metadata directory /apps/kafka_2.13-4.1.0/data/kraft-broker-logs with metadata.version 4.1-IV1.
root@ops-test-024:/apps/kafka_2.13-4.1.0#

格式化成功后在对应目录中生成元数据文件

root@ops-test-024:/apps/kafka_2.13-4.1.0# ls -l data/kraft-broker-logs
total 8
-rw-r--r-- 1 root root 355 Nov  3 15:48 bootstrap.checkpoint
-rw-r--r-- 1 root root 125 Nov  3 15:48 meta.properties
root@ops-test-024:/apps/kafka_2.13-4.1.0#

启动broker 2000
bin/kafka-server-start.sh -daemon config/broker.properties

root@ops-test-024:/apps/kafka_2.13-4.1.0# tail logs/server.log
[2025-11-03 16:17:14,385] INFO Awaiting socket connections on 192.168.2.24:9092. (kafka.network.DataPlaneAcceptor)
[2025-11-03 16:17:14,405] INFO [BrokerServer id=2000] Waiting for all of the authorizer futures to be completed (kafka.server.BrokerServer)
[2025-11-03 16:17:14,405] INFO [BrokerServer id=2000] Finished waiting for all of the authorizer futures to be completed (kafka.server.BrokerServer)
[2025-11-03 16:17:14,405] INFO [BrokerServer id=2000] Waiting for all of the SocketServer Acceptors to be started (kafka.server.BrokerServer)
[2025-11-03 16:17:14,405] INFO [BrokerServer id=2000] Finished waiting for all of the SocketServer Acceptors to be started (kafka.server.BrokerServer)
[2025-11-03 16:17:14,406] INFO [BrokerServer id=2000] Transition from STARTING to STARTED (kafka.server.BrokerServer)
[2025-11-03 16:17:14,407] INFO Kafka version: 4.1.0 (org.apache.kafka.common.utils.AppInfoParser)
[2025-11-03 16:17:14,407] INFO Kafka commitId: 13f70256db3c994c (org.apache.kafka.common.utils.AppInfoParser)
[2025-11-03 16:17:14,407] INFO Kafka startTimeMs: 1762157834406 (org.apache.kafka.common.utils.AppInfoParser)
[2025-11-03 16:17:14,408] INFO [KafkaRaftServer nodeId=2000] Kafka Server started (kafka.server.KafkaRaftServer)
root@ops-test-024:/apps/kafka_2.13-4.1.0#

如上broker启动正常后,在其他两个节点以同样的步骤启动broker 2001,2002.

第二节点:
格式化broker metadata

bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --config config/broker.properties

启动broker 2001

bin/kafka-server-start.sh -daemon config/broker.properties

第三节点:
格式化broker metadata

bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --config config/broker.properties

启动broker 2002

bin/kafka-server-start.sh -daemon config/broker.properties

5.3、查看集群状态
bin/kafka-cluster.sh list-endpoints --bootstrap-server 192.168.2.24:9092

root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-cluster.sh list-endpoints --bootstrap-server 192.168.2.24:9092
ID         HOST         PORT       RACK       STATE      ENDPOINT_TYPE
2000       192.168.2.24 9092       null       unfenced   broker
2001       192.168.2.25 9092       null       unfenced   broker
2002       192.168.2.26 9092       null       unfenced   broker
root@ops-test-024:/apps/kafka_2.13-4.1.0#

5.4 Controller集群扩展
目前为止,搭建了1个controller + 3个broker的kafka集群,现在需要将kafka controller扩展为3个。

5.4.1 扩展节点(节点上执行)
需要扩展的节点上,执行以下命令格式化controller。注意增加了 --no-initial-controllers。

bin/kafka-storage.sh format --cluster-id MCg3e_6pSYumFqhbyt6mKA --config config/controller.properties --no-initial-controllers

格式化成功后启动controller。

bin/kafka-server-start.sh -daemon config/controller.properties

5。4.2、查看状态:
启动成功后查看新controller开始与主controller同步元数据,通过以下命令查看同步状态。当lag为0时表示同步到最新,此时controller的状态为Observer。

root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-metadata-quorum.sh --bootstrap-controller 192.168.2.24:9093 describe --replication
NodeId  DirectoryId             LogEndOffset    Lag     LastFetchTimestamp      LastCaughtUpTimestamp   Status
1000    WQdEjHlJSMiyrdItFp5zLQ  8439            0       1762160113112           1762160113112           Leader
2001    LSWHR4qpGQdD0qaDRmPGjQ  8439            0       1762160112814           1762160112814           Observer
1002    rjimKsPznfm-I-O9sWschw  0               8439    1762159816017           -1                      Observer
2000    wLuTIWTiCkk9DBgKqj1wGQ  8439            0       1762160112814           1762160112814           Observer
2002    qu2706Ym7QbnH-PUGAyYTg  8439            0       1762160112819           1762160112819           Observer
1001    QwOwk7fyIninpdmLCQouPA  8439            0       1762160112815           1762160112815           Observer
root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-metadata-quorum.sh --bootstrap-controller 192.168.2.24:9093 describe --replication
NodeId  DirectoryId             LogEndOffset    Lag     LastFetchTimestamp      LastCaughtUpTimestamp   Status
1000    WQdEjHlJSMiyrdItFp5zLQ  8510            0       1762160148617           1762160148617           Leader
2001    LSWHR4qpGQdD0qaDRmPGjQ  8510            0       1762160148324           1762160148324           Observer
2000    wLuTIWTiCkk9DBgKqj1wGQ  8510            0       1762160148324           1762160148324           Observer
2002    qu2706Ym7QbnH-PUGAyYTg  8510            0       1762160148326           1762160148326           Observer
1001    QwOwk7fyIninpdmLCQouPA  8510            0       1762160148325           1762160148325           Observer
root@ops-test-024:/apps/kafka_2.13-4.1.0#

5.4.3、节点conttroller加入到controller集群中
新controller同步元数据后,将其正式加入到controller集群中。

分别在在新加的controller节点上执行

bin/kafka-metadata-quorum.sh --command-config config/controller.properties --bootstrap-controller 192.168.2.24:9093 add-controller
root@ops-test-025:/apps/kafka_2.13-4.1.0# bin/kafka-metadata-quorum.sh --command-config config/controller.properties --bootstrap-controller 192.168.2.24:9093 add-controller
Added controller 1001 with directory id QwOwk7fyIninpdmLCQouPA and endpoints: CONTROLLER://192.168.2.25:9093
root@ops-test-025:/apps/kafka_2.13-4.1.0#

5.4.4、查看controller的状态

bin/kafka-metadata-quorum.sh --bootstrap-controller 192.168.2.24:9093 describe --replication

加入成功后,controller会变成follower。

root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-metadata-quorum.sh --bootstrap-controller 192.168.2.24:9093 describe --replication
NodeId  DirectoryId             LogEndOffset    Lag     LastFetchTimestamp      LastCaughtUpTimestamp   Status
1000    WQdEjHlJSMiyrdItFp5zLQ  12572           0       1762162177937           1762162177937           Leader
1001    QwOwk7fyIninpdmLCQouPA  12572           0       1762162177787           1762162177787           Follower
1002    rjimKsPznfm-I-O9sWschw  12572           0       1762162177789           1762162177789           Follower
2001    LSWHR4qpGQdD0qaDRmPGjQ  12572           0       1762162177787           1762162177787           Observer
2000    wLuTIWTiCkk9DBgKqj1wGQ  12572           0       1762162177787           1762162177787           Observer
2002    qu2706Ym7QbnH-PUGAyYTg  12572           0       1762162177788           1762162177788           Observer
root@ops-test-024:/apps/kafka_2.13-4.1.0#

至此Kafka kraft集群搭建完毕。

六、验证使用
6.1 创建topic

bin/kafka-topics.sh --bootstrap-server 192.168.2.24:9092 --create --topic nierdayede --partitions 3 --replication-factor 1
root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-topics.sh --bootstrap-server 192.168.2.24:9092 --create --topic nierdayede --partitions 3 --replication-factor 1
Created topic nierdayede.
root@ops-test-024:/apps/kafka_2.13-4.1.0#

6.2 生产消息

bin/kafka-console-producer.sh --bootstrap-server 192.168.2.24:9092 --topic nierdayede

6.3 消费消息

bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.24:9092 --topic nierdayede --from-beginning

结果展示:

root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-topics.sh --bootstrap-server 192.168.2.24:9092 --create --topic nierdayede --partitions 3 --replication-factor 1
Created topic nierdayede.
root@ops-test-024:/apps/kafka_2.13-4.1.0# bin/kafka-console-producer.sh --bootstrap-server 192.168.2.24:9092 --topic nierdayede
>haha
>^Croot@ops-test-024:/apps/kafka_2.13-4.1.bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.24:9092 --topic nierdayede --from-beginninging
haha

七,页面查看

开源工具:Kafdrop

docker run -d -p 9000:9000 \
  -e KAFKA_BROKERCONNECT=192.168.2.24:9092,192.168.2.25:9092,192.168.2.26:9092 \
  obsidiandynamics/kafdrop

访问查看
http://192.168.2.252:9000/
在这里插入图片描述

八,问题排查

生成集群cluster-id

bin/kafka-storage.sh random-uuid
0VMe9kUwROS-0fcQn-0yzg

----这里遇到一个问题–

jdk版本用的是17.0.2

root@ops-test-024:/apps/kafka_2.13-4.1.0/bin# ./kafka-storage.sh random-uuid
java.lang.NullPointerException: Cannot invoke "jdk.internal.platform.CgroupInfo.getMountPoint()" because "anyController" is null
        at java.base/jdk.internal.platform.cgroupv2.CgroupV2Subsystem.getInstance(CgroupV2Subsystem.java:81)
        at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:113)
        at java.base/jdk.internal.platform.CgroupMetrics.getInstance(CgroupMetrics.java:167)
        at java.base/jdk.internal.platform.SystemMetrics.instance(SystemMetrics.java:29)
        at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:58)
        at java.base/jdk.internal.platform.Container.metrics(Container.java:43)
        at jdk.management/com.sun.management.internal.OperatingSystemImpl.(OperatingSystemImpl.java:182)
        at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl.getOperatingSystemMXBean(PlatformMBeanProviderImpl.java:280)
        at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl$3.nameToMBeanMap(PlatformMBeanProviderImpl.java:199)
        at java.management/java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$0(ManagementFactory.java:488)
        at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at java.management/java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:489)
        at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.startLocalConnectorServer(ConnectorBootstrap.java:543)
        at jdk.management.agent/jdk.internal.agent.Agent.startLocalManagementAgent(Agent.java:318)
        at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:450)
        at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:599)
Exception thrown by the agent : java.lang.NullPointerException: Cannot invoke "jdk.internal.platform.CgroupInfo.getMountPoint()" because "anyController" is null
root@ops-test-024:/apps/kafka_2.13-4.1.0/bin# java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)

解析:
OpenJDK 官方 Bug:
Bug ID: JDK-8287073: “NPE from CgroupV2Subsystem.getInstance()”。
bugs.openjdk.org
描述:在 Linux 上,当 cgroup v2 的 “anyController” 为空时,JDK 在 CgroupV2Subsystem.getInstance() 会抛 NPE。
bugs.openjdk.org
影响版本:JDK 11.0.16, 17.0.3, 18.0.2, 19 等。
bugs.openjdk.org
修复版本:列出为 “Fixed” in build b25 等。
bugs.openjdk.org
意义:说明该异常是 JDK 本身在处理容器/cgroup 情况下的缺陷,而非 Kafka 专属

替换为17.0.12版本 执行成功

root@ops-test-024:/apps/kafka_2.13-4.1.0/bin# java -version
java version "17.0.12" 2024-07-16 LTS
Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)
root@ops-test-024:/apps/kafka_2.13-4.1.0/bin# ./kafka-storage.sh random-uuid
MCg3e_6pSYumFqhbyt6mKA
root@ops-test-024:/apps/kafka_2.13-4.1.0/bin#
posted @ 2025-12-06 19:15  clnchanpin  阅读(62)  评论(0)    收藏  举报