使用Docker Compose部署多节点KRaft模式Kafka失败:元数据文件写入错误
Docker Compose部署多节点KRaft模式Kafka集群失败问题
尝试用Docker Compose部署采用KRaft共识协议的多节点Kafka集群,每个节点(kafka-1、kafka-2、kafka-3)均配置为controller+broker角色(KAFKA_CFG_PROCESS_ROLES=controller,broker),并定义了对应的listeners和advertised listeners。但启动时kafka-2和kafka-3出现元数据文件写入错误(Error while writing meta.properties file),导致节点以代码1退出,无法完成初始化。单节点(kafka-1)部署可正常运行,说明问题仅存在于多节点KRaft模式的Docker Compose配置中。
原配置文件
docker-compose.yml
version: '3.8' services: kafka-1: image: bitnami/kafka:latest user: 'root' ports: - "9092:9092" environment: - KAFKA_CFG_NODE_ID=1 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9092 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-1:9090,EXTERNAL://${HOSTNAME:-localhost}:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data:/bitnami/kafka kafka-2: image: bitnami/kafka:latest user: 'root' ports: - "9094:9094" environment: - KAFKA_CFG_NODE_ID=2 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9094 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-2:9090,EXTERNAL://${HOSTNAME:-localhost}:9094 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data:/bitnami/kafka kafka-3: image: bitnami/kafka:latest user: 'root' ports: - "9096:9096" environment: - KAFKA_CFG_NODE_ID=3 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9096 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-3:9090,EXTERNAL://${HOSTNAME:-localhost}:9096 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data:/bitnami/kafka volumes: kafka-data:
environment.env
HOSTNAME=host.docker.internal
错误日志
kafka-1_1 | kafka 22:33:12.35 INFO ==> Formatting storage directories to add metadata... kafka-3_1 | metaPropertiesEnsemble=MetaPropertiesEnsemble(metadataLogDir=Optional.empty, dirs={/bitnami/kafka/data: EMPTY}) kafka-3_1 | Formatting /bitnami/kafka/data with metadata.version 3.7-IV4. kafka-2_1 | metaPropertiesEnsemble=MetaPropertiesEnsemble(metadataLogDir=Optional.empty, dirs={/bitnami/kafka/data: EMPTY}) kafka-2_1 | Formatting /bitnami/kafka/data with metadata.version 3.7-IV4. kafka-1_1 | metaPropertiesEnsemble=MetaPropertiesEnsemble(metadataLogDir=Optional.empty, dirs={/bitnami/kafka/data: EMPTY}) kafka-1_1 | Formatting /bitnami/kafka/data with metadata.version 3.7-IV4. kafka-3_1 | Error while writing meta.properties file /bitnami/kafka/data: /bitnami/kafka/data/bootstrap.checkpoint.tmp kafka-2_1 | Error while writing meta.properties file /bitnami/kafka/data: /bitnami/kafka/data/bootstrap.checkpoint.tmp kafka-1_1 | kafka 22:33:14.22 INFO ==> ** Kafka setup finished! ** kafka-1_1 | kafka-1_1 | kafka 22:33:14.24 INFO ==> ** Starting Kafka ** architecture-experiments_kafka-2_1 exited with code 1 architecture-experiments_kafka-3_1 exited with code 1
执行命令
docker-compose --env-file environment.env up
问题原因
三个Kafka节点共享了同一个kafka-data卷,导致多个节点同时向同一个文件路径写入元数据文件,引发文件锁冲突或写入覆盖,这是kafka-2和kafka-3写入失败的直接原因。单节点部署时没有竞争,因此可以正常运行。
解决方案
为每个Kafka节点分配独立的存储卷,避免文件写入冲突。修改后的配置如下:
修改后的docker-compose.yml
version: '3.8' services: kafka-1: image: bitnami/kafka:latest user: 'root' ports: - "9092:9092" environment: - KAFKA_CFG_NODE_ID=1 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9092 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-1:9090,EXTERNAL://${HOSTNAME:-localhost}:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data-1:/bitnami/kafka kafka-2: image: bitnami/kafka:latest user: 'root' ports: - "9094:9094" environment: - KAFKA_CFG_NODE_ID=2 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9094 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-2:9090,EXTERNAL://${HOSTNAME:-localhost}:9094 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data-2:/bitnami/kafka kafka-3: image: bitnami/kafka:latest user: 'root' ports: - "9096:9096" environment: - KAFKA_CFG_NODE_ID=3 - KAFKA_KRAFT_CLUSTER_ID=WnLkTHhk - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9096 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-3:9090,EXTERNAL://${HOSTNAME:-localhost}:9096 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENERS_NAME=PLAINTEXT volumes: - kafka-data-3:/bitnami/kafka volumes: kafka-data-1: kafka-data-2: kafka-data-3:
操作步骤
- 停止并删除现有容器和共享卷:
docker-compose down -v
- 使用修改后的配置重新启动集群:
docker-compose --env-file environment.env up
内容的提问来源于stack exchange,提问作者Mateus Levi
相关产品推荐
相关产品推荐

