Итоги модуля: Архитектура Kafka
Этот модуль заложил фундамент для понимания Kafka. Разберём ключевые концепции и их взаимосвязь.
Что вы изучили в этом модуле
Урок 1: Распределённый Commit Log
Kafka — это append-only commit log. Этим определяется всё остальное:
- Записи добавляются только в конец, никогда не изменяются.
- Offset — монотонный целочисленный адрес записи в пределах партиции. Разные consumer groups читают один и тот же offset независимо.
- Kafka оптимизирована для последовательного I/O — миллионы записей в секунду при правильной конфигурации.
- Данные хранятся до истечения
retention.msилиretention.bytes. Replay — прочитать с offset 0.
Урок 2: Брокеры, Топики, Партиции
Физическая реальность commit log в кластере:
- Брокер = JVM-процесс с
node.idиprocess.roles(broker/controller/combined). - Топик = именованный поток, разбитый на партиции. CLI:
kafka-topics.sh --bootstrap-server. - Партиция = единица параллелизма. Порядок гарантирован только внутри одной партиции.
num.partitions— только увеличивать, не уменьшать.replication.factor=3для production.
Урок 3: Репликация и ISR
Механизм надёжности хранения:
- ISR = реплики в синхронизации с лидером (в пределах
replica.lag.time.max.ms). - LEO (Log End Offset) — следующий свободный offset каждой реплики.
- HW (High Watermark) = min(LEO всех ISR-реплик). Потребитель читает только до HW.
acks=all+min.insync.replicas=2— правильная комбинация для production durability.
Урок 4: KRaft контроллер
Управление метаданными кластера без ZooKeeper:
- KRaft — встроенный Raft-протокол. ZooKeeper удалён в Kafka 4.0.
- Metadata log — event-sourced append-only лог всех изменений кластера.
- Quorum: нечётное число voter-узлов (3 или 5). Кворум = большинство.
- Epoch fencing — команды с устаревшим epoch отклоняются. Защита от split-brain.
kafka-metadata-quorum.sh describe --status— инструмент мониторинга KRaft.
Урок 5: Rack Awareness
Защита от стоечных и зональных сбоев:
broker.rack— строка-идентификатор стойки или AZ.- При RF=3 и 3 rack — каждая реплика в отдельной rack.
- В облаке:
broker.rack = availability_zone_name. - Действует только при создании топика; существующие топики требуют ручной reassign.
Как концепции связаны между собой
Producer
Producer: отправляет ProducerRecord с topic, key, value. acks=all — ждать ISR-реплик. Partitioner хэширует key для выбора partition.Partition Leader
Partition Leader: принимает запись. Добавляет в append-only лог (LEO++). Ждёт FetchRequest от ISR-фолловеров. После ISR-подтверждений двигает HW вверх. Отвечает продюсеру.ISR Follower
ISR Follower: периодически запрашивает новые записи от лидера. LEO фолловера растёт. Когда лидер видит LEO фолловера >= new_offset — фолловер подтвердил запись.Consumer (читает до HW)
Consumer: читает только до HW (High Watermark). FetchRequest { offset: current_position }. Kafka возвращает записи до HW. Consumer коммитит offset в __consumer_offsets.KRaft Controller
KRaft Controller Quorum: хранит metadata log — брокеры, топики, ISR-статус, epoch. Epoch fencing защищает от split-brain. kafka-metadata-quorum.sh describe.Rack-Aware Placement
Rack Awareness: реплики распределены по разным стойкам/AZ. При RF=3 в 3 AZ — одна AZ может упасть без потери данных.Что важно помнить для экзамена
Эти связи часто проверяются в экзаменационных вопросах — убедитесь, что понимаете причинно-следственные отношения, а не просто определения.
Цепочка: acks → ISR → HW → Consumer visibility
Producer ack получен от ISR-реплик → HW продвигается → Consumer видит новые записи.
Если ISR = 1 и min.isr = 1 → acks=all = acks=1 → нет дополнительных гарантий.
Цепочка: Kafka 4.0 = KRaft only
zookeeper.connect не существует. kafka-topics.sh --zookeeper не существует. Используйте --bootstrap-server.
Цепочка: broker.rack → rack-aware assignment → отказоустойчивость
broker.rack задаётся один раз при настройке. Влияет только на новые топики. Существующие партиции требуют ручной reassign.
Цепочка: LEO per replica → HW = min(ISR LEOs) → потребитель ждёт
HW не продвигается быстрее самой медленной ISR-реплики. Медленный фолловер = staleness для потребителей.
Типичные ошибки
- ISR = 1 + acks=all без min.insync.replicas=2 — иллюзия надёжности. Реально: один узел отказа = потеря данных.
- Слишком много партиций — >4000 на брокер создаёт overhead для leader election и metadata management.
- Не устанавливать broker.rack в production — реплики случайно распределяются, не учитывая физическую топологию.
- Уменьшать num.partitions — невозможно без пересоздания топика и потери данных.
- Думать, что порядок гарантирован в топике — нет, только в партиции.