我们有3个Zookeeper在生产中运行着五个节点群集-所有都是VM。为了进行一些硬件修补,我们必须经常重新启动集群。
我们编写了一个ansible脚本来按以下顺序关闭集群,
修补后,启动脚本将执行以下操作
问题在于启动脚本的#3步骤,在执行#3(启动kafka connect)以使kafka集群完全启动并运行之前,我们保持了大约10分钟的硬编码延迟。但是有时候,集群中的某些节点需要更多的时间来启动,因此即使经过了延迟,kafka连接也无法启动-在这种情况下,我们必须等待30分钟,然后尝试再次手动重新启动连接。
在启动其他进程之前,有什么方法可以确保集群中的所有节点都已启动并正在运行吗?
谢谢。
硬编码延迟不起作用,我们无法在某些假设的情况下继续更改延迟
答案 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,然后最后关闭它。