Проблемы с высокой доступностью, вызванные простоем Kafka
Проблема начинается с простоя Kafka.
Автором является финансовая технологическая компания, но компания не приняла на вооружение более популярную в сфере финансовых платежей.RabbitMQ
, но использует дизайн, изначально предназначенный для обработки журналов.Kafka
, поэтому мне всегда было интересно узнать о реализации и гарантиях высокой доступности Kafka. С тех пор, как Kafka была развернута, Kafka, используемая в системе, работала стабильно без каких-либо недоступностей.
Однако в последнее время системные тестировщики часто сообщали о том, что потребители Kafka время от времени не получали сообщения.После входа в интерфейс управления было обнаружено, что один из трех узлов не работает и зависает. Однако, согласно концепции высокой доступности, почему доступны три узла и два узла, так что потребители всего кластера не могут получать сообщения?
Чтобы решить эту проблему, мы должны начать с реализации высокой доступности Kafka.
Многокопийная избыточность Kafka
Будь то традиционная система, основанная на реляционной базе данных, или распределенная система, такая какzookeeper
,redis
,Kafka
,HDFS
И т. д., способ достижения высокой доступности обычно заключается в использовании избыточной конструкции для решения проблемы простоя и недоступности узла за счет избыточности.
Во-первых, кратко разберем несколько концепций Кафки:
- физическая модель
- логическая модель
-
Broker(узел): сервисный узел Kafka, просто один
Broker
Это сервер Kafka, физический узел. -
Topic(тема): В Kafka сообщения классифицируются по темам, и каждая тема имеет
Topic Name
, производитель отправляет сообщение в определенную тему в соответствии с названием темы, а потребитель также получает сообщение из соответствующей темы в соответствии с именем темы. -
Partition(раздел):
Topic
(тема) — это единица классификации сообщений, но каждая тема может быть дополнительно подразделена на одну или несколькоPartition
(раздел), раздел может принадлежать только одной теме. И темы, и разделы являются логическими понятиями.Например, и сообщение 1, и сообщение 2 отправляются в тему 1, и они могут поступать в один и тот же раздел или в разные разделы (таким образом, сообщения, содержащиеся в разных разделах одной и той же темы, различны), и затем он будет отправлен на узел Broker, соответствующий разделу. -
Offset(смещение): раздел можно рассматривать как очередь, в которую можно только войти, но нельзя (Kafka гарантирует только упорядоченность сообщений в разделе), сообщение будет добавлено в конец очереди, и каждое сообщение будет получить сообщение после входа в раздел. Смещение, определяющее положение сообщения в разделе. Потребители хотят получить сообщение, указав смещение.
В самом деле, в соответствии с несколькими концепциями, приведенными выше, это не то, насколько Кафка догадался, что несколько избыточных копий спроектированы и реализованы? Не волнуйтесь, мы продолжаем смотреть вниз.
До версии Kafka 0.8 не существовало механизма резервирования нескольких копий.Partition
Данные больше не могут быть использованы. Это означает, что часть данных, отправленных в тему, теряется.
Внедрение репортеров копирования после версии 0.8 — хорошее решение проблемы потери данных после простоя. копияTopic
каждый изPartition
Данные каждого раздела синхронизируются с другими физическими узлами для формирования нескольких копий.
каждыйPartition
копии всех включаютLeader
копировать и многократноFollower
Для реплик лидер избирается совместно всеми репликами, а остальные реплики являются репликами-последователями. Когда производитель пишет или читает потребитель, он имеет дело только с лидером.После записи данных ведомый извлечет данные для синхронизации данных.
Это так просто? Да, на основе приведенной выше схемы многокопийной архитектуры достигается высокая доступность Kafka. когдаBroker
Повесьте трубку, не волнуйтесь, этоBroker
ВверхPartition
В другомBroker
На узлах также есть реплики. Вы сказали, что если вы повесите трубкуLeader
что делать? то естьFollower
избраниеLeader
То есть производители и потребители могут общаться с новымLeader
Получайте удовольствие, играя, это высокая доступность.
У вас могут остаться вопросы, сколько копий достаточно? Что делать, если нет полной синхронизации между Последователем и Лидером? Каково правило выбора лидера после отказа узла?
Сразу к выводу:
Сколько копий достаточно?Чем больше реплик, тем более высокая доступность Kafka может быть гарантирована, но чем больше реплик, тем больше потребление сетевых и дисковых ресурсов, а производительность будет снижаться.Вообще говоря, для обеспечения высокой доступности количество реплик равно 3. В крайних случаях будетreplication-factor
Параметр можно увеличить.
Что делать, если нет полной синхронизации между Подписчиком и Лидом?Ведомый и ведущий не полностью синхронны, но и не полностью асинхронны, но принимаютISR
механизм(In-Sync Replica
). Каждый лидер будет динамически поддерживать список ISR, в котором хранятся последователи, которые в основном синхронизированы с лидером. Если ведомый не инициирует запрос на извлечение данных к ведущему из-за сети, GC и т. д., ведомый не синхронизируется с ведущим и будет исключен из списка ISR. Следовательно, Последователи в списке ISR — это все копии, которые могут не отставать от Лидера.
Каково правило выбора лидера после отказа узла?Существует много распределенных связанных правил выбора, таких как Zookeeper.Zab
,Raft
,Viewstamped Replication
, МайкрософтPacificA
Ждать. Идея избрания вождя Кафкой очень проста, исходя из упомянутого вышеISR
List, когда он не работает, будет искать последовательно со всех реплик, если найденная реплика есть в списке ISR, то она будет выбрана ведущей. Кроме того, необходимо следить, чтобы бывший лидер уже находился в состоянии отречения, иначе возникнет ситуация с раздвоением мозгов (лидеров два). Как гарантировать? Kafka гарантирует наличие только одного лидера, устанавливая контроллер.
Параметр Ack определяет надежность
Кроме того, вот необходимая точка знаний для интервью с высокой доступностью Kafka:request.required.acks
параметр.
Этот параметр Acks является важной конфигурацией клиента производителя, и этот параметр можно установить при отправке сообщения. Этот параметр имеет три настраиваемых значения:0, 1, Все.
Первый установлен в 0, что означает, что после того, как производитель отправит сообщение, нам все равно, живо сообщение или мертво, а это означает, что после отправки оно забыто, и он не несет ответственности за сказанное. Если вы не несете ответственности, это сообщение может быть потеряно, и тогда доступность будет потеряна.
Второй установлен на 1, что означает, что после того, как производитель отправит сообщение, пока сообщение успешно передано лидеру, не имеет значения, синхронизированы ли другие подписчики или нет. Возникает ситуация, когда лидер только что получил сообщение, а фолловер еще не успел синхронизировать брокера, а производитель уже подумал, что сообщение успешно отправлено, поэтому сообщение в это время теряется. Уведомление,Значение 1 — это конфигурация Kafka по умолчанию.! ! ! Видно, что конфигурация Kafka по умолчанию не так высокодоступна, а представляет собой компромисс между высокой доступностью и высокой пропускной способностью.
Третий - установить на Все (или -1), что означает, что после того, как производитель отправит сообщение, его должен получить не только Лидер, но и Последователи в списке ISR должны быть синхронизированы, чтобы производитель успешно отправил сообщение задачи.
Думай дальше,Acks=All
Не будет ли потери сообщений? Ответ - нет. Когда в списке ISR остается только Лидер,Acks=All
эквивалентноAcks=1
, в этом случае, если нода выйдет из строя, может ли она еще гарантировать, что данные не будут потеряны? Поэтому только вAcks=All
И в ISR есть две копии, чтобы данные не были потеряны.
Решать проблему
После долгого обхода я узнал о механизме высокой доступности Kafka и, наконец, вернулся к нашей первоначальной проблеме.Kafka
Почему один из узлов недоступен, когда он выходит из строя?
Я настроил в тестовой среде разработкиBroker
Количество узлов 3,Topic
в том, что количество копий равно 3,Partition
Число 6,Asks
Параметр равен 1.
Когда один из трех узлов выйдет из строя, что кластер сделает в первую очередь? Правильно, как мы сказали выше, кластер считает, что лидер с Partition недействителен, в это время лидер должен быть переизбран из списка ISR. Он недоступен, если список ISR пуст? Нет, но одна из уцелевших копий раздела выбрана в качестве ведущей, но это чревато потерей данных.
Таким образом, пока количество реплик Topic установлено таким же, как количество Brokers, многокопийная избыточность Kafka может обеспечить высокую доступность, и не будет ситуации, когда она будет недоступна после простоя (но это следует отметить, что у Kafka есть стратегия защиты A, Kafka останавливается, когда больше половины узлов недоступно). Тогда хорошенько подумайте, есть ли Тема с репликой номер 1 по Кафке?
проблема в__consumer_offset
начальство,__consumer_offset
Кафка создается автоматическиTopic
, используется для хранения потребительского потребленияoffset
(смещение) информация, по умолчаниюPartition
Число 50. Это тема, и ее количество копий по умолчанию равно 1. я упалPartition
Все они существуют на одной машине, что является очевидной единственной точкой отказа! при хранении__consumer_offset
После того, как Брокер Раздела даст «Убить», он обнаружит, что все потребители прекратили потребление.
Как решить эту проблему?
Первая точка, нужно быть__consumer_offset
Удалить, обратите внимание на встроенный в Кафку Топик, когда используется этот Топик, его нельзя удалить командой.logs
Удалено для достижения удаления.
Второй момент, вам нужно установитьoffsets.topic.replication.factor
на 3 будущее__consumer_offset
Количество копий изменено на 3.
поставив__consumer_offset
Он также копирует избыточность, а затем решает проблему потребления потребителей после выхода узла из строя.
Наконец, о том, почему__consumer_offset
Раздел будет храниться только на одном Брокере, а не распределяться по каждому Брокеру. Я в замешательстве. Если кто-то знает об этом, пожалуйста, сообщите~
В этой статье используетсяmdniceнабор текста