не могу подключиться к кафке с внешней машины

Я начинаю с Apache Kafka, и у меня возникают проблемы, когда я пытаюсь подключиться к внешней машине.

С приведенной ниже конфигурацией все работает нормально, если приложение и докер работают на одном компьютере.

но когда я помещаю приложение на машину A и докер на машину B, приложение не может подключиться.

В моем весеннем Kafka @Configuration есть эта строка для @Bean consumerFactory и ProducerFactory (представьте мою машину с docker ip = 10.10.10.10)

props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");

И мой файл докеров такой:

version: '2'
services:
zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    ports:
      - 2181:2181
kafka:
    image: wurstmeister/kafka:0.10.1.1
    environment:
        KAFKA_ADVERTISED_HOST_NAME: 0.0.0.0
        KAFKA_ADVERTISED_PORT: 9092
        KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        KAFKA_CREATE_TOPICS: "topic-jhipster:1:1,PROCESS_ORDER:1:1, PROCESS_CHANNEL:1:1"
        JMX_PORT: 9999
        KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=9999"
    ports:
        - 9092:9092
        - 9999:9999
kafka-manager:
    image: sheepkiller/kafka-manager
    ports:
        - 9000:9000
    links:
        - zookeeper
    environment:
        ZK_HOSTS: zookeeper:2181

я получаю эту ошибку:

org.springframework.kafka.core.KafkaProducerException: Failed to send;
nested exception is org.apache.kafka.common.errors.TimeoutException: 
Expiring 1 record(s) for

Отредактируйте, добавьте информацию ..

Я думаю, что это какая-то конфигурация zookeeper, которую мне не хватает .. потому что, если бы у меня только zookeeper запустился на моей машине A .. и kafka на машине B .. это работает .. я только не знаю как :(


person fhgomes_ti    schedule 28.07.2017    source источник
comment
Может брандмауэр?   -  person Evgeni Dimitrov    schedule 28.07.2017
comment
@EvgeniDimitrov нет, все в порядке. Я думаю, что это какая-то конфигурация, связанная с zookeper, мне не хватает .. потому что, если бы у меня был только zookeeper, запущенный на моей машине A .. и kafka на машине B .. это работает .. я только не знаю как :(   -  person fhgomes_ti    schedule 28.07.2017


Ответы (4)


Попробуйте установить Listeners,

eg: listeners = PLAINTEXT://your.host.name:9092

Предполагая, что вы можете использовать telnet между машинами на порте kafka.

person Krishas    schedule 30.07.2017

Установите advertised.listeners в имя хоста или IP-адрес хост-машины контейнера докеров.

environment:
        KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"

Что происходит, так это то, что клиент подключается к серверу начальной загрузки, выполняет запрос метаданных, чтобы обнаружить, к какому брокеру Kafka в кластере подключиться для определенного раздела темы, и возвращает объявленное имя хоста в качестве ответа (в вашем случае 0.0.0.0), который будет работать, только если все находится на одном компьютере.

Вам необходимо объявить IP-адрес или имя хоста, которые будут работать с удаленного компьютера, а не localhost, 127.0.0.1 или 0.0.0.0. Также не частный внутренний IP-адрес или имя хоста контейнера докеров. Это должен быть внешний / общедоступный IP-адрес или имя хоста.

Также advertised.host.name и advertised.port являются устаревшими параметрами в Kafka 0.10.x, поэтому, даже если вы их используете (они работают для обратной совместимости), вам также необходимо установить advertised.host.name как то, что производитель может разрешить и подключиться. Я предлагаю использовать полное имя хоста или IP-адрес хост-машины докера (т.е. 10.10.10.10).

Из http://kafka.apache.org/0101/documentation.html#brokerconfigs

УСТАРЕЛО: используется, только если advertised.listeners или listeners не установлены. Вместо этого используйте advertised.listeners. Имя хоста для публикации в ZooKeeper для использования клиентами. В средах IaaS он может отличаться от интерфейса, к которому привязан брокер. Если он не установлен, будет использоваться значение host.name, если оно настроено. В противном случае будет использоваться значение, возвращенное из java.net.InetAddress.getCanonicalHostName ().

person Hans Jespersen    schedule 29.07.2017

Какая-то смесь @Krishas и @Hans Jespersen

Вот код моего докера yml:

version: '2'
services:
    zookeeper:
        image: wurstmeister/zookeeper:3.4.6
        ports:
          - 2181:2181
    kafka:
        image: wurstmeister/kafka:0.10.1.1
        environment:
            KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.10:9092
            KAFKA_ADVERTISED_HOST_NAME: 10.10.10.10
            KAFKA_ADVERTISED_PORT: 9092
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

Для этого нужен префикс «PLAINTEXT: //!» И настроить «host_name» + «port» или «listeners»

Следующий шаг - это расшифровать то, как я буду настраивать другие узлы

person fhgomes_ti    schedule 02.08.2017

Вам нужно указать java.rmi.server.hostname = 0.0.0.0

person Rafael Brito Gomes    schedule 28.07.2017
comment
Привет, ты мой родственник (Гомес)? kkk Где, по вашему мнению, мне нужно это указать? - person fhgomes_ti; 28.07.2017
comment
Может быть, да! Вариант, который вы можете найти в переменной KAFKA_JMX_OPTS - person Rafael Brito Gomes; 28.07.2017
comment
это только конфигурация для доступа к Kafka Manager. Я думаю, что моя проблема - это некоторая конфигурация, которую мне не хватает на моем ProducerFactory, связанной с zookeeper .. но я не знаю, что такое - person fhgomes_ti; 28.07.2017