Я использую 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-адреса в качестве идентификатора брокера (что немного хрупко, но выполняет свою работу).Кажется, работает, но не решает проблему, что клиент не видит данные после перезапуска.