Репликация и ISR: как не терять данные

Урок про то, как Kafka переживает падение брокеров, не теряя записанные события.

Репликация — хранение копий каждой партиции на нескольких брокерах; одна реплика — лидер (через неё идут запись и чтение), остальные — фолловеры, догоняющие лидера. Синхронные реплики образуют ISR (in-sync replicas).

Зачем это нужно

Диски ломаются, серверы падают, дата-центры теряют питание. Если партиция жила на одном брокере и он умер — данные потеряны. Репликация хранит копии партиции на разных брокерах, чтобы падение одного не стоило ни байта.

Лидер и фолловеры

  Партиция P0, replication-factor = 3:

  Broker 1:  [P0 ЛИДЕР]   <- запись и чтение идут сюда
  Broker 2:  [P0 follower] <- тянет копию с лидера
  Broker 3:  [P0 follower] <- тянет копию с лидера

  Лидер упал -> один из ISR-фолловеров становится лидером.

Продюсеры и консьюмеры всегда работают с лидером партиции. Фолловеры лишь реплицируют лог лидера, чтобы быть готовыми подхватить роль.

ISR — синхронные реплики

ISR — это реплики, которые «не отстали» от лидера (догнали его в пределах допустимого лага). Когда продюсер шлёт с acks=all, запись считается успешной, лишь когда её получили все реплики из ISR. Если фолловер отстал — он временно выпадает из ISR и не блокирует запись, но и не считается надёжной копией.

min.insync.replicas

Параметр min.insync.replicas задаёт минимальное число синхронных реплик для успешной записи с acks=all. Классика для надёжности: replication-factor=3 и min.insync.replicas=2. Это значит: запись принимается, пока живы хотя бы 2 копии — один брокер можно потерять без остановки записи и без потери данных.

НастройкаЗначениеСмысл
replication.factor33 копии партиции
min.insync.replicas2пишем, пока живы хотя бы 2
acks (продюсер)allждать подтверждения от ISR

Как работает под капотом

Фолловеры активно тянут данные с лидера так же, как обычные консьюмеры — запрашивая записи начиная со своего оффсета. Лидер отслеживает, до какого оффсета догнал каждый фолловер, и вычисляет high watermark — оффсет, реплицированный во все ISR. Консьюмеры видят сообщения только до high watermark: пока запись не реплицирована в ISR, она «невидима», и потому переживёт смену лидера. Если все ISR, кроме лидера, отвалились и min.insync.replicas не набирается, продюсер с acks=all получает ошибку — Kafka предпочтёт отказать в записи, чем принять её небезопасно.

Частые ошибки

  • replication-factor=1 на проде. Падение брокера = безвозвратная потеря партиции.
  • min.insync.replicas=1 при RF=3. Формально 3 копии, но запись подтверждается одной — теряется при неудачной смене лидера.
  • Реплики на одной стойке/AZ. Сбой стойки убьёт все копии; разносите по зонам отказа.

Итоги

  • Репликация хранит копии партиции на нескольких брокерах; запись/чтение идут через лидера.
  • ISR — синхронные реплики; acks=all + min.insync.replicas=2 при RF=3 переживают потерю брокера.
  • Консьюмеры видят данные только до high watermark — реплицированные во все ISR.
Проверьте себя
1. Что такое ISR?
AСписок всех брокеров кластера
BНабор синхронных реплик, догнавших лидера в пределах допустимого лага
CИндекс сообщений
DСжатые сегменты
2. Зачем RF=3 и min.insync.replicas=2?
AДля скорости
BЧтобы пережить потерю одного брокера без остановки записи и потери данных
CЧтобы удвоить throughput
DЭто обязательное минимальное значение
3. Что такое high watermark?
AМаксимальный размер сообщения
BОффсет, реплицированный во все ISR; только до него консьюмеры видят данные
CЛимит партиций
DПорог сжатия