Kafka 3.4,带有 Kraft,没有 Zookeeper,有 3 个经纪人

问题描述 投票:0回答:2

我需要 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 个集群

apache-kafka docker-compose kafka-consumer-api bitnami-kafka
2个回答
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,也许它可以开箱即用)。


0
投票

看起来您的配置大部分是正确的,但我注意到您错过了一条关键信息: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 文件来启动容器。

© www.soinside.com 2019 - 2024. All rights reserved.