仅使用Broker角色配置KRaft模式Kafka时遇错误求解决
修复KRaft模式单节点Kafka的Docker Compose配置
问题根源
你遇到的ConfigException是因为controller.quorum.voters的格式不符合KRaft规范:该配置必须遵循node_id@controller_host:controller_port的格式,而你仅填写"1",无法被解析。另外,仅设置process.roles=broker需要依赖独立的Controller集群,但单节点测试场景下,更高效的方式是让单个节点同时承担Broker和Controller角色。
修复后的完整配置
services: kafka: image: confluentinc/cp-kafka:7.4.0 container_name: kafka environment: KAFKA_KRAFT_MODE: "true" # 单节点同时承担Broker和Controller角色,适配测试场景 KAFKA_PROCESS_ROLES: broker,controller KAFKA_NODE_ID: 1 # 修正投票节点格式:node_id@容器名:controller专属端口 KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka:9093" # 新增Controller监听端口,与Broker端口区分 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 # 定义监听器与安全协议的映射关系 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT # 指定Controller使用的监听器名称 KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER # 测试场景可自定义集群ID,生产环境建议用`kafka-storage.sh random-uuid`生成有效ID CLUSTER_ID: my-cluster-id ports: - 9092:9092 schema-registry: image: confluentinc/cp-schema-registry:7.4.0 container_name: schema-registry environment: SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka:9092 SCHEMA_REGISTRY_HOST_NAME: schema-registry ports: - 8081:8081 depends_on: - kafka postgres: image: postgres:15 container_name: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: hotel_db ports: - 5432:5432
关键修改说明
KAFKA_PROCESS_ROLES:改为broker,controller,让单节点同时处理两种角色,无需额外启动独立Controller容器,适配测试需求。KAFKA_CONTROLLER_QUORUM_VOTERS:修正为1@kafka:9093,符合KRaft投票节点的解析格式,其中kafka是容器名称,9093为新增的Controller专属通信端口。- 监听器配置:新增
CONTROLLER类型监听器,与Broker的PLAINTEXT监听器做端口隔离;通过KAFKA_LISTENER_SECURITY_PROTOCOL_MAP和KAFKA_CONTROLLER_LISTENER_NAMES明确Controller的通信规则。 depends_on:为Schema Registry添加Kafka依赖,确保Kafka启动完成后再启动Schema Registry,避免连接失败。
验证启动有效性
启动后可进入Kafka容器执行以下命令验证:
docker exec -it kafka kafka-topics.sh --create --topic test-avro-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
若能成功创建主题,说明Kafka配置正常。之后即可使用Avro生产者/消费者连接localhost:9092,Schema Registry连接localhost:8081完成测试。
内容的提问来源于stack exchange,提问作者David Franco
相关产品推荐
相关产品推荐

