Сбой при попытке поймать данные от брокеров кафки внутри роя докеров - PullRequest
0 голосов
/ 15 января 2019

Я работаю в инфраструктуре с Docker Swarm, где есть одна (и только) кафка на узел, все в порядке, без каких-либо ошибок / предупреждений, но когда я пытаюсь получить доступ ко второму брокеру (worker2), я ловлю ошибку , Посмотрите на вывод:

kafkacat -L -b worker2:9094                                                                                                                     
% ERROR: Failed to acquire metadata: Local: Timed out

Ожидаемый результат от worker1:

kafkacat -L -b worker1:9094                                                                                                                      
Metadata for all topics (from broker 1001: worker1:9094/1001):
 2 brokers:
  broker 1001 at worker1:9094
  broker 1002 at worker2:9094
 1 topics:
  topic "logging_application_access" with 1 partitions:
    partition 0, leader 1001, replicas: 1001, isrs: 1001

Вывод из моего списка узлов:

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
c6msb82zav2p1lepd13phmeei *   manager1            Ready               Active              Leader              18.06.1-ce
n3sfqz4rgewtulz43q5qobmr1     worker1             Ready               Active                                  18.06.1-ce
xgkibsp0kx29bhmjkwysapa6h     worker2             Ready               Active                                  18.06.1-ce  

Для лучшего понимания, посмотрите на мой docker-compose.yml файл:

version: '3.6'

x-proxy: &proxy
  http_proxy: ${http_proxy}
  https_proxy: ${https_proxy}
  no_proxy: ${no_proxy}

services:
  zookeeper:
    image: zookeeper:3.4.13
    hostname: zookeeper
    volumes:
      - type: volume
        source: zookeeper-data
        target: /data
    environment:
      <<: *proxy
    ports:
      - target: 2181
        published: 2181
        protocol: tcp
    networks:
      - workshop
    restart: always
    deploy:
      replicas: 2
      placement:
        constraints:
          - node.role == worker

  kafka:
    image: wurstmeister/kafka:2.12-2.1.0
    hostname: kafka
    volumes:
      - type: volume
        source: kafka-data
        target: /kafka
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
        read_only: true
    env_file: ./services/kafka/.env
    environment:
      <<: *proxy
    ports:
      - target: 9094
        published: 9094
        protocol: tcp
        mode: host
    networks:
      - workshop
    restart: always
    depends_on:
      - zookeeper
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == worker

volumes:
  zookeeper-data:
    driver: local
  kafka-data:
    driver: local

networks:
  workshop:
    name: workshop
    external: true

И, наконец, файл среды:

HOSTNAME_COMMAND=docker info | grep ^Name: | cut -d ' ' -f 2

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS=INSIDE://:9092,OUTSIDE://_{HOSTNAME_COMMAND}:9094
KAFKA_LISTENERS=INSIDE://:9092,OUTSIDE://:9094
KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE

KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS=36000
KAFKA_ZOOKEEPER_SESSION_TIMEOUT_MS=36000

KAFKA_LOG_RETENTION_HOURS=24
KAFKA_AUTO_CREATE_TOPICS_ENABLE=false
KAFKA_CREATE_TOPICS=logging_application_access:1:1

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=1099
JMX_PORT=1099

Я сейчас ищу решение для этого, но безуспешно.

1 Ответ

0 голосов
/ 15 января 2019

Если вы уменьшите масштаб до одного экземпляра, он начнет работать?По моему опыту, если вы хотите запустить zookeeper в режиме высокой доступности, вам нужно явно перечислить весь кворум в строке подключения zookeeper, что не очень хорошо работает с реплицированной службой в докере.Так что либо запустите только один узел zookeeper, либо создайте отдельные службы для каждого из них (например, zookeeper1 zookeeper2, zookeeper3) в вашем файле compose и перечислите их все в переменной подключения zookeeper, т.е. KAFKA_ZOOKEEPER_CONNECT = zookeeper1: 2181, zookeeper2: 2181, zookeeper3:.

Вы можете попробовать адрес dnsrr tasks.zookeeper, но мой опыт показывает, что не удалось правильно разрешить список контейнеров за службой.

К вашему сведению, вы не получителюбая выгода от запуска двух узлов zookeeper;Для работы Zookeeper требуется более половины узлов в кворуме, поэтому для обеспечения отказоустойчивости вам нужно как минимум три.

...