Немного о настройках при работе с Kafka, на которые стоит обратить внимание

Этот пост - небольшой конспект доклада с Highload Кафка. “Описание одной борьбы” / Денис Карасик (Badoo). Как ясно из заголовка статьи, здесь будет рассказано о некоторых важных параметрах конфигурации брокеров, топиков и producer’ов

Важные Параметры

Конфигурация брокеров

Одинаковая производительность брокеров

Когда producer пишет в partition, то он пишет в ту реплику, которая является лидером для этого partition. Consumer также читает данные с этого лидера, однако только что записанное сообщение не будет сразу доступно для чтения consumer’ам. Все остальные брокеры должны его себе среплицировать (конечно, зависит от replica factor), и только потом сообщения будет доступно для чтения.

К чему это приводит? Скорость кластера зависит от скорости самого медленного брокера, поэтому все брокеры должны иметь одинаковую производительность и иметь между собой быстрое сетевое соединение

Частота проверки новых данных

replica.fetch.wait.max.ms - в самом докладе и много где на просторах интернета говорят, что это по сути параметр, который регулирует частоту запросов новых сообщений с лидера. Однако в документации он описан как max wait time for each fetcher request issued by follower replicas, что скорее означает, что это максимальное время ожидания ответа от лидера при запросе данных со стороны реплики

Максимально допустимое отставание реплики от лидера

replica.lag.time.max.ms - максимальный промежуток временени, в течение которого реплика не просто должна прислать запрос на получение новых данных, но и также забрать свежие сообщения. Если реплика не успевает, то она исключается из списка ISR (in-sync replicas)

Конфигурация producer’ов

Разумная настройка acks на стороне producer’а

Когда producer пишет данные в kafka, он может ожидать подтверждения записи этих данных не только лидером, но и всеми остальными репликами. Что и говорить о том, как это важно для критичных данных.

(acks = acknowledgments)

acks = 0 (none) Не ждать подтверждения о записи

acks = 1 (leader) Ждать подтверждения о записи лидером (не ждать запись на реплики) Если сообщение записалось на лидера, а тот упал, когда данные не успели среплицироваться на реплики, то так можно и потерять данные

acks = -1 (all) Ждать запись и на лидера, и на все реплики. Важное замечание - подтверждение ожидается только от in-sync реплик, поэтому также важно задать, сколько минимально живых реплик нам требуется, чтобы запись считалась успешной (см конфигурацию топиков)

Конфигурация топиков

Минимальное количество in-sync реплик, подтверждающих успешную запись

Если acks для producer выставлен в -1, то параметр min.insync.replicas задаёт, от скольки минимум in-sync реплик (включая лидера), требуется подтверждение записи, чтобы запись считалась успешной.

Например, в случае, если для топика заданы 3 реплики (replication factor), а min.insync.replicas = 1, то может случиться ситуация, когда 2 реплики рассинхронизируются, в списке ISR останется только один лидер, который будет продолжать подтверждать успешную запись данных. Это всё равно, что задать acks = 1.

ISR (in-sync replica)
Список всех “живых” реплик, который ведётся отдельно для каждого partition. Если репликация на реплике сильно отстаёт (устанавливается параметром replica.lag.time.max.ms) от лидера, то реплика исключается из списка ISR.