【问题标题】:Kafka won't start if a Zookeeper node is down如果 Zookeeper 节点关闭,Kafka 将不会启动
【发布时间】:2019-12-21 19:33:42
【问题描述】:

我将 Kafka 和 Zookeeper 放在同一个服务器上,有多个节点。

在 Kafka 的 server.properties 中,我有这样一行

zookeeper.connect=server1:2181,server2:2181...

问题是,在所有的 Zookeeper 节点都可用之前,Kafka 不会启动。否则,即使其他 Zookeeper 节点已启动,我也会收到类似“Kafka 启动期间的致命错误”和“超时等待连接状态:CONNECTING”的错误。

这使得独立编写每个节点的启动脚本变得具有挑战性,因为一个节点上的启动脚本依赖于其他节点的状态。

首先:这是预期的行为还是我做错了什么?假设我在 Zookeeper 集群中有 3 个节点;所有 3 个节点都必须启动 Kafka 才能启动?这似乎违反直觉,因为更大的集群实际上会增加启动失败的机会,而不是提供更多的弹性。

第二:对此有什么好的解决方案?让每个节点上的 Kafka 等到 Zookeeper 在所有节点上完全启动的唯一方法是吗?

【问题讨论】:

  • 还有多少 Zookeeper 服务器?它们是如何配置的?一项建议是不要同地
  • 我在 5 个 ZK 节点上也有类似的问题,如果一个 kakfa 实例连接的 ZK 节点出现故障,Kafka 节点将不会选择其他 4 个 ZK 节点之一连接并继续操作。 Kafka 将继续尝试重新连接到一个故障节点(尽管它知道其配置中的所有 5 个节点)。是否存在 kafka 需要五个节点之一启动的情况?也许复制问题和它需要的 znode 在其他地方不存在?

标签: apache-kafka apache-zookeeper


【解决方案1】:

据我所知,这是kafka正确启动的前提条件,我不觉得有太大的负担。如果 Zookeeper 集群本身在启动时已经出现问题,Kafka 本身可能会遇到问题,因此确保 Zookeeper 集群健康是一个很好的初始检查,恕我直言。

解决此限制的一种方法是配置一个单节点 Zookeeper 集群,并告诉 Kafka 使用该集群。事实上,您可以将 zookeeper 集群扩展到 3 个或更多节点,而 Kafka 已经启动并运行。更多详情可在这找到: Adding new ZooKeeper node in Kafka cluster?

作为记录,如果 Zookeeper 集群在启动并运行后出现故障,Kafka 本身就完全没问题。它只是无法接受新的生产者/消费者连接或创建主题,但集群上当前处于活动状态的连接仍然可以正常工作。

【讨论】:

    【解决方案2】:

    我们在生产环境中遇到了同样的问题。 原来是来自 zookeeper 库的错误 (ZOOKEEPER-2184),kafka 使用它与 zookeeper 对话。

    我们的 kafka 版本是 1.1.1,它使用 zookeeper-3.4.10.jar。

    我们换成zookeeper-3.4.13.jar后,kafka就可以重启成功了。

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 2018-11-04
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多