【问题标题】:Kafka broker thinks there are no brokers (not even itself)卡夫卡经纪人认为没有经纪人(甚至没有经纪人)
【发布时间】:2019-03-26 05:16:14
【问题描述】:

问题

我正在尝试在 docker 中运行单个 Kafka 实例。我可以创建主题,但不能从中消费或生产。当我尝试我的 Kafka 代理时,会记录一条错误消息。

kafka_1      | [2019-03-24 16:45:05,263] ERROR [KafkaApi-5] Number of alive brokers '0' does not meet the required replication factor '1' for the offsets topic (configured via 'offsets.topic.replication.factor'). This error can be ignored if the cluster is starting up and not all brokers are up yet. (kafka.server.KafkaApis)

我不明白Number of alive brokers '0' 位,因为它是一个 Kafka 代理,它正在记录这个,所以肯定至少有一个代理(本身)?

我正在使用默认的server.properties 文件,并进行了以下更改:

listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.0.109:9092
zookeeper.connect=zookeeper:2181

192.168.0.109 是我的主机 IP。

文件

码头工人撰写

version: '3.4'
services:
  zookeeper:
    build:
      context: ./
      dockerfile: zookeeper.dockerfile
      network: host
    image: zookeeper
    ports:
      - "2181:2181"
  kafka:
    build:
      context: ./
      dockerfile: kafka.dockerfile
      network: host
    image: kafka
    ports:
      - "9092:9092"

kafka.dockerfile

FROM alpine:3.7

# Set the name for a non-priliaged user
ENV APPUSER=appuser

# Install dependnacies
RUN apk add bash
RUN apk add openjdk8-jre

# Add a non-privilaged user and change into it's home directory
RUN adduser -D $APPUSER
WORKDIR /home/$APPUSER

# Download kafka and set its owner to $APPUSER
RUN wget https://www-eu.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz
RUN chown $APPUSER kafka_2.11-2.1.0.tgz

# Change to the non-privilaged user
USER $APPUSER

# Extract kafka
RUN tar -xzf kafka_2.11-2.1.0.tgz

# copy custom server.properties into image 
COPY ./server.properties ./

# Set working directory to kafka dir
WORKDIR /home/$APPUSER/kafka_2.11-2.1.0

# start kafka with customer server.properties file
CMD ["bin/kafka-server-start.sh", "../server.properties"]

zookeeper.dockerfile

FROM alpine:3.7

# Set the name for a non-priliaged user
ENV APPUSER=appuser

# Install dependnacies
RUN apk add bash
RUN apk add openjdk8-jre

# Add a non-privilaged user and change into it's home directory
RUN adduser -D $APPUSER
WORKDIR /home/$APPUSER

# Download kafka and set its owner to $APPUSER
RUN wget https://www-eu.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz
RUN chown $APPUSER kafka_2.11-2.1.0.tgz

# Change to the non-privilaged user
USER $APPUSER

# Extract kafka
RUN tar -xzf kafka_2.11-2.1.0.tgz

# Set working directory to kafka dir
WORKDIR /home/$APPUSER/kafka_2.11-2.1.0

# Run zookeeper
CMD ["bin/zookeeper-server-start.sh", "config/zookeeper.properties"]

【问题讨论】:

  • 当它们已经预先构建时,您是否有理由制作自己的 Kafka 和 ZK docker 镜像? hub.docker.com/r/confluentinc
  • 作为学习练习。虽然我认为我在使用预构建图像时实际上遇到了类似的错误。
  • 只是一个建议,但可能从预先构建的图像开始,因为网络和 Kafka 配置可能很繁琐。一旦你完成了这项工作,就可以开始 DIY 图像了。
  • 按照您的建议使用我的设置和预先构建的图像似乎突出了问题。如果我使用 advertised.listeners=PLAINTEXT://localhost:9092 而不是 advertised.listeners=PLAINTEXT://192.168.0.109:9092 一切正常。知道为什么吗?
  • 原来是我的防火墙设置!

标签: docker apache-kafka


【解决方案1】:

这取决于监听器配置。

当您指定advertised.listeners=PLAINTEXT://192.168.0.109:9092 时,Kafka 将尝试从Docker 容器内 连接到192.168.0.109。但如果这是一个主机地址,并且您没有设置适当的 Docker 网络向导,它将失败。

当您指定advertised.listeners=PLAINTEXT://localhost:9092 时,Kafka 将连接到 Docker 容器内的localhost,这当然会解析为自身。这里的问题是,您将无法在 Docker 容器之外(在您的主机或另一个 Docker 容器上)使用 Kafka 客户端,因为它们会尝试连接到 localhost——他们自己本地 em> 上不会有 Kafka 代理。

This article 更详细地解释了该问题以及要使用的适当配置。如果你想要在 Docker 中预先构建的 Kafka 示例,那么 this Docker Compose 会显示它。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2020-07-21
    • 2018-04-07
    • 2021-02-12
    相关资源
    最近更新 更多