我需要 1 个 kafka 集群和 3 个 kraft 的 borker。 我尝试使用下面的 docker 配置:
第一个经纪人的配置:
version: "3"
services:
kafka-1:
image: "bitnami/kafka:3.4.0"
hostname: kafka-1
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=1
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-1:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-1:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9101:9092"
- "9102:9093"
- "9103:9094"
第二个经纪人的配置:
kafka-2:
image: "bitnami/kafka:3.4.0"
hostname: kafka-2
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=2
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=2@kafka-2:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-2:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-2:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9095:9092"
- "9096:9093"
- "9097:9094"
第三个经纪人的配置:
kafka-3:
image: "bitnami/kafka:3.4.0"
hostname: kafka-3
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=3
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka-3:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-3:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-3:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9098:9092"
- "9099:9093"
- "9100:9094"
所有配置都在同一个文件中。
当我运行这个 docker compose 时,我看到 3 个集群,而不是 1 个具有 3 个代理的集群。我如何配置以创建 1 个集群 kafka? 更正我的 Docker Compose 以获取 1 个集群
Tbh 我不知道您正在使用的这个 bitnami/kafka:3.4.0 Docker 映像,但我猜它有一些脚本来获取您列出的环境变量,并且它将为您做一些配置集群的工作(即从 KAFKA_KRAFT_CLUSTER_ID 环境变量开始格式化存储。 这么说吧,我猜错误是 KAFKA_CFG_CONTROLLER_QUORUM_VOTERS。 您只为每个配置列出一个代理,而它应该列出可能属于控制器仲裁的所有 3 个代理。 因此,对于所有这些,您应该有类似的内容: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9094,2@kafka-2:9094,3@kafka-3:9094。当然,这三个代理应该能够通过 newtwork 进行通信以使其正常工作(因此各种 kafka-X 应该可以通过 DNS 发现和寻址。我不使用 Docker Compose,也许它可以开箱即用)。
看起来您的配置大部分是正确的,但我注意到您错过了一条关键信息:KAFKA_CFG_NODE_ID。为了使 Quorum_voters 具有 3 个代理的功能,您需要为每个代理分配一个节点 ID。例如,broker-1 的节点 ID 应该为 1,broker-2 的节点 ID 应该为 2,broker-3 的节点 ID 应该为 3。
配置 Quorum 中的所有代理服务器非常重要,以便 Quorum 可以选举领导者。例如,您可以像这样配置代理服务器:bokerID1@hostname1:port、borkerID2@hostname2:port,等等。如果您没有正确配置仲裁,则只会有一个代理,并且您的 Quorum_voters 将无法按预期运行。 您的配置有 1 个集群和 3 个代理。对于创建多个集群,最后我已经提到了步骤。
使用 KRaft 模式在 Docker 中创建多个 Kafka 集群涉及为每个集群设置单独的 Docker Compose 配置,确保每个集群具有唯一的配置,包括不同的集群 ID、节点 ID、监听器配置和端口映射。这是分步指南:
这里是修改后的配置
docker-compose.yml
version: "3"
services:
kafka-1:
image: "bitnami/kafka:3.4.0"
container_name: kafka1
hostname: kafka-1
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=1
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9094,2@kafka-2:9094,3@kafka-3:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-1:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-1:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9101:9092"
- "9102:9093"
- "9103:9094"
kafka-2:
image: "bitnami/kafka:3.4.0"
hostname: kafka-2
container_name: kafka2
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=2
- KAFKA_CFG_NODE_ID=2
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9094,2@kafka-2:9094,3@kafka-3:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-2:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-2:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9095:9092"
- "9096:9093"
- "9097:9094"
kafka-3:
image: "bitnami/kafka:3.4.0"
hostname: kafka-3
container_name: kafka3
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=kraft:PLAINTEXT,CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT
- KAFKA_BROKER_ID=3
- KAFKA_CFG_NODE_ID=3
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9094,2@kafka-2:9094,3@kafka-3:9094
- ALLOW_PLAINTEXT_LISTENER=yes
- BITNAMI_DEBUG=yes
- KAFKA_KRAFT_CLUSTER_ID=OTMwNzFhYTY1ODNiNGE5OT
- KAFKA_CFG_KRAFT_REPLICATION_FACTOR=3
- KAFKA_CFG_ADVERTISED_LISTENERS=kraft://:9093,INTERNAL://kafka-3:9092
- KAFKA_CFG_LISTENERS=kraft://:9093,CONTROLLER://kafka-3:9094,INTERNAL://:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
ports:
- "9098:9092"
- "9099:9093"
- "9100:9094"
创建 Docker Compose 文件:对于每个 Kafka 集群,创建一个单独的 Docker Compose 文件(例如 docker-compose-cluster1.yml、docker-compose-cluster2.yml 等)。 配置 Kafka Brokers: 在每个 Docker Compose 文件中,使用独特的配置定义 Kafka Broker 服务,包括: 主机名:为每个代理设置唯一的主机名。 KAFKA_KRAFT_CLUSTER_ID:为每个集群分配唯一的集群ID。 KAFKA_CFG_NODE_ID: 确保集群中的每个代理都有唯一的节点 ID。 ports:将Kafka端口映射到主机端口,确保每个集群使用唯一的主机端口。 监听器配置: 为每个集群配置监听器配置(KAFKA_CFG_LISTENERS 和 KAFKA_CFG_ADVERTISED_LISTENERS),以允许客户端连接到集群内的代理。 数据目录:为每个集群指定单独的数据目录(log.dirs),以独立存储其主题和分区。 启动 Docker 容器:为每个 Kafka 集群运行 Docker Compose 文件来启动容器。