Что такое ISR (In-Sync Replicas)
Реплика считается синхронной если:
Уровень Junior
Определение
ISR (In-Sync Replicas) — это список реплик партиции, которые полностью синхронизированы с лидером.
Partition 0:
Leader: Broker 1
ISR: [Broker 1, Broker 2, Broker 3]
Все три брокера имеют актуальные данные
Зачем нужен ISR?
1. Выбор нового лидера при failover
— Только из ISR (гарантия отсутствия потери данных)
2. Подтверждение записи
— acks=all ждёт подтверждения от всех ISR
Как реплика попадает в ISR?
Реплика входит в ISR если:
1. Брокер активен и отправляет heartbeat
2. Не отстаёт от лидера больше чем на 30 секунд (по умолчанию)
Пример
# Проверить ISR для топика
kafka-topics.sh --describe --topic orders --bootstrap-server localhost:9092
Topic: orders Partition: 0 Leader: 1 Replicas: 1,2,3 ISR: 1,2,3
Числа 1,2,3 — это ID брокеров в кластере. ISR: 1,2,3 означает что все три
брокера синхронизированы.
Уровень Middle
Определение “In-Sync”
Реплика считается синхронной если:
1. Живучесть: Брокер активен и поддерживает связь
2. Актуальность: Не отстаёт больше чем на replica.lag.time.max.ms (30 сек)
ISR и выбор лидера
При падении лидера:
Новый лидер выбирается только из ISR
→ Гарантирует, что новый лидер имеет все закоммиченные данные
→ Потери данных исключены
ISR и подтверждение записи
acks=all + min.insync.replicas=2:
Producer → Leader → ждёт подтверждения от всех ISR
Если ISR < 2 → запись отклоняется
Shrinking и Expanding ISR
Shrinking (сжатие):
Follower тормозит → исключается из ISR
Expanding (расширение):
Follower догнал → возвращается в ISR
min.insync.replicas
Минимально допустимый размер ISR для приёма записей
Пример:
min.insync.replicas=2
ISR=[Leader, Follower1] → запись разрешена
ISR=[Leader] → запись отклоняется (NotEnoughReplicasException)
Типичные ошибки
- ISR Shrinking без расследования:
Реплики выходят из ISR → риск потери данных → Нужно мониторить и устранять причину - min.insync.replicas=1:
Нет защиты — один лидер может потерять данные
Уровень Senior
Internal Implementation
ISR Tracking:
Лидер отслеживает каждую реплику:
- Last Fetch Time — время последнего fetch request
- Last Caught Up Time — когда догнал лидера
- Log End Offset — последний offset у реплики
Критерий включения в ISR:
(now - lastCaughtUpTime) <= replica.lag.time.max.ms
Historical Note:
До Kafka 0.9: replica.lag.max.messages (лимит по сообщениям)
После Kafka 0.9: replica.lag.time.max.ms (лимит по времени)
Причина: лимит по сообщениям неэффективен для high-throughput систем
ISR и acks=all
acks=all ждёт подтверждения от всех ISR реплик
Сценарий:
ISR=[1,2,3], min.insync.replicas=2
Producer → acks=all → ждёт от 1,2,3
Если 3 вышел из ISR → ISR=[1,2] → всё ещё работает
Сценарий с проблемой:
ISR=[1,2,3], min.insync.replicas=2
2 и 3 вышли из ISR → ISR=[1]
Запись отклоняется (NotEnoughReplicasException)
Unclean Leader Election
Если ISR пуст (все синхронные реплики упали):
unclean.leader.election.enable=false (по умолчанию):
→ Ждать восстановления любой реплики из ISR
→ Система недоступна на запись
→ Данные сохранены
unclean.leader.election.enable=true:
→ Выбрать любого живого фолловера
→ Система заработает
→ Потеря данных, которые не скопированы
Monitoring ISR
Ключевые метрики:
kafka.server:IsrShrinksPerSec
kafka.server:IsrExpandsPerSec
kafka.server:UnderReplicatedPartitions
kafka.server:PartitionCount (ISR size)
Alerts:
- ISR shrinks per sec > threshold → warning
- Under-replicated partitions > 0 → warning
- ISR size < replication factor → critical
- Replica lag > 30s → critical
ISR Troubleshooting
Причины shrinking:
1. Network issues между брокерами
2. Перегрузка брокера (CPU, disk, memory)
3. Медленный диск у фолловера
4. Большой volume данных (follower не успевает)
Решения:
1. Проверить network connectivity
2. Мониторить ресурсы брокеров
3. Увеличить replica.fetch.max.bytes
4. Увеличить replica.lag.time.max.ms (временное решение)
Production Configuration
# Broker level
replica.lag.time.max.ms: 30000
num.replica.fetchers: 1
# Topic level
replication.factor: 3
min.insync.replicas: 2
unclean.leader.election.enable: false
Best Practices
✅ ISR monitoring (shrinks/expands)
✅ min.insync.replicas=2 при RF=3
✅ unclean.leader.election.enable=false
✅ Alert на under-replicated partitions
✅ Равномерное распределение реплик
✅ Мониторить replica lag
❌ Игнорирование ISR shrink
❌ min.insync.replicas=1 для production
❌ unclean.leader.election.enable=true
❌ Без мониторинга replica lag
❌ RF < 3 для production
Архитектурные решения
- ISR — гарант отсутствия потерь — лидер только из ISR
- min.insync.replicas=2 — баланс между availability и durability
- Monitoring ISR shrink — ранний индикатор проблем
- Unclean election = data loss — избегать в production
Резюме для Senior
- ISR — критический механизм для consistency Kafka
- Реплика входит в ISR по времени отставания, не по сообщениям
- ISR включает в себя и самого Лидера — лидер всегда в ISR, так как он является источником истины, ему не нужно копировать данные.
- min.insync.replicas защищает от записи в единственную копию
- IsrShrinksPerSec — ключевая метрика для мониторинга
- Unclean leader election — последняя мера с риском потери данных
🎯 Шпаргалка для интервью
Обязательно знать:
- ISR — список реплик, полностью синхронизированных с лидером (включая самого лидера)
- Реплика в ISR если: активна и не отстаёт больше чем
replica.lag.time.max.ms(30s) - Новый лидер выбирается ТОЛЬКО из ISR → гарантия отсутствия потери данных
acks=allждёт подтверждения от всех ISR репликmin.insync.replicas=2при RF=3: запись отклоняется если ISR < 2- Shrinking: фолловер отстаёт → исключается; Expanding: догнал → возвращается
- До Kafka 0.9: лимит по сообщениям; после: лимит по времени (эффективнее для high-throughput)
Частые уточняющие вопросы:
- Входит ли лидер в ISR? — Да, лидер всегда в ISR — он источник истины.
- Что будет если ISR пуст? — При unclean.leader.election.enable=false — система недоступна; если true — любой фолловер (data loss).
- Почему по времени а не по сообщениям? — Лимит по сообщениям неэффективен для high-throughput.
- Какие причины shrinking ISR? — Network issues, перегрузка брокера, медленный диск, большой volume.
Красные флаги (НЕ говорить):
- «ISR только из фолловеров» — лидер всегда в ISR
min.insync.replicas=1 для production— нет защиты от data loss- «ISR shrinking — можно игнорировать» — ранний индикатор проблем
- «Unclean leader election безопасен» — потеря данных гарантирована
Связанные темы:
- [[16. Что такое репликация в Kafka]]
- [[17. Что такое leader и follower реплики]]
- [[19. Как Kafka обеспечивает отказоустойчивость]]
- [[20. Что такое producer acknowledgment и какие режимы существуют (acks=0,1,all)]]