Репликация в Kafka

В данной статье описаны принципы репликации в Kafka и способы ее настройки.

ПРИМЕЧАНИЕ

Репликация — механизм, который создает и распределяет на брокерах точные копии каждой партиции топика в Kafka.

Репликация обеспечивает доступность сообщений в случае сбоев или технического обслуживания.

Фактор репликации в Kafka

Фактор репликации (replication factor) — параметр, определяющий количество копий (реплик) каждой партиции.

Каждая реплика партиции записывается на отдельный брокер-фолловер (follower). Реплик каждой партиции не может быть больше, чем брокеров.

На рисунке ниже показано, как происходит распределение реплик одной партиции на брокерах, запись сообщений производителем, а также чтение сообщений потребителем.

Реплики, распределенные на брокерах
Реплики, распределенные на брокерах
Реплики, распределенные на брокерах
Реплики, распределенные на брокерах

Операции записи сообщений выполняются через брокера-лидера партиции (leader). Операции чтения сообщений могут быть выполнены как через лидера (по умолчанию), так и через фолловеров (начиная с версии Kafka 2.4).

Выбор лидера для каждой партиции производится при помощи ZooKeeper в соответствии с протоколом алгоритма консенсуса ZAB (ZooKeeper Atomic BroadCast).

Лидеры партиций равномерно распределяются между брокерами. Каждый брокер может быть лидером для одной партиции и фолловером для другой.

Фактор репликации в Kafka для кластера определяется параметром default.replication.factor. Все топики, созданные в кластере, будут создаваться с заданным для кластера фактором репликации по умолчанию.

Также он может быть установлен индивидуально для топика:

Если в конфигурации топика указано значение фактора репликации больше, чем существует брокеров в кластере, топик не будет создан.

Фактор репликации для созданного топика не может быть переопределен. Если для всего кластера значение фактора репликации изменено, только новые топики будут создаваться с новым фактором репликации.

Синхронизация реплик

Синхронизация реплик актуальна при значении фактора репликации больше 1 и значении all, присвоенном параметру acks. Такое сочетание параметров приближает к достижению гарантий доставки сообщений exactly once.

Взаимодействие между лидером и фолловерами основано на модели обмена сообщениями, использующейся в ZooKeeper.

Журналы фолловеров стремятся быть копией журнала лидера, иметь одинаковые смещения и сообщения в одном и том же порядке. Реплика, содержащая все сообщения, записанные в журнал лидера, называется синхронизированной репликой (In-Sync Replica, ISR).

Ниже на рисунке показано, как достигается синхронизация реплик.

Синхронизация реплик
Синхронизация реплик
Синхронизация реплик
Синхронизация реплик

Основной параметр, контролирующий синхронизацию реплик — replica.lag.time.max.ms. Это временной период, по истечении которого лидер принимает решение, что реплика записала (если произошло подтверждение записи) или не записала (не произошло подтверждение записи) сообщение.

Критерий успешности записи соoбщения в целом определяет параметр min.insync.replicas — минимальное количество реплик, которые должны подтвердить запись (также может быть установлен и изменен для каждого топика индивидуально при помощи параметра min.insync.replicas). Только при достижении числа реплик, указанного в этом параметре, лидер передает данные о записанной партиции (метаданные) и о созданных ISR в контроллер.

После получения сообщения лидер предлагает запись сообщения репликам и ждет от них подтверждения. Получив подтверждение от нужного количества реплик (параметр min.insync.replicas), лидер отправляет сигнал о фиксации сообщений в реплики и подтверждение для производителя. Только тогда сообщение становится доступно для чтения.

Рекомендации для настройки параметров репликации

Фактор репликации

Существует общая рекомендация устанавливать значение 3 для фактора репликации.

На самом деле точное значение параметра зависит от требований и ресурсов вашей системы. При выборе значения стоит обратить внимание на следующее:

  • Высокий фактор репликации обеспечивает лучшую устойчивость системы.

  • Высокий фактор репликации может вызвать более высокую задержку, с которой сталкиваются производители, поскольку данные необходимо реплицировать на все брокеры реплик, прежде чем будет возвращено подтверждение.

  • Высокий фактор репликации требует большого дискового пространства из-за большого количества копий данных на дисках для обеспечения высокой доступности (High Availability, HA).

Количество партиций топика

Устанавливая фактор репликации, следует помнить, что на работу системы также влияет параметр num.partitions — количество партиций всех топиков в кластере (может быть установлен при помощи опции --partitions для отдельного топика). Фактор репликации и количество партиций являются параметрами, работающими в связке, и от их настройки зависят производительность и долговечность системы.

При выборе значения параметра num.partitions стоит обратить внимание на то, какие возможности и ограничения вызывает большое количество партиций:

  • Дает возможность объединять больше потребителей в группу для масштабирования.

  • Позволяет использовать более эффективно имеющиеся брокеры кластера.

  • Увеличивает нагрузку на ZooKeeper — выбор лидера, поддержка списка синхронизированных реплик.

  • Увеличивает количество файлов, созданных и открываемых на брокерах.

Синхронизированные реплики

Параметр min.insync.replicas в сочетании с параметром acks, которому присвоено значение all, оказывает влияние на гарантию доставки сообщений при использовании семантики exactly once.

Параметр min.insync.replicas рекомендуется устанавливать меньше, чем фактор репликации, иначе даже при отказе одного брокера запись сообщения не будет подтверждена из-за недостаточности синхронизированных реплик.

Стандартный рекомендуемый сценарий для обеспечения высоких гарантий надежности:

Дополнительные возможности

Начиная с Apache Kafka 2.4 можно настроить потребителей для чтения из ближайжих синхронизированных реплик.

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

  • broker.rack — указание принадлежности к определенной стойке для брокеров. Для каждого брокера должна быть назначена стойка. Для эффективной работы плагина рекомендуется настроить одинаковое количество брокеров на стойку — таким образом реплики будут равномерно распределены по брокерам.

  • client.rack — настройка идентификатора стойки для подключения потребителей.

Плагин RackAwareReplicaSelector пытается сопоставить client.rack потребителя с доступными broker.racks. Затем он выбирает реплику, имеющую тот же идентификатор стойки, что и потребитель.

Настройка репликации

Настройка кластера

После добавления и установки сервиса Kafka в составе кластера ADS настройка фактора репликации и количества партиций выполняется на странице конфигурирования сервиса Kafka в интерфейсе ADCM. Для этого необходимо раскрыть узел Main в дереве конфигурационных настроек и ввести новое значение для параметров.

Настройка фактора репликации для кластера
Настройка фактора репликации и количества партиций для кластера

Для изменения значения по умолчанию для параметра min.insync.replicas и других параметров брокера, отсутствующих в интерфейсе ADCM, необходимо перевести в активное состояние переключатель Show advanced и раскрыть узел server.properties в дереве конфигурационных настроек. Используя поле Add key,value, выберите Add property и введите наименование параметра и его значение.

Добавление параметра min.insync.replicas
Добавление параметра min.insync.replicas

После изменения параметров при помощи интерфейса ADCM перезагрузите сервис Kafka. Для этого примените действие Restart, нажав на иконку actions default dark actions default light в столбце Actions.

После ввода новых значений и параметров все изменения отображаются в конфигурационном файле /usr/lib/kafka/config/server.properties.

Настройка топика

Настройка фактора репликации для отдельного топика выполняется в командной строке. Для этого используется скрипт kafka-topics.sh c применением опции --replication-factor при создании нового топика.

Значение параметра min.insync.replicas может быть изменено при помощи опции --config, которая переопределяет параметры конфигурации для существующего топика или устанавливает параметры конфигурации при создании нового топика.

Пример настройки фактора репликации и параметра min.insync.replicas при создании топика при помощи командной строки
$ /usr/lib/kafka/bin/kafka-topics.sh --create --topic new-topic --replication-factor 3 --config min.insync.replicas=2 --bootstrap-server localhost:9092

Также существует возможность настройки репликации для отдельного топика при помощи пользовательского интерфейса CMAK, который становится доступен после добавления и установки сервиса Kafka-Manager в кластере ADS.

Настройка фактора репликации может быть выполнена при создании нового топика.

Пример настройки фактора репликации при создании топика при помощи сервиса Kafka-Manager

Выбрав Topic → Create в верхнем меню, перейдите к созданию топика. Установите значения параметров, в том числе параметр Replication Factor, и нажмите Create.

Создание топика в Kafka-Manager
Создание топика в Kafka-Manager
Создание топика в Kafka-Manager
Создание топика в Kafka-Manager

Настройка параметра min.insync.replicas может быть выполнена для существующего топика или при создании нового топика.

Пример настройки параметра min.insync.replicas для существующего топика при помощи сервиса Kafka-Manager

Выбрав Topic → List в верхнем меню, перейдите к списку топиков. В списке выберите нужный топик, нажав на название. На открывшейся странице топика нажмите кнопку Update Config.

Переход к настройке топика в Kafka-Manager
Переход к настройке топика в Kafka-Manager
Переход к настройке топика в Kafka-Manager
Переход к настройке топика в Kafka-Manager

Установите необходимое значение параметра min.insync.replicas и нажмите кнопку Update Config.

Настройка топика в Kafka-Manager
Настройка топика в Kafka-Manager
Настройка топика в Kafka-Manager
Настройка топика в Kafka-Manager
ПРИМЕЧАНИЕ

Для получения информации об основных принципах работы в сервисах Kafka и Kafka-Manager можно обратиться к статье Начало работы c Kafka.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней