Я начинаю с Confluent Kafka, которому требуется запустить Zookeeper (zookeeper-server-start /etc/kafka/zookeeper.properties
), а затем Kafka (kafka-server-start /etc/kafka/server.properties
). Я пишу сценарий Upstart, который должен запускать как Kafka, так и Zookeeper. Проблема в том, что Kafka должен блокироваться до тех пор, пока Zookeeper не будет готов (потому что это зависит от него), но я не могу найти надежный способ узнать, когда Zookeeper готов. Вот некоторые попытки в псевдо-коде после запуска запуска сервера Zookeeper:Как начать Zookeeper, а затем Kafka?
Используйте жёстко прописанные Заблокировать
sleep 5
не работает надежно на медленных компьютерах и/или ждет дольше, чем это необходимо.
Проверить, когда что-то (надеюсь Zookeeper) работает на порту 2181
wait until $(echo stat | nc localhost ${port}) is not none
Это не похоже на работу, так как не ждать достаточно долго для Zookeeper принять соединение Кафка.
Проверьте журналы
wait until specific string in zookeeper log is found
Это схематично и не существует даже строка, которая не может также быть найдена на ошибках тоже (например, «привязка к порту [...]»).
Есть ли надежный способ узнать, когда Zookeeper готов принять соединение Kafka? В противном случае мне придется прибегнуть к комбинации 1 и 2.
Я бы ожидал, что техника № 2 будет достаточной. Не могли бы вы добавить более подробную информацию о том, как при неудачной попытке запуска при попытке использовать метод № 2? –
@ChrisNauroth Точная ошибка, которую я получаю в Kafka для техники № 2: «FATAL [Kafka Server 0], Неустранимая ошибка при запуске KafkaServer. Подготовьтесь к завершению работы (kafka.server.KafkaServer) java.lang.RuntimeException : Брокер уже зарегистрирован на пути/брокерах/идентификаторах/0. Это, вероятно, указывает на то, что вы либо настроили брокер, который уже используется, либо вы завершите работу этого брокера и перезапустили его быстрее, чем таймер ожидания zookeeper, чтобы он появился для перерегистрации ». - Хорошо, если я добавлю задержку после этого. – nico