Эта статья написанаyanglbmeНачалось вДокументы технического сообщества GitHub, текущие звезды превысили 30k.
адрес проекта:GitHub.com/ohohgenerate/advpress…
вопросы интервью
Как обеспечить высокую доступность очередей сообщений?
Психологический анализ интервьюера
Если кто-то спросит о ваших знаниях MQ,Высокая доступность обязательна.последняя лекцияупомянул, что MQ вызываетСнижение доступности системы. Поэтому, пока вы используете MQ, некоторые из следующих пунктов должны быть о том, как устранить недостатки MQ.
Если ты тупой и используешь МК, и никогда не рассматривал всевозможные проблемы, то ты чашка.Впечатление интервьюера от тебя такое, что он просто воспользуется некоторыми приемами, без всяких раздумий, и сразу даст тебе впечатление. Не очень хорошее. Если такого одноклассника наберут обычным младшим братом с зарплатой меньше 20к то будет нормально.Если старшим инженером с зарплатой 20к+ будет мизер.Пусть спроектируете систему, там должно быть в ней много дыр, и компания понесет убытки при аварии, и пострадает команда.
Анализ вопросов интервью.
Это хороший вопрос, чтобы задать этот вопрос, потому что он не может спросить вас, как гарантировать высокую доступность Kafka? Как обеспечить высокую доступность ActiveMQ? Если интервьюер задаст такой вопрос, это будет очень некомпетентно. Люди могут использовать RabbitMQ, но никогда не использовали Kafka. Вы подходите и спрашиваете, что делает Kafka? Разве это не демонстрация усложнения жизни людям?
Итак, есть уровень интервьюера, который спрашивает, как обеспечить высокую доступность MQ? Это тот MQ, который вы использовали, и вы можете рассказать о своем понимании высокой доступности этого MQ.
1. Высокая доступность RabbitMQ
RabbitMQ более репрезентативен, потому что онхозяин-рабДля высокой доступности (нераспределенной) мы будем использовать RabbitMQ в качестве примера, чтобы объяснить, как добиться высокой доступности первого MQ.
RabbitMQ имеет три режима: автономный режим, обычный режим кластера и режим зеркального кластера.
Автономный режим
Автономный режим находится на демонстрационном уровне, как правило, вы запускаете игру локально, и никто не использует автономный режим для производства.
Обычный режим кластера (без высокой доступности)
Обычный режим кластера означает, что несколько экземпляров RabbitMQ запускаются на нескольких машинах, по одному на каждую машину. тыСозданная очередь будет помещена только в один экземпляр RabbitMQ., но каждый экземпляр синхронизирует метаданные очереди (метаданные можно рассматривать как некоторую информацию о конфигурации очереди, и через метаданные можно найти экземпляр, в котором находится очередь). Когда вы потребляете, на самом деле, если вы подключаетесь к другому экземпляру, то этот экземпляр будет извлекать данные из экземпляра, в котором находится очередь.
Этот метод действительно хлопотный и не очень хороший.Не делал так называемого распределенного, который является обычным кластером. Поскольку это заставляет вас либо подключать потребителя к экземпляру каждый раз случайным образом, а затем извлекать данные, либо подключаться к экземпляру, где расположена очередь, для потребления данных, первыйНакладные расходы на получение данных, последнее приводит кУзкое место в производительности одного экземпляра.
И если экземпляр, поставивший очередь, не работает, это приведет к тому, что другие экземпляры не смогут получать данные из этого экземпляра.Включить сохранение сообщений, если вы позволите RabbitMQ хранить сообщения на земле,Сообщения не обязательно теряются, вам нужно дождаться восстановления экземпляра, прежде чем вы сможете продолжить извлекать данные из этой очереди.
Так что это более смущает.Нет такой вещи, как высокая доступность,Эта схема в основном предназначена для повышения пропускной способности, что означает, что несколько узлов в кластере обслуживают операции чтения и записи очереди.
Режим зеркального кластера (высокая доступность)
Этот режим является так называемым режимом высокой доступности RabbitMQ. В отличие от обычного режима кластера, в режиме зеркального кластера созданная вами очередь, независимо от метаданных или сообщений в очереди, будетсуществует в нескольких экземплярах, то есть каждый узел RabbitMQ имеет одну из этой очередиполное зеркало, что означает, что он содержит все данные очереди. Затем каждый раз, когда вы записываете сообщение в очередь, оно автоматическисинхронизация сообщенийв очередь из нескольких экземпляров.
ТакКак включить этот режим зеркального кластераШерстяная ткань? На самом деле все очень просто.В RabbitMQ есть хорошая консоль управления, которая заключается в добавлении стратегии в фоновом режиме.Эта стратегияЗеркальная политика режима кластера, вы можете запросить синхронизацию данных со всеми узлами, если они указаны, или вы можете запросить синхронизацию с указанным числом узлов.При повторном создании очереди применение этой стратегии автоматически синхронизирует данные с другими узлами.
В этом случае преимущество заключается в том, что если какая-либо из ваших машин не работает, ничего страшного, другие машины (узлы) также содержат полные данные этой очереди, и другие потребители могут перейти к другим узлам для потребления данных. Недостатком является то, что, во-первых, слишком высока нагрузка на производительность: сообщения должны быть синхронизированы со всеми машинами, что приводит к сильному давлению на пропускную способность сети и ее потреблению! Во-вторых, играйте так, а не распространяйте, простонет расширяемостиТеперь, если очередь сильно загружена и вы добавляете машину, новая машина также содержит все данные этой очереди, иНет возможности масштабировать линейноваша очередь. Вы думаете, если объем данных этой очереди настолько велик, что мощность этой машины не вмещается, что нам делать в это время?
2. Высокая доступность Кафки
Базовое архитектурное понимание Kafka: он состоит из нескольких брокеров, каждый из которых является узлом; вы создаете тему, которую можно разделить на несколько разделов, каждый раздел может существовать на разных брокерах, и в каждый раздел помещаются некоторые данные.
ЭтоЕстественная распределенная очередь сообщений, то есть данные топика, естьРазбросаны по нескольким машинам, каждая машина положит часть данных.
По сути, RabbmitMQ — это не распределенная очередь сообщений, это традиционная очередь сообщений, она просто предоставляет некоторые механизмы для кластеризации и HA (High Availability, высокая доступность), потому что как ни играй, RabbitMQ — это очередь. размещается в одном узле, а под зеркальным кластером каждый узел также хранит полные данные этой очереди.
До Kafka 0.8 не было механизма HA, то есть, если какой-либо брокер не работал, раздел на этом брокере был бы недействительным, ни для записи, ни для чтения, о высокой доступности не могло быть и речи.
Например, предположим, что тема создана и указано количество разделов 3 на трех машинах соответственно. Однако, если вторая машина выйдет из строя, 1/3 данных этой темы будет потеряна, так что это не очень доступно.
После Kafka 0.8 предоставляется механизм HA, который является механизмом реплик. Данные каждого раздела будут синхронизированы с другими машинами, чтобы сформировать собственные множественные реплики. Все реплики выберут лидера, затем с этим лидером будут иметь дело и производство, и потребление, а затем остальные реплики будут последователями. При записи лидер будет отвечать за синхронизацию данных со всеми фолловерами, а при чтении просто читать данные непосредственно на лидере. Может только читать и писать лидеры? очень простой,Если вы можете читать и записывать каждого последователя по желанию, то вам нужно позаботиться о проблеме согласованности данных., сложность системы слишком высока, легко ошибиться. Kafka равномерно распределит все реплики раздела по разным машинам, чтобы повысить отказоустойчивость.
это так называемыйвысокая доступностьДа, потому что если посредник выйдет из строя, ничего страшного, разделы на этом посреднике имеют копии на других машинах. Если на упавшем брокере есть лидер раздела, он будет получен от последователя в это время.переизбраниеКогда появляется новый лидер, каждый может продолжать читать и писать этого нового лидера. Это называется высокой доступностью.
записать данныеВ это время производитель записывает лидера, затем лидер записывает данные на локальный диск, а затем другие фолловеры активно тянут данные от лидера. Как только все подписчики синхронизируют свои данные, они отправят подтверждение лидеру.После того, как лидер получит подтверждения от всех последователей, он вернет сообщение об успешной записи производителю. (Конечно, это всего лишь один из режимов, и это поведение можно настроить соответствующим образом)
ПотреблениеКогда сообщение отправлено, оно будет прочитано только лидером, но только когда сообщение будет успешно возвращено на подтверждение всеми подписчиками, сообщение будет прочитано потребителем.
Увидев это, я полагаю, у вас есть общее представление о том, как Kafka обеспечивает механизм высокой доступности, верно? Чтобы не быть в неведении, вы также можете нарисовать интервьюера на месте. Если интервьюер действительно специалист по Кафке, а вы копаете глубоко и спрашиваете, то можете только извиниться, вы не слишком глубоко его изучили.
Добро пожаловать в мою общедоступную учетную запись WeChat «Сообщество открытого исходного кода Doocs». Оригинальные технические статьи будут опубликованы как можно скорее.