System Design: От Идеи к Реальной Системе
Load Balancer
Артемий Мазаев
19 дек. 2023 г.

Балансировка нагрузки позволяет распределять входящий сетевой трафик между несколькими ресурсами, обеспечивая высокую доступность и надежность за счет отправки запросов только к доступным в сети ресурсам. Это обеспечивает гибкость в добавлении или удалении ресурсов в зависимости от потребностей.

Для дополнительной масштабируемости и избыточности мы можем попробовать балансировать нагрузку на каждом уровне нашей системы:

Но почему?

Современные высоконагруженные веб-сайты должны обслуживать сотни тысяч, если не миллионы, одновременных запросов от пользователей или клиентов. Для эффективного масштабирования с учетом этих высоких объемов современная вычислительная практика обычно требует добавления большего количества серверов.

Балансировщик нагрузки может находиться перед серверами и маршрутизировать клиентские запросы по всем серверам, способным выполнить эти запросы таким образом, чтобы максимизировать скорость и использование мощности. Это гарантирует, что ни один сервер не будет перегружен, что может ухудшить производительность. Если один сервер выходит из строя, балансировщик нагрузки перенаправляет трафик на оставшиеся в сети серверы. Когда в группу серверов добавляется новый сервер, балансировщик нагрузки автоматически начинает отправлять на него запросы.

Распределение рабочей нагрузки

Это основная функция, предоставляемая балансировщиком нагрузки, и она имеет несколько общих вариаций:

  • На основе хоста: Распределяет запросы на основе запрошенного имени хоста.
  • На основе пути: Использует всю URL для распределения запросов вместо только имени хоста.
  • На основе содержимого: Изучает содержимое сообщения запроса. Это позволяет распределять нагрузку на основе содержимого, например, значения параметра.

Уровни

В общем случае, балансировщики нагрузки работают на одном из двух уровней:

Сетевой уровень

Это балансировщик нагрузки, который работает на транспортном уровне сети, также известном как уровень 4. Он выполняет маршрутизацию на основе сетевой информации, такой как IP-адреса, и не может выполнять маршрутизацию на основе содержимого. Это часто специализированные аппаратные устройства, которые могут работать на высоких скоростях.

Прикладной уровень

Это балансировщик нагрузки, который работает на прикладном уровне, также известном как уровень 7. Балансировщики нагрузки могут читать запросы целиком и выполнять маршрутизацию на основе содержимого. Это позволяет управлять нагрузкой на основе полного понимания трафика.

Типы

Рассмотрим различные типы балансировщиков нагрузки:

Программные

Программные балансировщики нагрузки обычно проще в развертывании, чем аппаратные. Они также обычно более экономичны и гибки, и их используют в сочетании с программными средами разработки. Программный подход дает нам гибкость настройки балансировщика нагрузки в соответствии с конкретными потребностями нашей среды. Увеличение гибкости может потребовать большей работы по настройке балансировщика нагрузки. В отличие от аппаратных версий, которые предлагают более закрытый подход, программные балансировщики дают нам больше свободы в внесении изменений и обновлений.

Программные балансировщики нагрузки широко используются и доступны либо как устанавливаемые решения, требующие настройки и управления, либо как управляемая облачная услуга.

Аппаратные

Как следует из названия, аппаратный балансировщик нагрузки полагается на физическое, локальное оборудование для распределения прикладного и сетевого трафика. Эти устройства могут обрабатывать большой объем трафика, но часто имеют высокую цену и ограничены в плане гибкости.

Аппаратные балансировщики нагрузки включают фирменное программное обеспечение, требующее обслуживания и обновлений при выпуске новых версий и патчей безопасности.

DNS

Балансировка нагрузки DNS — это практика настройки домена в Системе Доменных Имен (DNS) таким образом, чтобы клиентские запросы к домену распределялись между группой серверных машин.

К сожалению, балансировка нагрузки DNS имеет внутренние проблемы, ограничивающие ее надежность и эффективность. Самое значительное из них — DNS не проверяет отказы серверов и сетевые сбои или ошибки. Он всегда возвращает один и тот же набор IP-адресов для домена, даже если серверы не работают или недоступны.

Алгоритмы Маршрутизации

Теперь обсудим общепринятые алгоритмы маршрутизации:

  • Круговой (Round-robin): Запросы распределяются по серверам приложений поочередно.
  • Взвешенный Круговой (Weighted Round-robin): Развивает простой круговой метод, учитывая различные характеристики серверов, такие как вычислительная и обрабатывающая трафик способность, используя веса, которые могут быть назначены через DNS-записи администратором.
  • Наименьшее Количество Соединений (Least Connections): Новый запрос отправляется на сервер с наименьшим текущим числом соединений с клиентами. Относительная вычислительная мощность каждого сервера учитывается при определении того, у кого меньше всего соединений.
  • Наименьшее Время Ответа (Least Response Time): Отправляет запросы на сервер, выбранный по формуле, которая сочетает в себе самое быстрое время ответа и наименьшее количество активных соединений.
  • Наименьшая Полоса Пропускания (Least Bandwidth): Этот метод измеряет трафик в мегабитах в секунду (Мбит/с), отправляя клиентские запросы на сервер с наименьшим объемом трафика в Мбит/с.
  • Хеширование (Hashing): Распределяет запросы на основе определенного ключа, такого как IP-адрес клиента или запрашиваемый URL.

Преимущества

Балансировка нагрузки также играет ключевую роль в предотвращении простоев, другие преимущества балансировки нагрузки включают:

  • Масштабируемость
  • Избыточность
  • Гибкость
  • Эффективность

Избыточные балансировщики нагрузки

Как вы уже, наверное, догадались, сам балансировщик нагрузки может стать единственной точкой сбоя. Чтобы преодолеть это, можно использовать второй или N-ое количество балансировщиков нагрузки в кластерном режиме.

И если обнаруживается сбой и активный балансировщик нагрузки выходит из строя, другой пассивный балансировщик нагрузки может взять на себя управление, что сделает нашу систему более устойчивой к сбоям.

Функции

Вот некоторые общеиспользуемые функции балансировщиков нагрузки:

  • Автомасштабирование: Запуск и отключение ресурсов в ответ на условия спроса.
  • Сессии с привязкой (Sticky sessions): Возможность назначать одного и того же пользователя или устройство одному и тому же ресурсу для поддержания состояния сессии на ресурсе.
  • Проверки состояния (Healthchecks): Возможность определять, не работает ли ресурс или работает плохо, чтобы исключить ресурс из пула балансировки нагрузки.
  • Постоянные соединения (Persistence connections): Позволяет серверу открывать постоянное соединение с клиентом, например, WebSocket.
  • Шифрование: Обработка зашифрованных соединений, таких как TLS и SSL.
  • Сертификаты: Представление сертификатов клиенту и аутентификация клиентских сертификатов.
  • Сжатие: Сжатие ответов.
  • Кэширование: Балансировщик нагрузки на прикладном уровне может предложить возможность кэширования ответов.
  • Логирование: Логирование метаданных запроса и ответа может служить важным аудиторским следом или источником данных для аналитики.
  • Трассировка запросов: Присвоение каждому запросу уникального идентификатора для целей логирования, мониторинга и устранения неполадок.
  • Переадресация: Возможность переадресации входящего запроса на основе факторов, таких как запрашиваемый путь.
  • Фиксированный ответ: Возвращение статического ответа на запрос, например, сообщения об ошибке.

Примеры

Вот некоторые из общепринятых решений для балансировки нагрузки, используемых в индустрии:

Have a doubt?
Post it here, our mentors will help you out.