Что произойдет при падении одного брокера Kafka в конфигурации с несколькими брокерами
Что проверяют
Понимаете ли вы, что именно даёт репликация, и что происходит с клиентом Kafka в момент отказа. Для разработчика это вопрос про настройки продюсера и консьюмера, а не про администрирование кластера.
Как отвечать
Данные лежат в партициях, у каждой партиции есть лидер и фолловеры, а множество догоняющих реплик называется ISR. Когда брокер падает, партиции, где он был лидером, ненадолго остаются без лидера, контроллер выбирает нового из ISR, клиенты получают ошибку про отсутствие лидера, обновляют метаданные и идут на нового лидера. Для приложения это пауза в секунды, а не потеря данных.
Что именно сохраняет данные:
- фактор репликации не меньше трёх, иначе резервировать нечего;
acks=allвместе сmin.insync.replicas=2: подтверждение приходит, только когда запись есть в двух репликах;enable.idempotence=true, чтобы автоматические повторы продюсера не давали дублей;unclean.leader.election.enable=false, иначе лидером может стать отставшая реплика, и это прямой обмен доступности на потерянные сообщения.
Консьюмер смену лидера переживает прозрачно, но если на упавшем брокере жил координатор группы, будет ребаланс. А если живых реплик стало меньше, чем min.insync.replicas, продюсер начнёт получать NotEnoughReplicasException: запись встала намеренно, чтобы не принять то, что нельзя гарантировать.
Где спотыкаются
Путают фактор репликации и min.insync.replicas. Второй параметр реплик не создаёт, он задаёт порог подтверждения, поэтому связка из одной реплики и порога в две просто сломает запись в топик.
Говорят «Kafka ничего не теряет» без условий. С acks=1 подтверждённая запись, не доехавшая до фолловеров, исчезает при смене лидера, а разрешённые нечистые выборы теряют данные и при acks=all. Правильный ответ всегда через настройки, а не через свойство продукта.
Рассказывают про ZooKeeper как единственный способ координации. В новых версиях кластером управляет встроенный кворум контроллеров, ZooKeeper из картины ушёл. Сюда же забытое следствие: при трёх репликах и одном упавшем брокере кластер работает уже без запаса, и вторая потеря останавливает запись.