Ответ
При сбое лидер-реплики Kafka автоматически инициирует процесс выбора нового лидера для обеспечения высокой доступности и отказоустойчивости. Этот процесс состоит из нескольких шагов:
- Обнаружение сбоя. Брокер-контроллер в кластере обнаруживает, что лидер партиции недоступен (например, через потерю сессии в ZooKeeper или внутреннем кворуме Kraft).
- Инициация выборов. Контроллер запускает процедуру выбора нового лидера.
- Выбор кандидата. Новый лидер выбирается из числа синхронизированных реплик (
In-Sync Replicas, ISR). Это реплики, которые гарантированно содержат все подтвержденные сообщения. - Возобновление работы. Клиенты (продюсеры и консюмеры) получают обновленные метаданные и автоматически переключаются на нового лидера. Партиция снова становится доступной для чтения и записи.
На время выборов (обычно миллисекунды) партиция будет недоступна для записи.
Важный аспект — unclean.leader.election.enable
- По умолчанию (
false), эта настройка запрещает выбирать лидером реплику, не входящую в ISR. Это гарантирует отсутствие потери данных, но может привести к полной недоступности партиции, если все реплики из ISR отказали. - Если установить в
true, Kafka сможет выбрать лидером даже отставшую реплику, что повышает доступность ценой возможной потери данных.
Проверить текущего лидера и ISR можно с помощью CLI-утилиты:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic my_topic Ответ 18+ 🔞
А, слушай, про эту вашу Кафку и её лидеров! Ну, история, блядь, как в хорошем сериале про престолы, только с брокерами и партициями. Сейчас разжую, как сука, на пальцах.
Вот представь: есть у тебя партиция — это такая, блядь, королевская должность. И сидит на ней лидер-реплика, главный по тарелкам, все продюсеры ему пишут, консюмеры с него читают. И тут — бац! — лидер взял и накрылся медным тазом. Сервер упал, сеть отвалилась, или он просто, сука, решил отдохнуть.
Что происходит? Начинается натуральный, блядь, дворцовый переворот!
- Обнаружение трупа. Первым спохватывается брокер-контроллер — этакий, блядь, верховный жрец в кластере. Он такой: "Так, стоп. А где наш король? Сессии нет, пульса нет... Ёпта, похоже, приплыли".
- Крики "Король умер!" Контроллер орет на всю деревню: "Мужики, лидер сдох! Выборы нового, блядь, начинаем!". Всё это, конечно, не криком, а по своим внутренним каналам (ZooKeeper или тот их новый Kraft).
- Выбор преемника. Тут самое, сука, интересное. Нового короля выбирают НЕ из всех подряд. Нет, блядь! Только из элитного круга — из синхронизированных реплик (ISR). Это те, кто не отставал, не ленился и гарантированно имеет все последние, подтверждённые сообщения. То есть, данные не потеряются. Чтоб не вышло, как с тем Герасимом, который всё, блядь, утопил.
- Коронация и работа. Как только нового назначили, всем клиентам (продюсерам и консюмерам) тихонечко шепчут: "Э, народ, лидер теперь вот тот, на третьем сервере". И все автоматом, без паники, начинают работать с ним. Партиция снова жива!
Но есть, сука, один адский нюанс — настройка unclean.leader.election.enable. Вот это, блядь, философский камень от Кафки!
- Если она
false(по умолчанию), то всё строго по понятиям. Лидером может стать ТОЛЬКО парень из круга ISR. Это гарантирует, что ни одно твоё сообщение не потеряется. Но! Если вдруг, по злому року, ВСЕ реплики из этого круга ISR легли (ну, пожар в дата-центре, хуй с горы упал), то партиция просто встанет колом. Доступности не будет, зато совесть чиста — данные целы. Максимализм, блядь, как у того Герасима. - А если её поставить в
true, то Кафка, в попытках сохранить доступность любой ценой, может короновать какого-нибудь отставшего увальня, который не в ISR. Он-то лидером станет, партиция заживёт... но, сука, все сообщения, которые он не успел получить от старого лидера — нахуй пропали! Повысили доступность, но проебли данные. Волнение, блядь, на нуле.
Короче, выбор между "всё работает, но данные могут накрыться" и "данные святы, но можем лежать". Ёперный театр!
А посмотреть, кто сейчас главный и кто в его свите (ISR), можно вот такой, блядь, магической командой. Код не трогаю, он святой:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic my_topic
Выполнишь — и увидишь всю подноготную: кто лидер, какие реплики в синке, а какие, блядь, отстают. Всё как на ладони, чих-пых!