Партиции и параллелизм: как Kafka масштабируется

Урок показывает, почему именно партиции — рычаг масштабирования Kafka, и как выбрать их число.

Партиция — единица параллелизма в Kafka: каждая партиция читается и пишется независимо, поэтому их число задаёт потолок параллельной обработки топика.

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

Один лог на одном брокере упирается в одну машину. Чтобы топик переваривал миллионы событий в секунду, его дробят на партиции, которые живут на разных брокерах и читаются разными консьюмерами одновременно. Число партиций — главное решение при создании топика: оно определяет, насколько широко поток может «растечься».

Партиция = дорожка параллелизма

  Топик "clicks", 4 партиции, 4 консьюмера в группе:

  P0 --o C1
  P1 --o C2
  P2 --o C3
  P3 --o C4

  4 партиции = максимум 4 консьюмера читают параллельно.
  5-й консьюмер в группе будет простаивать.

Ключевое правило: число одновременно работающих консьюмеров в группе не может превышать число партиций. Хотите больше параллелизма на чтении — нужно больше партиций.

Запись тоже параллелится

Продюсеры распределяют события по партициям, и записи в разные партиции идут на разные брокеры независимо. Так суммарная пропускная способность топика складывается из пропускных способностей его партиций.

Сколько партиций брать

ФакторВлияние
Целевая пропускная способностьбольше нагрузки -- больше партиций
Число консьюмеров в группепартиций не меньше, чем нужно читателей
Слишком много партицийбольше файлов, дольше ребаланс, нагрузка на контроллер

Практическое правило: оцените пиковую нагрузку и пропускную способность одной партиции, возьмите запас, но не плодите тысячи партиций «на всякий случай».

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

Каждая партиция — отдельный набор сегмент-файлов с собственным лидером-брокером. Когда продюсер пишет, он бьёт по лидеру конкретной партиции; когда консьюмер читает, он тоже работает с лидерами своих партиций. Независимость партиций и есть источник параллелизма: нет общего «горлышка» — записи и чтения разных партиций не мешают друг другу. Уменьшить число партиций у существующего топика нельзя (это сломало бы привязку ключей к партициям), а увеличить — можно, но новые ключи начнут попадать иначе, чем старые.

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

  • Мало партиций. Потолок параллелизма низкий: сколько ни добавляй консьюмеров, читают только N из них.
  • Слишком много партиций. Тысячи партиций раздувают метаданные, замедляют ребаланс и восстановление.
  • Менять число партиций на горячую без оглядки. Увеличение ломает соответствие «ключ -- партиция» для будущих событий.

Итоги

  • Партиция — единица параллелизма: число партиций задаёт потолок параллельного чтения и записи.
  • Консьюмеров в группе не может работать больше, чем партиций; лишние простаивают.
  • Число партиций выбирают под нагрузку с запасом, но без крайностей; уменьшить его потом нельзя.
Проверьте себя
1. Сколько консьюмеров в одной группе могут параллельно читать топик с 4 партициями?
AСколько угодно
BМаксимум 4, лишние простаивают
CРовно 1
D8, по два на партицию
2. Чем плохо взять тысячи партиций «про запас»?
AНичем, всегда полезно
BРаздуваются метаданные, замедляется ребаланс и восстановление
CСнижается надёжность данных
DПартиции нельзя читать
3. Что можно сделать с числом партиций существующего топика?
AТолько уменьшить
BУвеличить можно, уменьшить нельзя
CМенять как угодно без последствий
DНичего нельзя