6 ноября 2024 года опубликован очередной выпуск самой популярной платформы потоковой передачи событий. Что нового в Apache Kafka 3.9: динамические кворумы KRaft, улучшения многоуровневого хранилища, полезные фичи Kafka Streams и Kafka Connect.
Динамические кворумы KRaft
Релиз Apache Kafka 3.9 официально назван последним, который использует ZooKeeper в качестве службы синхронизации метаданных. Начиная с версии 4.0 и выше, Kafka всегда будет работать без ZooKeeper. Поэтому в текущем выпуске внесены изменения, которые упрощают миграцию с ZooKeeper на KRaft.
В режиме KRaft Kafka использует кворум Raft-процессов контроллера для хранения логов метаданных. Ранее кворумы контроллеров определялись статической конфигурацией, которую необходимо было установить на всех брокерах и контроллерах. Это делало изменение имен хостов контроллеров, а также их добавление или удаление очень сложными и требующими выключения работающего кластера от производственного режима. Чтобы избежать простоя, в релизе 3.9 ввели динамическое членство контроллера KRaft. Администраторы кластера Kafka теперь могут добавлять и удалять узлы контроллера, запуская инструмент kafka-metadata-quorum.sh или используя связанный API AdminClient.
Напомним, контроллером Kafka называется машина состояний метаданных — приложение, созданное с использованием уровня консенсуса KRaft. В KRaft каждый брокер является частью Raft-кворума, где один из них становится лидером. Лидер координирует запись и репликацию данных между брокерами, обеспечивая согласованность и отказоустойчивость. Все метаданные Kafka, такие как информация о топиках и ACL-списках, хранятся в логах Raft. Это упрощает управление и повышает производительность, поскольку метаданные реплицируются и согласуются так же, как и данные.
Контроллеры KRaft используют раздел метаданных для упорядочивания операций в кластере, фиксации их на диске и репликации их на другие контроллеры и брокеры. Консенсус по разделу метаданных кластера достигается избирателями – репликами, которые могут переходить в состояние кандидата и в состояние лидера раздела топика. Кандидату необходимо получить голоса от большинства из своего собственного набора избирателей, прежде чем он сможет стать лидером эпохи. Когда избиратель становится лидером, он будет использовать свой набор избирателей, чтобы определить, когда было зафиксировано смещение. Наблюдателем считается реплика, которая не входит в набор избирателей, т.е. ее ID и UUID не зафиксирован в наборе избирателей или отсутствует вообще.
Чтобы динамически изменять набор избирателей для раздела метаданных кластера KRaft, их набор сохраняется в журнале вместо свойств controller.quorum.voters. Это позволяет лидеру реплицировать эту информацию на все извлекающие реплики (избиратели и наблюдатели). Поскольку старые сегменты и записи лога могут быть удалены после создания снимка, снимки KRaft также содержат набор избирателей вплоть до включенного смещения.
Чтобы следующие избиратели могли обнаружить свой набор и их конечные точки из последнего лога лидера раздела, он отправляет эту информацию новым избирателям с помощью запроса BeginQuorumEpoch. Запрос BeginQuorumEpoch не отправляется наблюдателям, поскольку они динамические и не включены в лог раздела KRaft. Наблюдатель обнаружит лидера с помощью значений в конфигурации controller.quorum.bootstrap.servers. Это свойство должно включать хотя бы одного из доступных избирателей, иначе брокеры-наблюдатели не смогут обнаружить лидера раздела метаданных кластера KRaft. Согласованность изменений в наборе избирателей обеспечивает подтверждение от большинства конкурирующих наборов избирателей, т.е. текущего и нового наборов.
Другие новинки Kafka 3.9
Также в релизе 3.9 улучшено многоуровневое хранилище Kafka, о котором мы писали здесь. В частности, добавлен механизм динамического отключения многоуровневого хранения для каждого топика. Теперь администраторы могут устанавливать верхние границы скоростей загрузки и выгрузки многоуровневого хранилища. Кроме того, Kafka теперь раскрывает максимальное смещение, при котором данные раздела хранятся в удаленном хранилище. Еще добавлен флаг метаданных удаленного журнала в инструмент логирования дампа kafka-dump-log.sh. Это позволяет проверять записи многоуровневого хранения.
В Kafka Streams для управления частотой логирования добавлена конфигурация log.summary.interval.ms. Также введен новый обработчик исключений Kafka Streams для исключений, возникающих во время обработки. Ранее эта возможность отсутствовала: для проблем, возникающих во время обработки сообщения, разработчику требовалось добавлять конструкцию try/catch при использовании DSL или API процессора. Также можно реализовать DeserializationExceptionHandler для обработки проблем во время десериализации и ProductionExceptionHandler для проблем во время производства. Все неперехваченные исключения завершали обработку или StreamThread. Поэтому было решено добавить новый обработчик исключений, возникающих во время обработки сообщения, который будет создаваться один раз за StreamTask. Он будет вызываться, если исключение возникнет во время вызова ProcessorNode#process или StreamTask#punctuate. Если ответ обработчика исключений обработки равен ProcessingHandlerResponse.FAIL, то поток должен прекратить обработку записей и завершиться неудачей. Если ответ равен ProcessingHandlerResponse.CONTINUE, то поток продолжит обработку записей.
В заключение отметим еще несколько новинок Kafka Connect:
- улучшена обработка значений, допускающих значение NULL, в InsertField, ExtractField и других преобразованиях;
- добавлено свойство offset-syncs.enabled для отключения синхронизации конфигурации смещения трансляции в MirrorSourceConnector;
- добавлена конечная точка REST для определения работоспособности рабочих процессов Kafka Connect.
Узнайте больше про администрирование и эксплуатацию Apache Kafka на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Apache Kafka для инженеров данных
- Администрирование кластера Kafka
- Администрирование Apache Kafka в Kubernetes
Источники