Kafka的数据怎么可能在容器回收中幸存?

wswtfjt7  于 2021-06-05  发布在  Kafka
关注(0)|答案(2)|浏览(560)

首先,我不知道这是Kafka的问题还是多克的问题……我对这两个主题都是新手。但我认为这更像是一个 Docker 而不是Kafka的问题(事实上,这将是我的问题,不真正了解其中一个…)。
我在raspberry 4上安装了docker,并为kafka和zookeeper创建了docker图像;我必须自己创建它们,因为64位raspi不受任何现有图像的支持(至少我找不到任何人)。但我让他们工作了。
接下来,我实现了kafka文档中的kafka流示例(wordcount);它运行得很好,计算你输入的所有文本中的单词,保留以前所有运行的数字。这在某种程度上是意料之中的;至少在那个文档中是这样描述的。
所以在一些测试运行之后,我想重置整个东西。
我认为最简单的方法是关闭docker容器,删除主机上装载的文件夹,然后重新开始。
但这不起作用:单词计数器仍然存在!意思是字数不是从0开始的…
好,下一步:不仅移除容器,还要重建图像!当然了,Zookeeper和Kafka!
没有区别!保留了以前所有运行的字数。
使用 docker system prune --volumes 也没什么区别…
从我对docker的有限理解来看,我假设任何运行时数据都存储在容器中,或者存储在装载的文件夹(卷)中。因此,当我删除容器和docker主机上由容器装载的文件夹时,我希望任何状态都会消失。
显然不是…所以我错过了一些重要的事情,很可能是docker。
我使用的docker compose文件:

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"

有什么想法吗?

alen0pnh

alen0pnh1#

我从一开始就认为,问题主要是我缺乏知识。
我观察到的行为与docker的神奇数据存储无关,docker可以在所有试图杀死它的尝试中幸存下来;它和docker一点关系都没有。
我用这些docker图像来运行zookeeper和kafka服务器。然后我切换回我的工作站机器,编写了实现kafka流处理器的代码(“wordcount”示例)。当我在ide中启动时,它在本地机器上执行,通过网络访问Kafka。
我的假设是,任何状态都存储在kafka服务器上,因此转储应该重置整个事件;因为这不起作用,我也甩了Zookeeper,因为这也无济于事,我删除了几乎所有…
在这里给出一些提示之后,我发现kafka streams处理器在通过配置的文件系统文件夹中维护自己的本地状态 state.dir ( StreamsConfig.STATE_DIR_CONFIG )–请参阅配置streams应用程序。这意味着kafka流处理器独立于任何kafka服务器维护自己的本地状态,并且-就像在我的本地计算机上运行时一样-也在任何docker容器之外/与之无关…
根据文档,默认位置应该是 /var/lib/kafka-streams ,但这在我的环境中是不可写的–不知道流处理器将其状态放在何处。
设置配置值后 state.dir 对于我的streams处理器,我可以在我的主目录中的一个文件夹中看到该状态,在删除该状态后,字数从1开始。
深入查看Kafka流的文档发现,我可以通过调用 KafkaStream.cleanup() 在启动流处理器之前或关闭流处理器之后(不需要删除文件系统上的文件)。

carvr3hs

carvr3hs2#

Kafka流存储自己的状态下 "state.dir" 在其运行的主机上进行配置。在apachekafka库中,这是在 /tmp . 首先检查是否已在代码中重写该属性。
至于docker,请先尝试不使用卷。
使用docker系统prune--卷也没有区别…
这将清除由 docker volume create 或者 volumes: 在compose中,而不是主机装载的目录中。

相关问题