Как в Kafka происходит назначение партиций брокерам?

«Как в Kafka происходит назначение партиций брокерам?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kafka распределение партиций топика по брокерам кластера управляется контроллером (специальным брокером) и следует определенным правилам для обеспечения балансировки и отказоустойчивости.

Основные правила и механизмы:

  1. Распределение партиций при создании топика:

    • Партиции и их реплики равномерно распределяются по всем доступным брокерам.
    • Алгоритм стремится разместить лидера партиции и ее реплики на разных брокерах (и в разных стойках, если настроена rack awareness).
      // Создание топика с 4 партициями и фактором репликации 3
      try (AdminClient admin = AdminClient.create(props)) {
      NewTopic newTopic = new NewTopic("orders", 4, (short) 3);
      admin.createTopics(Collections.singleton(newTopic));
      }
  2. Роли реплик:

    • Лидер (Leader): Обрабатывает все запросы на чтение и запись для своей партиции.
    • Последователь (Follower): Пассивно реплицирует данные с лидера. При отказе лидера один из синхронизированных последователей автоматически становится новым лидером.
  3. Ребалансировка:

    • При добавлении нового брокера в кластер Kafka может автоматически перераспределить часть партиций на него, чтобы выровнять нагрузку.
    • При выходе брокера из строя контроллер назначает новые лидеры для партиций, которые он обслуживал, из числа их реплик на других брокерах.
  4. Ручное назначение (для особых случаев):

    • С помощью утилиты kafka-reassign-partitions.sh можно вручную задать целевое размещение реплик, что используется для оптимизации производительности или соблюдения требований размещения данных.