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

Ниже приведены некоторые преимущества использования балансировщика нагрузки:

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

Балансировщики нагрузки являются неотъемлемой частью цифровой стратегии организации. Традиционно балансировщики нагрузки состоят из аппаратного устройства. Тем не менее, они все больше становятся программно-определяемыми. Оба типа балансировщиков нагрузки реализуют разные типы алгоритмов планирования и механизмов маршрутизации. В этой статье мы сосредоточимся на программном балансировщике нагрузки и на том, как Pipy, программируемый сетевой прокси-сервер с открытым исходным кодом для облака, периферии и Интернета вещей, можно использовать для создания очень эффективного балансировщика нагрузки HTTP для распределения трафика между несколькими серверами приложений и для повышения производительности, масштабируемости и надежности веб-приложений и/или сервисов.

Подробные пошаговые инструкции и полный рабочий код см. в руководствах Часть 7: Балансировка нагрузки и Часть 8: Улучшенная балансировка нагрузки, доступных на веб-сайте Pipy.

Алгоритмы балансировки нагрузки

Pipy поставляется со встроенными алгоритмами балансировки нагрузки, которые можно легко подключить для разработки прокси-сервиса балансировки нагрузки.

Поддерживаемые балансировщики нагрузки

В pipy поддерживаются следующие механизмы (или методы) балансировки нагрузки:

По-круговой

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

Простейшая конфигурация для использования этого алгоритма в Pipy может выглядеть следующим образом:

new algo.RoundRobinLoadBalancer([
'localhost:8080',
'localhost:8081',
'localhost:8082',
])

Взвешенный круговой турнир

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

Простейшая конфигурация для использования этого алгоритма в Pipy может выглядеть следующим образом:

new algo.RoundRobinLoadBalancer({
'localhost:8080': 50,
'localhost:8081': 25,
'localhost:8082': 25,
})

Наименьшая рабочая нагрузка

Выберите пункт назначения с наименьшим количеством назначенных запросов. Запросы сначала обслуживаются на сервере, который в настоящее время обрабатывает наименьшее количество постоянных подключений. Это требует проверки всех мест назначения. Этот алгоритм используется, когда у нас есть большое количество постоянных соединений в трафике, неравномерно распределенном между серверами. Это часто сочетается с балансировкой нагрузки Sticky Session или Session-aware. При этом все запросы, относящиеся к сеансу, отправляются на один и тот же сервер для поддержания состояния сеанса и синхронизации. Этот алгоритм хорошо подходит, когда у нас есть операции записи с учетом сеанса, синхронизированные с клиентом и сервером, чтобы избежать любой несогласованности.

Простейшая конфигурация для использования этого алгоритма в Pipy может выглядеть следующим образом:

new algo.LeastWorkLoadBalancer([
'localhost:8080',
'localhost:8081',
'localhost:8082',
])

Взвешенная наименьшая рабочая нагрузка

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

Простейшая конфигурация для использования этого алгоритма в Pipy может выглядеть следующим образом:

new algo.LeastWorkLoadBalancer({
'localhost:8080': 50,
'localhost:8081': 25,
'localhost:8082': 25,
})

Общий хэш

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

Простейшая конфигурация для использования этого алгоритма в Pipy может выглядеть следующим образом:

new algo.HashingLoadBalancer([
'localhost:8080',
'localhost:8081',
'localhost:8082',
])

Сходство сеансов

Привязка сеансов — это механизм привязки (аффинитизации) причинно-связанной последовательности запросов к адресату, обработавшему первый запрос, когда нагрузка распределяется между несколькими адресатами. Это полезно в сценариях, где большинство запросов в последовательности работают с одними и теми же данными, а стоимость доступа к данным различается для разных узлов (пунктов назначения), обрабатывающих запросы. Наиболее распространенным примером является временное кэширование (например, в памяти), когда первый запрос извлекает данные из более медленного постоянного хранилища в быстрый локальный кеш, а остальные работают только с кэшированными данными, что увеличивает пропускную способность.

При циклическом переборе или балансировке нагрузки с наименьшей нагрузкой каждый последующий клиентский запрос потенциально может быть распределен на другой сервер. Нет гарантии, что один и тот же клиент всегда будет направлен на один и тот же сервер. Если есть необходимость привязать клиента к определенному серверу приложений — другими словами, сделать сеанс клиента «прикрепленным» или «постоянным» с точки зрения постоянной попытки выбрать конкретный сервер — Общий хеш можно использовать механизм балансировки нагрузки.

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

алгоритм.Кэш

Pipy предоставляет механизм кэширования через свой класс algo.Cache, который принимает два обратных вызова в качестве аргументов конструктора:

  1. Обратный вызов, когда отсутствующая запись должна быть заполнена.
  2. Обратный вызов, когда запись должна быть удалена.

Например, мы можем вызвать наш RoundRobinLoadBalancer в этих обратных вызовах:

new algo.Cache(
// k is a balancer, v is a target
(k  ) => k.select(),
(k,v) => k.deselect(v),
)

Заключение

Pipy — это чрезвычайно быстрый и легкий обработчик сетевого трафика с открытым исходным кодом, который можно использовать в самых разных случаях: от пограничных маршрутизаторов, балансировки нагрузки и прокси (прямой/обратный), шлюзов API, статических HTTP-серверов. , коляски Service Mesh и многие другие приложения. Pipy находится в активной разработке и поддерживается штатными коммиттерами и участниками, хотя это все еще ранняя версия, она была протестирована в боевых условиях и используется несколькими коммерческими клиентами.

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

Первоначально опубликовано на https://dev.to 10 марта 2022 г.