我把kafka和zookeeper放在同一台服务器上,有多个节点。
在kafka的server.properties中,我有一行 zookeeper.connect=server1:2181,server2:2181...
问题是,在所有zookeeper节点都可用之前,kafka不会启动。否则,即使其他zookeeper节点已启动,我也会收到类似“kafka启动期间发生致命错误”和“在状态为:连接时等待连接超时”的错误。
这使得独立编写每个节点的启动脚本非常困难,因为一个节点上的启动脚本依赖于其他节点的状态。
第一:这是预期的行为还是我做错了什么?假设zookeeper集群中有3个节点;所有3个节点都要启动才能启动Kafka?这似乎有悖常理,因为更大的集群实际上会增加启动失败的几率,而不是提供更多的恢复能力。
第二:有什么好的解决办法?唯一的方法是让每个节点上的kafka等待zookeeper在所有节点上完全启动吗?
2条答案
按热度按时间lp0sw83n1#
据我所知,这是Kafka正确启动的先决条件,我不认为有太大的负担。imho说,如果zookeeper集群本身在启动时已经出现问题,那么kafka本身可能会遇到问题,因此确保zookeeper集群正常运行是一个很好的初始检查。
绕过此限制的一种方法是配置一个单节点zookeeper集群,并告诉kafka使用该集群。之后,您可以将zookeeper集群扩展到3个或更多节点,而kafka已经启动并运行。更多细节可以在这里找到:在kafka集群中添加新的zookeeper节点?
作为记录,Kafka本身是完全好的,如果zookeeper集群一旦启动并运行就停止运行。它只是无法接受新的生产者/消费者连接或创建主题,但是集群中当前活跃的那些仍然可以正常工作。
6qftjkof2#
我们在生产环境中遇到了同样的问题。原来是Kafka用来和zookeeper交谈的zookeeper库中的一个bug(zookeeper-2184)。
我们的kafka版本是1.1.1,它使用zookeeper-3.4.10.jar。
用zookeeper-3.4.13.jar替换后,kafka可以成功重启。