Как это возможно, что данные в Кафке выживают после переработки контейнеров? - PullRequest
1 голос
/ 03 марта 2020

Во-первых, я не знаю, связана ли эта проблема с Кафкой или с Docker ... Я ладья ie по обеим темам. Но я предполагаю, что это скорее проблема Docker, чем проблема Кафки (на самом деле это будет моей проблемой, не понимая ни того, ни другого…).

Я установил Docker на Raspberry 4 и создал Docker картинок для Кафки и для Zookeeper; Я должен был создать их сам, потому что 64-битный Raspi не был поддержан ни одним из существующих образов (по крайней мере, я не мог никого найти). Но я заставил их работать.

Затем я реализовал пример Kafka Streams (Wordcount) из документации Kafka; он работает нормально, считая слова во всех текстах, которые вы вводите в него sh, сохраняя номера всех предыдущих прогонов. Это как-то ожидается; по крайней мере, так описано в этой документации.

Так что после некоторых тестовых прогонов я хотел сбросить все значение целиком.

Я подумал, что самый простой способ получить это - отключить * Контейнеры 1037 *, удалите подключенные папки на хосте и начните сначала.

Но это не работает: счетчики слов все еще там! Значение слова начиналось не с 0…

Хорошо, следующий ход: не только удаление контейнеров, но и перестройка изображений! И Зоокейпер, и Кафка, конечно!

Без разницы! Количество слов из всех предыдущих прогонов было сохранено.

Использование docker system prune --volumes также не имело никакого значения ...

Из моего ограниченного понимания Docker я предположил, что любые данные времени выполнения хранятся в контейнер или в смонтированных папках (томах). Поэтому, когда я удаляю контейнеры и папки на хосте Docker, которые были смонтированы контейнерами, я ожидаю, что любой статус исчезнет.

Очевидно, что нет ... поэтому я пропустил что-то важное здесь, скорее всего с Docker.

Файл составления docker, который я использовал:

version: '3'

services:
  zookeeper:
    image: tquadrat/zookeeper:latest
    ports:
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
      - "8080:8080"
    volumes:
      - /data/zookeeper/config:/config
      - /data/zookeeper/data:/data
      - /data/zookeeper/datalog:/datalog
      - /data/zookeeper/logs:/logs
    environment:
      ZOO_SERVERS: "server.1=zookeeper:2888:3888;2181"
    restart: always

  kafka:
    image: tquadrat/kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9091:9091"
    volumes:
      - /data/kafka/config:/config
      - /data/kafka/logs:/logs
    environment:
      KAFKA_LISTENERS: "INTERNAL://kafka:29091,EXTERNAL://:9091"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka:29091,EXTERNAL://TCON-PI4003:9091"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_DELETE_TOPIC_ENABLE: "true"
    restart: always

Файл сценария, который я использовал для очистки подключенных папок:

#!/bin/sh

set -eux

DATA="/data"
KAFKA_DATA="$DATA/kafka"
ZOOKEEPER_DATA="$DATA/zookeeper"

sudo rm -R "$KAFKA_DATA"
sudo rm -R "$ZOOKEEPER_DATA"

mkdir -p "$KAFKA_DATA/config" "$KAFKA_DATA/logs"
mkdir -p "$ZOOKEEPER_DATA/config" "$ZOOKEEPER_DATA/data" "$ZOOKEEPER_DATA/datalog" "$ZOOKEEPER_DATA/logs"

Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Kafka Streams сохраняет свое собственное состояние в конфигурации "state.dir" на хост-машине, на которой он работает. В Apache библиотеках Кафки, это под /tmp. Сначала проверьте, переопределили ли вы это свойство в своем коде.

Что касается Docker, попробуйте сначала без томов.

Использование системного удаления docker - объемы также не имели значения…

Это очистило бы неприкрепленные тома, созданные с помощью docker volume create или volumes: в Compose, а не смонтированные на хосте каталоги.

0 голосов
/ 03 марта 2020

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

Наблюдаемое мной поведение не связано с магическим хранилищем данных для Docker, который выжил все попытки убить его; он вообще не связан с Docker.

Я использую эти Docker образы для запуска на нем Zookeeper и сервера Kafka. Затем я переключился на свою рабочую станцию ​​и написал этот код (пример «Wordcount»), который реализует процессор Kafka Stream. Когда я запустил это в своей среде IDE, он выполнялся на моем локальном компьютере с доступом к Kafka по сети.

Я предполагал, что на сервере Kafka сохранено состояние any , поэтому дамп это должно сбросить все это; так как это не работает, я также сбросил Zookeeper и, так как это было бесполезно, я удалил почти все ...

После некоторых намеков здесь я обнаружил, что процессоры Kafka Streams поддерживают свое собственное локальное состояние в файловой системе папка, настроенная с помощью state.dir (StreamsConfig.STATE_DIR_CONFIG) - см. Настройка приложения Streams . Это означает, что процессор Kafka Streams поддерживает свое собственное локальное состояние независимое от любого сервера Kafka, и - как в моем случае, когда он работает на моей локальной машине - также вне / не связано с любым Docker контейнер…

Согласно документации, местоположение по умолчанию должно быть /var/lib/kafka-streams, но это не доступно для записи в моей среде - понятия не имею, где процессор Stream вместо этого поместил свое состояние.

После установки значения конфигурации state.dir для моего процессора Streams явно в папку в моем домашнем каталоге, я мог видеть это состояние на моем диске, и после его удаления счетчик слов начинался с единицы.

Более глубокий анализ документации для Kafka Streams показал, что я мог бы получить то же самое с вызовом KafkaStream.cleanup() до запуска или после закрытия потокового процессора (удаление файлов в файловой системе не требуется).

...