nic*_*ico 5 apache-kafka apache-zookeeper
我正在开始使用Confluence Platform,它需要运行 Zookeeper ( zookeeper-server-start /etc/kafka/zookeeper.properties),然后运行 Kafka ( kafka-server-start /etc/kafka/server.properties)。我正在编写一个应该同时运行 Kafka 和 Zookeeper 的 Upstart 脚本。问题是 Kafka 应该阻塞直到 Zookeeper 准备好(因为它取决于它),但我找不到可靠的方法来知道 Zookeeper 何时准备好。以下是运行 Zookeeper 服务器启动后的一些伪代码尝试:
使用硬编码块
sleep 5
Run Code Online (Sandbox Code Playgroud)
在速度较慢的计算机上无法可靠工作和/或等待时间超过所需时间。
检查端口 2181 上何时运行某些内容(希望是 Zookeeper)
wait until $(echo stat | nc localhost ${port}) is not none
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,因为它没有等待足够长的时间让 Zookeeper 接受 Kafka 连接。
检查日志
wait until specific string in zookeeper log is found
Run Code Online (Sandbox Code Playgroud)
这是粗略的,甚至没有一个字符串也不能在错误中找到(例如“绑定到端口[...]”)。
有没有可靠的方法来知道 Zookeeper 何时准备好接受 Kafka 连接?否则,我将不得不采用 1 和 2 的组合。
我发现使用计时器并不可靠。第二个选项(等待端口)对我有用:
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
Run Code Online (Sandbox Code Playgroud)
您评论中的 Kafka 错误消息绝对相关:
FATAL [Kafka Server 0],KafkaServer 启动期间出现致命错误。准备关闭 (kafka.server.KafkaServer) java.lang.RuntimeException: 代理已在路径 /brokers/ids/0 上注册。这可能表明您要么配置了已在使用的brokerid,要么您已关闭该代理并以比zookeeper超时更快的速度重新启动它,因此它似乎正在重新注册。
这表明 ZooKeeper 已启动并正在运行,并且 Kafka 能够连接到它。正如我所期望的,技术 #2 足以验证 ZooKeeper 是否已准备好接受连接。
相反,问题似乎出在 Kafka 方面。它注册了一个 ZooKeeper临时节点来代表启动的 Kafka 代理。当客户端的 ZooKeeper 会话过期时(例如,进程终止,因此它停止向 ZooKeeper 提供心跳),临时节点将被自动删除。然而,这是基于超时的。如果 Kafka Broker 快速重启,那么重启后,它会看到代表该 Broker 的 znode 已经存在。对于新进程的启动,看起来已经有一个代理在该路径上启动并注册。由于经纪人应该拥有唯一的 ID,因此它中止了。
等待 ZooKeeper 会话过期一段时间是解决此问题的适当方法。如有必要,您可以将会话过期时间调整为更快,如ZooKeeper 管理员指南中所述。tickTime(请参阅、minSessionTimeout和的讨论maxSessionTimeout。)但是,将会话过期调整得太快可能会导致客户端在正常操作期间遇到虚假会话过期。
我对Kafka了解较少,但也许Kafka方面也可以做一些事情。我知道一些管理工具(例如Apache Ambari)会采取措施来保证在配置时为每个代理分配唯一的 ID。
| 归档时间: |
|
| 查看次数: |
10267 次 |
| 最近记录: |