使用 KAFKA_ADVERTISED_HOST_NAME 的 kafka 经纪人数量增加

Increasing number of brokers in kafka using KAFKA_ADVERTISED_HOST_NAME

我是 Kafka 的新手,我正在尝试 运行 我本地机器上的 Kafka 服务,并使用它来将一些数据从一个 .NET 项目传输到另一个。 我正在使用 docker-compose.yml 文件为 wurstmeister 的 zookeeper 和 Kafka 创建两个 docker 容器。 在环境变量的 Kafka 定义中有 KAFKA_ADVERTISED_HOST_NAME,我将其设置为 127.0.0.1。 在 docker wurstmeister/kafka 的中心说我引用

》修改docker-compose.yml中的KAFKA_ADVERTISED_HOST_NAME以匹配您的docker主机IP(注意:不要使用localhost或127.0.0.1作为主机IP如果你想 运行 多个经纪人。)”。

当我将我的主题设置为具有超过 1 个副本和超过 1 个分区时,我收到此消息

“执行主题命令时出错:复制因子:2 大于可用代理:1。”。

在 KAFKA_ADVERTISED_HOST_NAME 中定义的正确 IP 地址是什么,这将允许我获得超过 1 个代理?

version: '2'
services:
 zookeeper:
  image: wurstmeister/zookeeper
  ports:
   - "2181:2181"
 kafka:
  image: wurstmeister/kafka
  ports:
   - "9092:9092"
  environment:
   KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
   KAFKA_CREATE_TOPICS: "simpletalk_topic:2:2"
   KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock

应该是你机器的ip地址。 Linux: 使用 ifconfig 命令,您的 IP 将是 inet <IP_ADDRESS> 在 windows 中,您将使用 ipconfig

获得此信息

注意 - 运行一台机器上的多个代理不提供真正的容错。

use it to transfer some data from one .NET project to another

为此您只需要一名经纪人。


首先,建议阅读https://github.com/wurstmeister/kafka-docker/wiki/Connectivity

KAFKA_ADVERTISED_HOST_NAME 已弃用。不要使用它。

它已被 KAFKA_ADVERTISED_LISTENERS 取代,它可以包含 ${DOCKER_HOST_IP:-127.0.0.1}(或来自 ifconfig 的主机 IP),因为这是您的客户端将使用的 IP(来自主机).
由于代理是自己的客户,因此您还需要通告容器名称。而且,如果您想容器化您的客户端,您的应用程序也会使用这些地址。

除了 Kafka 网络配置之外,KAFKA_BROKER_ID 需要在每个配置之间有所不同,并且您的错误提示您需要覆盖所有其他复制因子代理配置。

总而言之。

version: '3'
services:
 zookeeper:
  image: wurstmeister/zookeeper
 kafka-1:
  image: wurstmeister/kafka
  depends_on: [zookeeper]
  ports:
   - "9092:9092"
  environment:
   KAFKA_BROKER_ID: 1
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${DOCKER_HOST_IP:-127.0.0.1}:9092,PLAINTEXT_INTERNAL://kafka-1:29092
   KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_INTERNAL://:29092
   KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT_INTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
   KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT_INTERNAL
   KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
   KAFKA_DEFAULT_REPLICATION_FACTOR: 2
   KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
   KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 2
 kafka-2:
  image: wurstmeister/kafka
  ports:
   - "9093:9093"
  environment:
   KAFKA_BROKER_ID: 2  # unique
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${DOCKER_HOST_IP:-127.0.0.1}:9093,PLAINTEXT_INTERNAL://kafka-2:29093
   KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093,PLAINTEXT_INTERNAL://:29093
   KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT_INTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
   KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT_INTERNAL
   KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
   KAFKA_DEFAULT_REPLICATION_FACTOR: 2
   KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
   KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 2
   KAFKA_CREATE_TOPICS: "simpletalk_topic:2:2"
  depends_on:  # ensure this joins the other
   - zookeeper
   - kafka-1

I'm trying to run a Kafka service on my local machine

设置bootstrap.servers="localhost:9092,localhost:9093"

进一步阅读 -

用法示例

请注意,创建主题似乎不会自动进行。理想情况下,您应该使用您的应用程序来实际创建/检查主题是否存在。

$ kcat -b localhost:9093 -L
Metadata for all topics (from broker -1: localhost:9093/bootstrap):
 2 brokers:
  broker 2 at 127.0.0.1:9093
  broker 1 at 127.0.0.1:9092 (controller)
 0 topics:

生成一些数据...并使用它

$ kcat -b localhost:9093 -t test -o earilest
% Auto-selecting Consumer mode (use -P or -C to override)
hello
world
sample
data
of
no
importance