如何确保kafka集群完全启动?

时间:2019-01-04 02:09:32

标签: apache-kafka

我们有3个Zookeeper在生产中运行着五个节点群集-所有都是VM。为了进行一些硬件修补,我们必须经常重新启动集群。

我们编写了一个ansible脚本来按以下顺序关闭集群,

  1. 通过终止进程来停止Kafka连接(依次连接1个,2个,3个节点)
  2. 使用kafka-server-stop.sh停止Kafka(依次1、2、3、4、5个节点)
  3. 使用zookeeper-server-stop.sh停止Zookeeper(依次1、2、3个节点)

修补后,启动脚本将执行以下操作

  1. 使用zookeeper-server-start.sh启动Zookeeper(依次1、2、3个节点)
  2. 使用kafka-server-start.sh启动Kafka(依次1、2、3、4、5个节点)
  3. 使用connect-distributed.sh启动Kafka连接(依次1、2、3个节点)

问题在于启动脚本的#3步骤,在执行#3(启动kafka connect)以使kafka集群完全启动并运行之前,我们保持了大约10分钟的硬编码延迟。但是有时候,集群中的某些节点需要更多的时间来启动,因此即使经过了延迟,kafka连接也无法启动-在这种情况下,我们必须等待30分钟,然后尝试再次手动重新启动连接。

在启动其他进程之前,有什么方法可以确保集群中的所有节点都已启动并正在运行吗?

谢谢。

硬编码延迟不起作用,我们无法在某些假设的情况下继续更改延迟

2 个答案:

答案 0 :(得分:1)

一旦所有代理都已启动,我们可以使用以下cmd来检查它们是否已形成集群。

  • 在kafka-1中,对其余代理运行以下命令,即i = 2、3、4和5:

    • nc -vz kafka-i 9092 [它应该返回connection succeeded]
  • 在每个代理节点中
  • tail server.log。它应该提供有关群集的信息。

  • 在Kafka bin目录中,您可以定期运行./zookeeper-shell.sh zk_host:zk_port并执行ls /brokers/ids。它应该给您五个条目,例如[0, 1, 2, 3, 4](如果所有5个经纪人都已注册到动物园管理员)。

一个肮脏(涉及较少)的黑客可能是创建一个具有5个分区的测试主题,然后等到每个代理将1个分区分配给自己。

答案 1 :(得分:1)

您可以从Java API中使用AdminClient#describeCluster,它可以向您返回Controller当前已知的集群中的节点列表。


此外,请勿像这样进行代理滚动重新启动。您应该首先确定哪个是Contoller,然后最后关闭它。