Первоначальные извинения за длинный пост (это тоже от суперпользователя, так как я не был уверен, что лучшее место для этого https://superuser.com/questions/1404421/kafka-multiple-listeners так что дайте мне знать, если нужно закрыть) ...
Я настроил кластер Kafka в AWS со следующими слушателями и объявленными слушателями:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://ds-kafka-broker0.service.local:9092,INTERNAL://:9093,PRIVATE://ds-kafka-broker0.private.awscloud.co.uk:6000,EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000
KAFKA_LISTENERS: PLAINTEXT://:9092,INTERNAL://:9093,PRIVATE://:6000,EXTERNAL://:7000
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT,PRIVATE:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
Мне приходится это делать, потому что мы запускаем гибридную среду AWS / On-Prem через прямое подключение.
В AWS:
Мы используем VPCE для подключения к кластеру Kafka в учетных записях, поэтому хост для PRIVATE listener одинаков для каждой учетной записи и использует локальную частную зону R53.
On-Prem:
Частная зона не работает с локальной системой, потому что мы не можем разрешить зоны private.awscloud.co.uk, которые находятся в каждой учетной записи AWS, поэтому мне приходится использовать другую зону, которая в Kafka заставляет меня использовать другой прослушиватель и диапазон портов. Это ВНЕШНИЙ слушатель.
Все они в настоящее время используют открытый текст, поскольку я все еще нахожусь в стадии реализации, но в конечном итоге оба будут использовать одно и то же шифрование, но для моих текущих целей тестирования подключения это должно сработать. В качестве работающего кластера со всеми аксессуарами (подключением, ksql, схемой и т. Д.) Все работает нормально из учетной записи AWS кластера Kafka.
Эта проблема:
Когда я подключаюсь к ВНЕШНИМ портам, используя следующие настройки производителя.config:
bootstrap.servers=EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000,EXTERNAL://ds-kafka-broker1.dev.awscloud.co.uk:7001,EXTERNAL://ds-kafka-broker2.dev.awscloud.co.uk:7002
#security.protocol=EXTERNAL # commented out as this is not valid in console producer
compression.type=snappy
max.block.ms=5000
linger.ms=5
max.in.flight.requests.per.connection=1
retries=5
batch.size=1000
max.request.size=10000000
acks=1
buffer.memory=67108864
и используйте следующую командную строку производителя тестовой консоли:
bin/kafka-console-producer --producer.config etc/producer.properties --topic test-create-remote --broker-list EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000,EXTERNAL://ds-kafka-broker1.dev.awscloud.co.uk:7001,EXTERNAL://ds-kafka-broker2.dev.awscloud.co.uk:7002
начальное соединение происходит на 7000, но затем Kafka сообщает клиенту, что он должен использовать ЧАСТНЫЙ слушатель, и трафик повторно подключается к диапазону частных портов 6000 (подтверждено с помощью tcpdump).
Это нормально, когда вы подключаетесь из учетной записи AWS, поскольку именно для этого предназначен этот диапазон портов и прослушиватель, но с точки зрения клиента, похоже, я не могу контролировать, какой прослушиватель использовать. В этом случае локальное соединение не работает, потому что я не могу разрешить ЧАСТНЫЙ адрес, и даже если бы мог, я все равно не смог подключиться к порту.
Это также заставляет меня задаться вопросом, почему я получаю ЧАСТНЫЙ слушатель ... Почему не ВНУТРЕННИЙ или PLAINTEXT, если у меня нет контроля?
Надеюсь, все это имеет смысл, и любые указатели оценены.
Просто подумал, что опубликую свое решение для этого. Это не имело отношения к конфигурации Kafka!
Это работало на AWS ECS (EC2, а не Fargate), и, поскольку в настоящее время существует ограничение в 1 целевую группу на задачу, поэтому 1 целевая группа использовалась в фоновом режиме для обоих слушателей (6000 и 7000). Этой целевой группой был порт 6000, поэтому он переводил 7000 в 6000, поэтому я всегда возвращал один и тот же слушатель.
Это сообщение в блоге (https://rmoff.net/2018/08/02/kafka-listeners-explained/) был весьма полезен, но не смог решить мою проблему, но в нем была одна ключевая цитата, которая помогла:
При подключении к брокеру прослушиватель, который будет возвращен клиенту, будет прослушивателем, к которому вы подключились (в зависимости от порта).
Затем, когда я обсуждал проблему с кем-то, и я говорил об одном балансировщике нагрузки, когда у меня был момент лампочки ... Теперь о портах, выделенных целевым группам, и все в порядке.