Как сохранить темы кафки после перезапуска хоста в конфигурации роя - PullRequest
0 голосов
/ 20 сентября 2019

Я использую wurstmeister / kafka-docker , и следую конфигурации swarm в вики kafka-docker.Следуя общим инструкциям докера, я добавил том.Я обнаружил, что каталоги журнала kafka частично определяются с помощью $ HOSTNAME (который, как я полагаю, является идентификатором контейнера в этой сети), если вы явно не установите его в start-kafka.sh :export KAFKA_LOG_DIRS="/kafka/kafka-logs-$HOSTNAME".Поскольку $ HOSTNAME изменяется между перезапусками, он не будет находить предыдущие журналы (вероятно, следует использовать HOSTNAME_COMMAND?), Это изменится. Поскольку на каждом хосте работает только одна kafka, я установил для него статическое значение.Итак, мой результирующий docker-compose-swarm.yml выглядит следующим образом:

version: '3.2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9094
        published: 9094
        protocol: tcp
        mode: host
    environment:
      HOSTNAME_COMMAND: "docker info | grep ^Name: | cut -d' ' -f 2"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      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
      #  $HOSTNAME (container ID?) is used by default, that changes, so this, for now:
      KAFKA_LOG_DIRS: "/kafka/kafka-logs/aaa"

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - kafkamount:/kafka
volumes:
  kafkamount:

В основном я добавил KAFKA_LOG_DIRS, добавил kafkamount: named volume и ссылаюсь на него в сервисе kafka.

Iразверните стек в рой с тремя узлами, работающими на докер-машине: dar0, dar1, dar2.У меня также есть четвертый vm, по умолчанию, который я использую для тестирования.Я проверяю соединение с:

docker run -i --network host confluentinc/cp-kafkacat kafkacat -b dar0:9094,dar1:9094,dar2:9094  -t test  -P

в одной оболочке и:

docker run --tty --network host confluentinc/cp-kafkacat kafkacat -b dar0:9094,dar1:9094,dar2:9094 -C  -t test

Все это работает, и я вижу, что данные поступают в / var / lib / docker / volume./darstack_kafkamount/_data/kafka-logs/aaa.

Однако, если я выключаю vms, а затем перезапускаю:

$ docker-machine stop dar0 dar1 dar2
...
$ docker-machine start dar0 dar1 dar2

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

$ docker run --tty --network host confluentinc/cp-kafkacat kafkacat -b dar0:9094,dar1:9094,dar2:9094 -C  -t test
% ERROR: Topic test error: Broker: Leader not available

и нет данных из темы.Если я запускаю его снова, это иногда работает, и я получаю данные в теме.Но иногда ничего.

Возможно, это связано с тем, что идентификаторы брокера назначаются по-разному, в зависимости от того, какой экземпляр был запущен первым?Или мне тоже нужно добавить том для zookeeper?(Я не видел, чтобы кто-нибудь упоминал об этом.) Что-то еще?

РЕДАКТИРОВАТЬ: Чтобы исключить вероятность того, что это что-то о идентификаторах брокера, я добавил BROKER_ID_COMMAND:

BROKER_ID_COMMAND: "docker info -f '{{`{{.Swarm.NodeAddr}}`}}' | sed 's/.*\\.\\([0-9]\\+\\)/\\1/'"

Это используетпоследняя часть IP-адреса в качестве идентификатора брокера (что немного хрупко, но выполняет свою работу).Кажется, работает, но не решает проблему, что клиент не видит данные после перезапуска.

1 Ответ

0 голосов
/ 24 сентября 2019

После некоторых экспериментов я обнаружил, что добавление томов для zookeeper в сочетании с BROKER_ID_COMMAND, похоже, помогает.

Если бы я тоже удалил, это не сработало.Я также добавил зависимость_on для kafka в zookeeper, но я не уверен, что это важно.

services:
  zookeeper:
...
    volumes:
      - zookeeperconf:/opt/zookeeper-3.4.13/conf
      - zookeeperdata:/opt/zookeeper-3.4.13/data
...
  kafka:
    ...
    environment:
      ...
      BROKER_ID_COMMAND: '{{`docker info -f ''{{.Swarm.NodeAddr}}'' | sed ''s/.*\.\([0-9]\+\)/\1/''`}}'
    ...
    depends_on:
      - zookeeper
volumes:
   ...
   zookeeperconf:
   zookeeperdata:

Это в дополнение к конфигурации, которую я показал в исходном сообщении.

...