如何启动Zookeeper并启动Kafka?

5

我正在使用Confluent Platform开始学习IT技术,需要运行Zookeeper (zookeeper-server-start /etc/kafka/zookeeper.properties)和Kafka (kafka-server-start /etc/kafka/server.properties)。我正在编写一个Upstart脚本,应该可以同时运行Kafka和Zookeeper。问题是Kafka必须等待Zookeeper准备就绪(因为它依赖于Zookeeper),但我找不到可靠的方法来知道Zookeeper何时准备就绪。以下是在运行Zookeeper服务器启动后尝试的一些伪代码:

  1. Use a hardcoded block

    sleep 5   
    

    Does not work reliably on slower computers and/or waits longer than needed.

  2. Check when something (hopefully Zookeeper) is running on port 2181

    wait until $(echo stat | nc localhost ${port}) is not none
    

    This did not seem to work as it doesn't wait long enough for Zookeeper to accept a Kafka connection.

  3. Check the logs

     wait until specific string in zookeeper log is found
    

    This is sketchy and there isn't even a string that cannot also be found on error too (e.g. "binding to port [...]").

有没有可靠的方法来确定Zookeeper何时准备好接受Kafka连接?否则,我将不得不采用1和2的组合方式。

我本以为技巧#2足够了。您能否请添加更多有关尝试技巧#2时启动失败的详细信息? - Chris Nauroth
1
@ChrisNauroth 在技巧#2中,我在Kafka中遇到的确切错误如下:"FATAL [Kafka Server 0],KafkaServer启动期间发生致命错误。准备关闭(kafka.server.KafkaServer) java.lang.RuntimeException: 在路径/brokers/ids/0上已经注册了一个代理。这可能表明您已经配置了一个已经在使用的brokerid,或者您已经关闭了这个broker并且重新启动得比zookeeper超时更快,因此它似乎正在重新注册。" -- 不过,如果在此之后添加延迟,那就没问题了。 - nico
没有人真正回答了这个问题:“如何启动Zookeeper然后启动Kafka”… - chenchuk
2个回答

5

我发现使用计时器并不可靠。第二个选项(等待端口)对我很有效:

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties && \
while ! nc -z localhost 2181; do sleep 0.1; done && \
bin/kafka-server-start.sh -daemon config/server.properties

3

你在评论中提到的Kafka错误信息绝对是相关的:

FATAL [Kafka Server 0], KafkaServer启动期间发生致命错误。准备关闭(kafka.server.KafkaServer) java.lang.RuntimeException: 在路径/brokers/ids/0上已经注册了一个broker。这可能表明您已经配置了一个已经使用的brokerid,或者您已经关闭了此broker并以比Zookeeper超时更快的速度重新启动它,因此它似乎正在重新注册。

这表明ZooKeeper正在运行,并且Kafka能够连接到它。正如我所预期的那样,技术#2足以验证ZooKeeper已准备好接受连接。

相反,问题似乎出现在Kafka方面。它已经注册了一个ZooKeeper 短暂节点 来代表起始的Kafka代理。短暂节点在客户端的ZooKeeper会话过期时自动删除(例如进程终止,因此停止向ZooKeeper发送心跳)。但是,这基于超时。如果Kafka代理快速重启,则在重启后,它会看到表示该代理的znode已经存在。对于新进程启动,这看起来像已经有一个代理在该路径上启动并注册。由于代理应具有唯一的ID,因此它会中止。
等待一段时间超过ZooKeeper会话过期是解决此问题的适当响应。如果需要,您可以根据ZooKeeper管理员指南中讨论的方式调整会话过期时间使其更快。 (请参阅tickTimeminSessionTimeout 和maxSessionTimeout的讨论。)但是,将会话过期调整为过于迅速可能导致客户端在正常操作期间遇到虚假的会话过期。
我对Kafka知道的不多,但也许在Kafka方面也有些事情可以做。我知道一些管理工具(如Apache Ambari)采取措施保证为每个经纪人分配唯一的ID。

2
Kafka本身为其代理提供了一个唯一的ID。这个特性是由Hortonworks的员工贡献的,因此Ambari也许正在使用该功能? - Gwen Shapira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接