Установка 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). Может принимать параметры: |
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer | Параметр отвечает за работу ACL. |
super.users= | В этом параметре задается список пользователей - администраторов |
allow.everyone.if.no.acl.found=False | Параметр определяет поведение ACL |
ssl.principal.mapping.rules= | Этот параметр используется для сопоставления CN из SSL-сертификата, с которым подключается клиент, с именем пользователя |
Пример настройки в статье Запуск кластера Kafka.