Kafka Broker 找不到集群 ID 并在 docker 重启后创建新集群 ID

Kafka Broker doesn't find cluster id and creates new one after docker restart

我已经使用 kafka 代理和 zookeeper 创建了 docker,以使用 运行 脚本启动它。 如果我重新开始,它会正常启动并且 运行 没问题(Windows -> WSL -> 两个 tmux windows,一个会话)。如果我关闭 kafka 或 zookeeper 并重新启动它,它将正常连接。

当我停止 docker 容器时出现问题(docker 停止 my_kafka_container)。然后我从我的脚本 ./run_docker 开始。在开始之前的那个脚本中,我删除了旧容器 docker rm my_kafka_container 然后 docker 运行.

Zookeeper 正常启动,并且在文件 meta.properties 中它有上次启动时的旧集群 ID,但是由于某种原因 kafka broker 无法通过 znode cluster/id 找到这个 id 并创建一个不是的新集群存储在 meta.properties 中的内容。我得到

  ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.common.InconsistentClusterIdException: The Cluster ID m1Ze6AjGRwqarkcxJscgyQ doesn't match stored clusterId Some(1TGYcbFuRXa4Lqojs4B9Hw) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
        at kafka.server.KafkaServer.startup(KafkaServer.scala:220)
        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
        at kafka.Kafka$.main(Kafka.scala:84)
        at kafka.Kafka.main(Kafka.scala)
[2020-01-04 15:58:43,303] INFO shutting down (kafka.server.KafkaServer)

如何避免 broker 更改集群 id?

解决这个问题:

  1. 只需删除所有创建(或生成)到 zookeeper 和 kafka 中的 log/Data 文件。
  2. 运行 动物园管理员
  3. 运行卡夫卡

尝试以下...

  1. 在 ./config/server.properties

    中启用以下行

    listeners=PLAINTEXT://:9092

  2. 修改默认ZooKeeper dataDir

  3. 修改默认的Kafka日志目录

如果您 100% 确定您正在连接到正确的 ZooKeeper 和正确的 Kafka 日志目录,但由于某些原因不匹配并且您不想在尝试恢复时丢失所有数据:

Kafka 数据目录(检查 config/server.properties for log.dirs 属性,默认为 /tmp/kafka-logs)包含一个名为 meta.properties 的文件。它包含集群 ID。哪个应该与注册到 ZK 的 ID 匹配。编辑文件以匹配 ZK,编辑 ZK 以匹配文件,或删除文件(它包含集群 ID 和代理 ID,第一个当前已损坏,第二个正常在配置文件中)。完成这个小手术后,Kafka 将从您现有的所有数据开始,因为您没有删除任何数据文件。

像这样: mv /tmp/kafka-logs/meta.properties /tmp/kafka-logs/meta.properties_old

对于 windows,重命名或删除此 meta.properties 有助于启动 kafka 并且观察到文件已在启动后创建。

{kafka-installation-folder}\softwareskafkalogs\meta.properties

我在 Windows 机器上 运行 Kafka 服务器时遇到了同样的问题。

您可以尝试以下方法解决此问题:

  1. 打开位于您的kafka文件夹kafka_2.11-2.4.0\config中的服务器server.properties文件(考虑到您的kafka版本,文件夹名称可以是kafka_)
  2. 搜索条目log.dirs
  3. 如果您的 log.dir 路径包含像这样的 windows 目录路径 E:\Shyam\Software\kafka_2.11-2.4.0\kafka-logs 其中有一个反斜杠,即 \,更改它双反斜杠即用 \

希望对您有所帮助。干杯

试试这个:

  • 打开服务器 server.properties 文件,该文件位于您的 kafka 文件夹 kafka_2.11-2.4.0\config
  • 搜索条目 log.dirs
  • 如果您指定了目录 C:....... 将其更改为相对于当前目录。示例 log.dirs=../../logs

这对我有用:)

Kafka 过去是使用 other/other zookeeper 实例启动的,因此旧的 zookeeper id 已在其中注册。 在 Kafka 配置目录中,打开 kafka 配置属性文件假设 server.properties 找到参数为log.dirs=的日志路径目录,然后进入日志路径目录,在其中找到文件meta.properties。 打开文件 meta.properties 并更新 cluster.id= 或从日志路径目录中删除此文件或所有日志文件并重新启动 kafka。

我在使用 Docker 时遇到了同样的问题。自 Kafka 2.4 以来出现此问题,因为添加了检查以查看 Zookeeper 中的集群 ID 是否匹配。它将集群 ID 存储在 meta.properties.

这可以通过持久化 Zookeeper 数据而不仅仅是 Zookeeper 日志来解决。例如。使用以下配置:

volumes:
  - ~/kafka/data/zookeeper_data:/var/lib/zookeeper/data
  - ~/kafka/data/zookeeper_log:/var/lib/zookeeper/log

您还应该删除 Kafka 日志中的 meta.properties 文件一次,以便 Kafka 从 Zookeeper 检索正确的集群 ID。之后 ID 应该匹配,您就不必再这样做了。

您也可能 运行 进入 snapshot.trust.empty 错误,该错误也在 2.4 中添加。您可以通过添加 snapshot.trust.empty=true 设置或在升级到 2.4 之前使 Zookeeper 数据持久化来解决此问题。

这是由于 Kafka 2.4.0 版本中引入的一项新功能,它是 [KAFKA-7335] - Store clusterId locally to ensure broker joins the right cluster。当 docker 重启发生时,Kafka 尝试将本地存储的 clusterId 与 Zookeeper 的 clusterId(由于 docker 重启而更改)匹配,由于这种不匹配,出现上述错误被抛出。请参考this link 获取更多信息。

我就是这样解决的。我搜索了这个文件,重命名并成功启动并创建了一个新文件。

我是mac

下brew安装的Kafka

希望对您有所帮助。

cluster.id属性中有一个meta.properties只需将id替换为说明即可在错误日志中。
meta.properties 文件在 kafka.logdir 中。您可以从 Kafka 配置 server.properties 中学习 kafka.logdir。下面是一个例子。

cat /opt/kafka/config/server.properties | grep log.dirs
Expected output:
log.dirs=/data/kafka-logs

找到 meta.properties 文件后更改它。更改后应该是这样的。

#
#Tue Apr 14 12:06:31 EET 2020
cluster.id=m1Ze6AjGRwqarkcxJscgyQ
version=0
broker.id=0

我已经尝试了大部分答案并找到了实际有效的方法(丢失了我所有的数据和记录)。
仅限 WINDOWS 操作系统
因此,正如其他人所建议的那样,我们确实需要为两者更改和设置数据目录的默认路径

server.properties 和
中的 Kafka zookeeper.properties

中的动物园管理员

//记住这很重要,如果你在 windows 给双斜线。
对于卡夫卡
log.dirs=C://kafka_2.13-2.5//data//kafka

动物园管理员也是如此
dataDir=C://kafka_2.13-2.5//data//zookeeper

显然您需要先创建上面列出的文件夹,然后再进行任何设置

然后尝试运行 zookeeper 和Kafka 更改路径后没有遇到这个问题。
在此之前,我有一个只工作一次的“/”,然后再次更改为“”,这也工作了一次。

编辑 并且不要忘记正确终止进程
卡夫卡服务器-stop.bat 和
动物园管理员服务器-stop.bat

如果在测试期间,您正在尝试启动 EmbeddedKafka 代理,并且如果您的测试用例不执行 clean-up 临时目录,那么您将必须手动删除 kafka 日志目录才能通过此操作错误。

编辑 meta.properties 并删除带有 cluster.id 的行并重新启动 kafka。

在 linux 服务器上它位于 /var/lib/kafka/meta.properties

对所有服务器执行此操作。新的集群 ID 将由 zookeeper 为代理提供。

错误 -> 集群 ID Ltm5IhhbSMypbxp3XZ_onA 与 meta.properties 中存储的 clusterId Some(sAPfAIxcRZ2xBew78KDDTg) 不匹配。代理正在尝试加入错误的集群。配置zookeeper.connect可能有误

Linux ->

转到/tmp/kafka-logs 检查 meta.properties 文件

使用 vi meta.properties 将集群id改为需要的id

在我的例子中,这是由于 缺少 zookeeper 集群的配置,或者更准确地说,每个 zookeeper 节点都是独立工作的,因此诸如集群 id 之类的数据不会在它们之间共享卡夫卡节点。 当一个 kafka 节点在其他节点已经启动 运行 之后启动时,它没有通过 zookeeper 识别集群 id 已经建立并创建了一个新的集群 id 并尝试与类似地给自己不同 id 的其他节点通信.

要解决此问题:

  1. 我们需要清除kafka/config/zookeeper.properties文件
  2. dataDir定义的zookeeper目录
  3. 在此文件夹中添加一个名为 myid 的文件,其中包含每个 zookeeper 节点的唯一 ID
  4. 在每个kafka/config/zookeeper.properties文件中添加如下配置:
tickTime=2000
initLimit=5
syncLimit=2
server.1=<zookeeper node #1 address>:2888:3888
server.2=<zookeeper node #2 address>:2888:3888
server.3=<zookeeper node #3 address>:2888:3888
  1. meta.properties 文件中删除 cluster.id 行,该文件位于 log.dirs 属性 描述的路径中kafka/config/server.properties 文件或一并删除此文件

您可以参考zookeeper文档获取更多信息: https://zookeeper.apache.org/doc/r3.3.3/zookeeperStarted.html#sc_RunningReplicatedZooKeeper