По умолчанию Apache Kafka использует Zookeeper для хранения метаданных. Zookeeper — хорошее зрелое программное обеспечение. Несмотря на это, это доставляет некоторые неудобства. Если вы постоянно используете Kafka, вы, вероятно, были бы рады удалить зависимость от Zookeeper. Я лично много лет использую Kafka как для критичных к задержке, так и для простых сообщений в течение нескольких лет, и я хотел бы избавиться от Zookeeper.

У Kafka есть экспериментальный режим, который позволяет запускать Kafka без Zookeeper. Он был нестабилен и не рекомендовался для использования в производстве. Но в Kafka 3.3 (КИП-833) он помечен как готовый к производству.

Если вы думаете об обновлении до новой версии, вы можете найти полезную информацию. Я расскажу о различиях в развертывании, совместимости, мониторинге, производительности и общем резюме для Zookeeper-Kafka и KRaft-Kafka. Это краткий обзор от пользователя Kafka.

Почему Kafka использует Zookeeper?

Kafka нужно где-то хранить метаданные и управлять ими, например. какой узел является лидером раздела. Готовые бинарные файлы Kafka включают Zookeeper, и они тестируются на предоставленной версии. Zookeeper — это компонент с открытым исходным кодом для хранения информации о конфигурации, обеспечения распределенной синхронизации и других вещей. Вам необходимо развертывать, отслеживать и поддерживать его отдельно от Kafka. Имейте в виду, что обычно вам нужен кластер узлов Zookeeper, а не один узел Zookeeper. Итак, если вы хотите использовать Kafka, вам нужно поддерживать и знать две распределенные системы вместо одной.

Кроме того, вы можете столкнуться с некоторыми ошибками и проблемами в версии Zookeeper, которую Kafka предоставляет по умолчанию. Конечно, вы можете использовать другую версию Zookeeper, но вам необходимо убедиться, что ваша версия Zookeeper совместима с вашей версией Kafka. Если ваша система очень критична, например. вы обеспечиваете высокий ежемесячный процент времени безотказной работы, и вы не можете терять или задерживать сообщения, вы определенно не можете выбрать какой-либо теоретически совместимый Zookeeper. Например, в моей версии Zookeeper есть серьезные ошибки, и я покрыл их патчами, правилами мониторинга и т. д.

Более того, были попытки замены Zookeeper на Atomix (https://github.com/atomix), etcd и другие решения. Однако ни один из них не стал популярным и широко не использовался в качестве замены Zookeeper.

Вот краткое описание, если вы хотите использовать Zookeeper-Kafka:

  • Вам необходимо развернуть и поддерживать еще одну распределенную систему для хранения и управления метаданными. У вас будет больше сценариев развертывания, правил мониторинга, людей, которые должны знать эту систему. Не обязательно на 100% иметь именно Zookeeper, но обычно он есть.
  • Выбранный координатор должен быть совместим с Kafka. Каждый раз, когда вы обновляете эту систему или Кафку, вам нужно проверять, что все вместе работает нормально. Если Kafka — действительно важная система в вашем потоке, вам нужно будет протестировать множество пограничных случаев, чтобы быть уверенным, что вы переживете сбои, производительность не ухудшится, мониторинг по-прежнему работает правильно и т. д.

По сравнению с KRaft

В режиме KRaft Kafka самостоятельно управляет метаданными. Это означает, что все метаданные хранятся только в Kafka. KRaft — это реализация консенсусного протокола Raft для Kafka, в то время как Zookeeper использует протокол под названием ZAB. С KRaft вам не нужен Zookeeper и вы запускаете только кластер Kafka (KIP-500).

Теперь вы заботитесь только об одной распределенной системе. Вы настраиваете правила безопасности и мониторинга только для Kafka. Можно обновить Kafka и не думать о совместимости с Zookeeper. Все ваши инструменты посвящены Кафке.

Развертывание

Если вы используете Zookeeper, вам необходимо иметь нечетное количество экземпляров Zookeeper (2N+1). Лучшей практикой и рекомендацией является наличие 5 или 7 экземпляров Zookeeper. Вам нужно иметь эти зоо-экземпляры как минимум в 3-х датацентрах, чтобы продолжить работу в случае проблем с дата-центром или сетью и т. д. Но у инстансов Kafka нет такого требования, как у Zookeeper. Вы можете иметь четных или нечетных брокеров Kafka и работать хорошо.

Итак, вам нужно:

  • Разверните нечетное количество узлов Zookeeper. Их тоже нужно настраивать, но обычно для использования Zookeeper с Kafka это не составляет большого труда, например, с Zookeeper+ClickHouse нужно уделить больше внимания.
  • Вам нужно добавить свойство zookeeper.connect в файл server.properties в ваших двоичных файлах Kafka.

На самом деле для настройки Zookeeper не так много шагов.

Экземпляр Kafka в KRaft может работать в разных режимах:

  1. Маклер
  2. Контроллер
  3. Брокер+Контролер

KRaft Kafka без Zookeeper требует наличия нечетного количества экземпляров Kafka в режиме Controller или Broker+Controller.

Чтобы запустить свой кластер, вам нужно:

  1. Создайте идентификатор кластера: «bin/kafka-storage.sh random-uuid».
  2. Отформатируйте каталоги журналов: «bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties».
  3. Выберите нужный режим для этого конкретного экземпляра и сохраните его в файле свойств в ваших двоичных файлах Kafka, например. «process.roles=брокер,контроллер».
  4. Заполните поле: «controller.quorum.voters» kafka-адресами. Это похоже на заполнение свойства zookeeper.connect в подходе Zoo-Kafka, но в данном случае мы используем адреса Kafka вместо Zookeeper.
  5. Добавьте «КОНТРОЛЛЕР» в свои слушатели и карту безопасности в свойствах.

Теперь в начальной настройке Kafka больше шагов, учтите, что вам нужно повторить их N раз, если у вас многоузловое развертывание. В качестве вознаграждения вам не нужно настраивать и развертывать узлы Zookeeper.

Большинство других свойств такие же, и вы можете скопировать и вставить их из вашего текущего Zookeeper-Kafka. Подробная настройка выходит за рамки этой статьи, но вы можете использовать следующие ссылки в качестве хорошего начала:

https://kafka.apache.org/quickstart

https://kafka.apache.org/documentation/#configuration

Совместимость

Надеюсь, вы протестируете свои изменения, прежде чем применять их к средам с реальными данными 🙂.

В любом случае, по информации из КИПов, вы можете использовать своих производителей/потребителей и никаких изменений не требуется. Я пробовал свои приложения с «org.apache.kafka:kafka-clients:2.4.0» и Apache Kafka 3.3.1, и все работало нормально, никаких изменений, как было обещано, не произошло.

Итак, режим KRaft совместим с вашими клиентами и вам не нужно их обновлять или что-то менять в своем коде. Это очень хороший момент!

Мониторинг

Я использую https://github.com/danielqsj/kafka_exporter (Prometheus+Grafana). Он отлично работает с обеими версиями Kafka. Вам не нужно менять правила и метрики, все работает так же. Кроме того, вы, как и прежде, можете брать метрики из JMX. Еще один хороший момент.

Кроме того, теперь вам не нужно следить за Zookeeper. Однако в KRaft Kafka появились новые показатели, связанные с кворумом. И есть смысл добавить их в свой мониторинг.

Производительность

Авторы KRaft заявляют, что KRaft Kafka поддерживает миллионы разделов и это больше, чем раньше. Кроме того, KRaft сокращает время выключения и восстановления. Конечно, я рекомендую вам протестировать вашу собственную настройку. У меня есть кластеры для критичных к задержке приложений и кластеры с высокой пропускной способностью. Я протестировал разные нагрузки и настройки kafka для обоих из них и не нашел каких-либо существенных различий между KRaft Kafka и Zookeeper Kafka. Это был счастливый путь испытаний. Контролируемое завершение работы с KRaft было примерно в 3 раза быстрее для моего оборудования и настроек.

Производительность — это большая тема, и она заслуживает отдельной статьи, потому что есть много тем для обсуждения. Но падения производительности после обновления я не обнаружил. Ради краткости я не стал включать свои измерения производительности. Если вас интересуют подробные результаты и бенчмарки, пишите в комментариях. Также я нашел бенчмарки от других людей, и они подтвердили мое наблюдение.

Резюме по производительности: если у вас нет миллионов разделов, вы не увидите разницы в сценариях без отключений, разбивки сети, восстановления и т. д. Это ожидаемо, потому что KRaft и Zookeeper используются для операций с метаданными, а не для производства/потребления. Но всегда проверяйте свои профили нагрузки, настройки и оборудование.

Тестирование хаоса

Есть несколько моментов, касающихся способности KRaft Kafka выживать при неожиданных сбоях:

  • У меня есть набор тестов с различными краш-тестами, сбоями в инфраструктуре, сценариями аварийного восстановления. К сожалению, Kafka 3.3.1 в режиме KRaft его не прошел. Когда я разбил один из узлов контроллера, этот узел не запускался снова, пока я не очистил каталог данных kafka-log. Были проблемы с KafkaRaftClient, метаданными и очисткой логов. Я не нашел эту проблему на трекере Jira или GitHub, но нашел похожие проблемы. Некоторые из них исправлены, некоторые нет. Это проблема конфигурации, связанная с новыми настройками KRaft, или это ошибка? Я буду смотреть в него. Но, в любом случае, вычищать все данные с ноды после случайной гибели не очень хорошо. Я не поймал эту проблему с Zookeeper Kafka. Я обновлю этот пост тестовым случаем или решением. Если это не проблема конфигурации, я сообщу об этом. Я протестировал последнюю (на момент публикации) релизную версию Kafka 3.3.1.
  • Я не нашел никакой информации о том, что KRaft прошел тесты Jepsen. Информации об экспериментах KRaft с хаосом в Интернете нет.

Имейте в виду, что это новый режим, и у него еще не так много отзывов/отчетов. Чем больше людей начнет использовать KRaft, тем больше проблем можно будет обнаружить.

Краткое содержание

Плюсы КРафт Кафка:

  1. Архитектура проще и понятнее. Вам нужно настроить безопасность и мониторинг только для одной системы.
  2. Теперь вам не нужно синхронизировать свои версии Zookeeper и Kafka. Вам нужно проверить матрицу совместимости.
  3. Еще одна причина покинуть Zookeeper — обеспечить лучшую масштабируемость. KRaft Kafka поддерживает большее количество разделов.
  4. Нет никакой разницы в пропускной способности/задержке в обычных сценариях PubSub. Но выключения и восстановления происходят быстрее.

Если у вас много разделов или вы хотите иметь их миллионы, имеет смысл обновиться, даже если вы используете режим Zookeeper, потому что кластер с новой версией Kafka имеет лучшую пропускную способность по сравнению со старыми версиями.

Минусы KRaft Kafka:

  1. Вы не можете обновить текущий кластер Kafka из режима Zookeeper в режим KRaft. Он будет улучшен в будущих выпусках.
  2. Вам необходимо отредактировать сценарии развертывания Kafka, некоторые инструменты администрирования и сценарии также могут потребовать изменений. И независимо от того, следите вы за Zookeeper или нет, но лучше добавить новые правила мониторинга о самоуправляемом контроллере метаданных.
  3. Нет информации о KRaft от Jepsen или других известных в отрасли компаний. Мое собственное тестирование хаоса сломало KRaft Kafka, и я не смог запустить его снова, не очистив каталог данных журнала.
  4. Возможно, есть какие-то критические необнаруженные баги, т.к. KRaft еще не получил широкого распространения. Требуется время, чтобы собрать отзывы сообщества.

Решение

Несмотря на все нюансы, Zookeeper является хорошим программным обеспечением, выдержавшим испытание временем и широко используемым многими инженерами и компаниями. Более того, он протестирован Jepsen. Однако с точки зрения пользователя Kafka не имеет смысла иметь две распределенные системы вместо одной. И конечно многие ждут удаления Zookeeper из Kafka.

Но я не рекомендую прямо сейчас переключать ваше производство на KRaft Kafka, если оно используется для важных потоков. Кроме того, выходит новая версия выпуска, которая будет поддерживать миграцию со старых кластеров Kafka. Я думаю, что компании, которые используют Kafka для финансовых данных, не будут использовать KRaft в течение нескольких лет.

Хорошо, если вы попробуете и протестируете его, сообщите об ошибках и внесите свой вклад. Kafka — это решение с открытым исходным кодом, и каждый может его улучшить. Конечно, есть исключения, и если вы используете KRaft в продакшене, поделитесь им в комментариях, нравится ли вам это или приносит больше проблем?