Подтвердить что ты не робот

Почему я не могу подключиться к Кафке извне?

Я запускаю kafka на экземпляр ec2. Таким образом, экземпляр amazon ec2 имеет два ips, один из которых является внутренним ip, а второй - для внешнего использования.

Я создал производителя с локальной машины, но перенаправляю его на внутренний ip и даю мне неудачную попытку подключения. Может ли кто-нибудь помочь мне настроить kafka на экземпляр ec2, чтобы я мог запускать продюсер с локальной машины. Я пробовал много комбинаций, но не работал.

4b9b3361

Ответ 1

В Kafka FAQ вы можете прочитать:

Когда брокер запускается, он регистрирует свой IP/порт в ZK. Необходимо убедиться, что зарегистрированный ip соответствует тому, что указано в metadata.broker.list в конфигурации производителя. По умолчанию зарегистрированный ip предоставляется InetAddress.getLocalHost.getHostAddress(). Как правило, это должно вернуть реальный IP-адрес хоста. Однако иногда (например, в EC2) возвращаемый ip является внутренним и не может быть подключен извне. Решение состоит в том, чтобы явно указать хост IP должен быть зарегистрирован в ZK, установив host.name свойство в server.properties. В другом редком случае, когда хост/порт привязки отличается от хоста/порта для клиентского соединения, вы можете установить advertised.host.name и advertised.port для клиентского соединения.

Ответ 2

Я решил эту проблему, установив advertised.host.name в server.properties и metadata.broker.list в producer.properties на общедоступный IP-адрес и host.name до 0.0.0.0.

Ответ 3

Я только что сделал это в AWS. Сначала получите сервер Kafka для прослушивания правильного интерфейса /IP с использованием host.name. Для вашего случая это будет внутренний IP-адрес, а не localhost, поскольку вы намерены подключиться к внешним клиентам Kafka. Любые локальные клиенты должны будут использовать тот же адрес, а не localhost.

Затем установите для рекламируемого .host.name имя хоста, а не IP-адрес. Хитрость заключается в том, чтобы получить, что имя хоста всегда разрешено для правильного IP-адреса для внутренних и внешних компьютеров. Я использую /etc/hosts внутри и DNS снаружи. См. Мой полный ответ о Kafka и разрешении имен здесь.

Ответ 4

Самый простой способ добраться до вашего сервера Kafka (версия kafka_2.11-1.0.0) на EC2 от потребителя во внешней сети - это изменить файл свойств

kafka_2.11-1.0.0/config/server.properties

И измените следующую строку

listeners=PLAINTEXT://ec2-XXX-XXX-XXX-XXX.eu-central-1.compute.amazonaws.com:9092

Использование вашего общего адреса

Проверено 2.11-2.0.0

Ответ 5

Ниже приведены шаги для подключения Kafka извне экземпляра EC2.

  1. Откройте файл свойств сервера Kafka на EC2.

    /kafka_2.11-2.0.0/config/server.properties

  2. Задайте значение advertized.listeners для

    advertised.listeners = PLAINTEXT://ec2-xx-xxx-xxx-xx.compute-1.amazonaws.com: 9092

    Это должен быть ваш публичный DNS (IPv4) экземпляра EC2.

  3. Остановите сервер Kafka.

  4. Запустите сервер Kafka, чтобы увидеть изменения конфигурации в действии.

  5. Теперь вы можете подключиться к своему экземпляру Kafka из EC2 извне или с вашего локального хоста.

    Пробовал и тестировал на kafka_2.11-2.0.0

Ответ 6

Если вы хотите получить доступ из локальной сети, измените следующее 2 files-

  1. В config/server.properties:

    advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
    
  2. В config/producer.properties:

    bootstrap.servers=server.ip.in.lan:9092
    

В моем случае значение server.ip.in.lan было 192.168.15.150

Ответ 7

SSH к вашему экземпляру EC2 или везде, где вы размещаете Kafka.

sudo nano /etc/hosts

Добавить:

127.0.0.1 <your-host-name> localhost

В моем случае это:

127.0.0.1 ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com

Сохранить и выйти.

Ответ 8

Для EC2 вы должны отредактировать файл /etc/hosts чтобы добавить:

XXX.XXX.XXX.XXX ip-YYY-YYY-YYY-YYY

где XXX... является вашим внешним IP-адресом, а ip-YYY-YYY-YYY-YYY - это строка, возвращаемая командой hostname. Вы можете использовать 127.0.0.1 вместо своего внешнего IP для связи внутри сервера.

host.name является устаревшим - как и advertised.host.name и advertised.port