Перейти к основному содержимому
Версия: 5.1

Установка Apache Kafka

Общие сведения

В данном разделе рассматривается процесс развертывания кластера Kafka с использованием протокола Kafka Raft и механизмов ACL и SSL/TLC на серверах под управлением операционной системы Ubuntu Server 20.04.

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

  • Raft - алгоритм консенсуса, обеспечивающий согласованность данных в распределенной системе
  • Kafka RAFT - реализация Raft в Kafka, позволяющая кластеру Kafka самому управлять своими метаданными - топики, партиции, брокеры

Основные понятия Kafka:

  • Topic - основная единица организации данных в Kafka. Каждый топик имеет уникальное имя в кластере
  • Partition - топик делится на партиции, упорядоченные, неизменяемые журналы сообщений - файлы фиксированного размера. Партиции служат для масштабирования и параллельной обработки. Сonsumer считывает данные из партиции в том же порядке, в котором они были записаны producer
  • Offset (смещение)- каждое сообщение, добавленное в партиции, получает идентификатор - 64-битное монотонно возрастающее значение, назначаемое брокером. Каждая партиция имеет одну лидирующую реплику (лидера) и одну или несколько реплик-фолловеров
  • Replica - для обеспечения надежности хранения данных в Kafka реализован механизм репликации партиций между брокерами. Это гарантирует наличие нескольких копий одной и той же записи в топике, размещенной на разных узлах кластера. Количество реплик и партиций определяется при создании топика или задается через конфигурационные параметры Kafka
  • Producer - приложение для публикации записей в топик
  • Consumer - приложение для чтения записей из топика
  • Consumer Group - группа Consumer, совместно считывающих записи из топика

Кластер Kafka делит узлы на две роли - контроллеры (Controller Nodes) и брокеры (Broker Nodes). Контроллеры участвуют в Raft консенсусе. Количество контроллеров всегда должно быть нечетным.

Для тестовой среды достаточно одного контроллера, для продуктивной не менее 3-х (допускается отказ одной ноды). Для высоконагруженных кластеров достаточно 5 контроллеров (допускается отказ 2-х нод). Среди контроллеров всегда есть только один лидер. Выбор лидера происходит путем "голосования" нод контроллеров - требуется кворум - выбор большинством голосов. Для кластера из 3 контроллеров, кворум = 2, из 5 контроллеров, кворум = 3. Лидер управляет метаданными (топики, партиции и т.д.). При отказе лидера, остальные узлы запускают процесс голосования за выбор нового лидера. Брокеры хранят данные и обслуживают запросы.

Роль узла определяет запись process.roles=controller или process.roles=broker в конфигурационном файле кластера. Возможно комбинировать роли process.roles=controller,broker - узел Kafka будет выполнять сразу две роли. Категорически не рекомендуется для продуктивной среды.

  • ACL(Access Control Lists) - списки контроля доступов. ACL в Kafka определяет, какие клиенты имеют права на выполнение определенных операций - создание/удаление топиков, запись/чтение из топиков и т.д.
  • SSL/TLC - шифрование и аутентификации. SSL обеспечивает безопасное соединение и аутентификацию клиента. ACL определяет, какие действия ему разрешены

Эти механизмы также используются и в межброкерном взаимодействии.

Чтобы включить ACL в Kafka, нужно в конфигурационных файлах Кafka - controller.properties, broker.properties определить следующие параметры:

ПараметрОписание
ssl.keystore.location=

    Путь к keystore, в котором хранится сертификат и ключ текущего сервера.

ssl.keystore.password=

    Пароль для доступа keystore.

ssl.truststore.location=

    Путь к trustsore, в котором хранятся сертификаты доверенных корневых и промежуточных СА.

ssl.truststore.password=

    Пароль для доступа к truststore.

ssl.client.auth=

    Параметр служит для настройки взаимной аутентификации (mTLS). Может принимать параметры:

    • none - клиенты не обязаны предоставлять сертификат
    • requested - сервер запрашивает сертификат у клиента, но соединение не разрывается, если клиент не предоставляет сертификат
    • required - клиент обязан предоставить сертификат, иначе сервер разорвет соединение
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer

    Параметр отвечает за работу ACL.

super.users=

    В этом параметре задается список пользователей - администраторов Kafka. Они могут выполнять любые действия с кластером вне зависимости от настроек ACL для них.

allow.everyone.if.no.acl.found=False

    Параметр определяет поведение ACL Kafka при отсутствии явно заданных правил для определенного топика. Параметр true: если для топика нет заданного ни одного правила ACL, доступ к нему будет разрешен для всех пользователей Kafka. Параметр false запрещает доступ в топику всех пользователям, для которых не настроен ACL для этого топика. Ограничение не распространяется на пользователей из параметра super.user.

ssl.principal.mapping.rules=

    Этот параметр используется для сопоставления CN из SSL-сертификата, с которым подключается клиент, с именем пользователя Kafka, которое будет использоваться для авторизации и для которого созданы правила ACL.

Пример настройки в статье Запуск кластера Kafka.