首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在swarm配置中将kafka主题持久化到主机重启之外

如何在swarm配置中将kafka主题持久化到主机重启之外
EN

Stack Overflow用户
提问于 2019-09-21 00:14:21
回答 1查看 1K关注 0票数 0

我正在使用wurstmeister/kafka-docker,并遵循kafka-docker wiki中的swarm配置。按照docker的一般说明,我已经添加了一个卷。我发现,如果不在start-kafka.shexport KAFKA_LOG_DIRS="/kafka/kafka-logs-$HOSTNAME"中显式设置,kafka日志目录部分由$HOSTNAME (我相信这是网络中的容器id )定义。由于$HOSTNAME在两次重新启动之间都会发生变化,因此它不会找到以前的日志(这可能应该使用HOSTNAME_COMMAND?)这将会改变,因为每个主机上只有一个kafka在运行,我将其设置为一个静态值。因此,我得到的docker-compose-swarm.yml如下所示:

代码语言:javascript
复制
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:命名卷,并在kafka服务中引用它。

我将堆栈部署到一个群中,该群中有三个节点在docker机器上运行: dar0、dar1、dar2。我还有第四个vm,default,我正在使用它进行测试。我使用以下命令测试连通性:

代码语言:javascript
复制
docker run -i --network host confluentinc/cp-kafkacat kafkacat -b dar0:9094,dar1:9094,dar2:9094  -t test  -P

在一个shell中,并且:

代码语言:javascript
复制
docker run --tty --network host confluentinc/cp-kafkacat kafkacat -b dar0:9094,dar1:9094,dar2:9094 -C  -t test

这一切都正常,我可以看到数据正在进入/var/lib/docker/volumes/darstack_kafkamount/_data/kafka-logs/aaa.

但是,如果我关闭虚拟机,然后重新启动:

代码语言:javascript
复制
$ docker-machine stop dar0 dar1 dar2
...
$ docker-machine start dar0 dar1 dar2

我通常会得到这样的错误:

代码语言:javascript
复制
$ 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

也没有来自该主题的数据。如果我再次运行它,它有时会起作用,并且我会获得主题中的数据。但有时什么都没有。

这可能是因为代理Is的分配方式不同,取决于哪个实例首先启动?或者,我还需要为zookeeper添加卷吗?(我还没见过任何人提到这一点。)还有别的吗?

编辑:为了消除有关代理I的可能性,我添加了一个BROKER_ID_COMMAND:

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

这使用IP的最后一部分作为代理id (这有点脆弱,但可以完成工作)。似乎可以工作,但不能解决客户端在重启后看不到数据的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-24 22:49:31

经过一些实验后,我发现为zookeeper增加音量,结合BROKER_ID_COMMAND似乎可以做到这一点。

如果我取下其中任何一个,它就不起作用了。我还为zookeeper添加了一个kafka的depends_on,但我不确定这是不是必须的。

代码语言:javascript
复制
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:

这是对我在原始帖子中显示的配置的补充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58031948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档