Балансировка нагрузки распределенных систем Архитектура галантереи

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

1. Что такое балансировка нагрузки?

Что такое балансировка нагрузки?

Я помню, что впервые столкнулся с Nginx в лаборатории, тогда мне нужно было использовать Nginx для развертывания сайта на сервере. Nginx — это сервисный компонент, используемый для обратного проксирования, балансировки нагрузки, кэширования HTTP и т. д. Так что же такое балансировка нагрузки?

Балансировка нагрузки (LB, Load Balance) — техническое решение. Используется для распределения нагрузки между несколькими ресурсами (обычно серверами) для оптимизации использования ресурсов и предотвращения перегрузки.

file

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

2. Что такое высокая доступность?

Сначала поймите, что такое высокая доступность?

Это основа теоремы CAP для распределенных систем, а также 3 индикатора распределенных систем:

  1. Последовательность
  2. Доступность
  3. Допуск перегородки

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

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

Например, некоторые известные веб-сайты гарантируют доступность более 4 девяток, что составляет более 99,99% доступности. Эти 0,01% и есть то, что называется процентом времени простоя. Например, веб-сайт электронной коммерции имеет высокую оценку, а недоступность сервиса приведет к тому, что продавец потеряет деньги и пользователей. Затем на основе улучшения доступности будет компенсация простоя системы и недоступности услуги.

file

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

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

3. Распространенные случаи балансировки нагрузки

file

Сценарий 1. В микросервисной архитектуре шлюз направляет приветствие к определенному экземпляру службы:

  • Два идентичных экземпляра службы hello service , один на порту 8000, а другой на порту 8082.
  • Благодаря функции LB балансировки нагрузки Kong запросы равномерно распределяются между двумя экземплярами службы приветствия.
  • У Kong есть много алгоритмов стратегии балансировки нагрузки: алгоритм взвешенного циклического перебора по умолчанию и потребитель: идентификатор потребителя в качестве входного значения алгоритма хеширования и т. д.

file

Сценарий 2. В микросервисной архитектуре служба A вызывает кластер службы B. Передал компонент балансировки нагрузки Ribbon client:

  • Алгоритм стратегии балансировки нагрузки не является продвинутым, самый простой — это случайный выбор и циклический перебор.

4. Интернет-распределенные системные решения

file

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

  • Клиентский уровень: например, пользовательский браузер, сторона приложения
  • Слой обратного прокси: технический выбор Nignx или F5 и т. д.
  • Веб-уровень: в сценарии разделения внешнего и внутреннего интерфейса веб-сторона может использовать NodeJS, RN, Vue.
  • Уровень бизнес-сервисов: используйте Java, Go, обычные интернет-компании, выбор технического решения — SC или Spring Boot + сервис Dubbo.
  • Уровень хранения данных: выбор БД MySQL, выбор кэша Redis, выбор поиска ES и т.д.

Запрос с уровня 1 на уровень 4 требует балансировки нагрузки для послойного доступа. То есть, когда каждый восходящий канал звонит нескольким нижестоящим бизнес-сторонам, он должен вызываться равномерно. Таким образом, общая система более сбалансирована по нагрузке.

Уровень 1: Балансировка нагрузки на уровне клиента -> уровень обратного прокси

Как реализовать балансировку нагрузки на уровне клиента -> уровень обратного прокси?

Ответ: циклический перебор DNS. DNS может установить несколько IP-адресов через A (адрес, который возвращает IP-адрес, на который указывает доменное имя). Например, DNS для доступа к bysocket.com здесь настроен с ip1 и ip2. Для обеспечения высокой доступности уровня обратного прокси будет как минимум две записи A. Такие избыточные экземпляры службы nginx, соответствующие двум IP-адресам, предотвращают единую точку отказа.

Каждый раз, когда запрашивается доменное имя bysocket.com, соответствующий IP-адрес возвращается через опрос DNS, а экземпляр службы обратного прокси-уровня, соответствующий каждому IP-адресу, является IP-адресом внешней сети nginx. Таким образом, распределение запросов, получаемое каждым экземпляром уровня обратного прокси, может быть сбалансировано.

Уровень 2: Обратный прокси-уровень -> Балансировка нагрузки на веб-уровне

Как реализовать балансировку нагрузки обратного прокси-уровня -> веб-уровня?

Обрабатывается модулем балансировки нагрузки обратного прокси-уровня. Например, у nginx есть несколько методов балансировки:

  1. Запрос опроса. Запросы распространяются на службы веб-уровня один за другим в хронологическом порядке, и цикл начинается снова и снова. Если служба веб-слоя не работает, она будет автоматически удалена.
upstream web-server {
    server ip3;
    server ip4;
}

  1. хэш айпи. По хеш-значению ip определите маршрут к соответствующему веб-слою. Пока IP-адрес пользователя един, запросы к веб-слою также едины.
    Еще одним преимуществом является то, что запросы с одного и того же IP-адреса будут распределяться на один и тот же сервис веб-уровня. Таким образом, каждый пользователь может получить фиксированный доступ к сервису веб-уровня, что может решить проблему сеанса.
upstream web-server {
    ip_hash;
    server ip3;
    server ip4;
}

  1. вес, вес, честность, url_hash и т. д.

Уровень 3: балансировка нагрузки веб-уровня -> уровень бизнес-услуг

Как реализовать балансировку нагрузки веб-уровня -> уровень бизнес-сервиса?

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

Чтобы избежать единой точки отказа и поддерживать горизонтальное расширение служб, служба обычно развертывает несколько экземпляров, то есть развертывание кластера Dubbo. Он превратит несколько экземпляров службы в поставщика услуг, а затем случайным образом выберет одного из 20 поставщиков для вызова в соответствии с настроенной стратегией случайной балансировки нагрузки, предполагая, что седьмой поставщик выбран случайным образом. Компонент LoadBalance выбирает провайдера для вызова из списка адресов провайдеров и использует стратегию балансировки.Если вызов не удался, выберите другого провайдера для вызова.

В Dubbo есть 4 встроенные стратегии балансировки нагрузки:

  • RandomLoadBalance: случайный баланс нагрузки. Выберите один наугад. Это стандартная стратегия балансировки нагрузки Dubbo.
  • RoundRobinLoadBalance: балансировка нагрузки циклического перебора. Опрос, чтобы выбрать один.
  • LeastActiveLoadBalance: наименьшее количество активных вызовов, такое же количество активных вызовов является случайным. Активный счетчик относится к разнице между счетчиками до и после вызова. Сделайте так, чтобы медленный провайдер получал меньше запросов, потому что чем медленнее провайдер, тем больше будет разница в подсчетах до и после звонка.
  • ConsistentHashLoadBalance: постоянная балансировка хеш-нагрузки. Запросы с одинаковыми параметрами всегда попадают на один и тот же компьютер.

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

Уровень 4: Балансировка нагрузки уровня бизнес-сервисов -> уровень хранения данных

Балансировка нагрузки уровня хранения данных обычно реализуется через DBProxy. Например, подтаблица подбазы данных MySQL.

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

  • Диапазон, время
  • Хэш по модулю, заказ по идентификатору магазина и т. д.

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

  • Распределенная транзакция
  • Объединение между библиотеками и т. д.

Существует множество продуктовых решений для подбазы данных и подтаблицы: Dangdang sharding-jdbc, Ali’s Cobar и т. д.

V. Резюме

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

  • Уровень 1: Балансировка нагрузки на уровне клиента -> уровень обратного прокси. Опрос через DNS
  • Уровень 2: Обратный прокси-уровень -> Балансировка нагрузки на веб-уровне. Модуль балансировки нагрузки через Nginx
  • Уровень 3: Балансировка нагрузки веб-уровня -> уровень бизнес-служб. Через модуль балансировки нагрузки фреймворка управления услугами
  • Уровень 4: Балансировка нагрузки уровня бизнес-сервиса -> уровень хранения данных. Благодаря горизонтальному распределению данные являются однородными, и теоретически запросы будут однородными. Например, сегментация по идентификатору покупателя аналогична

Оригинальность непроста, попробуйте нарисовать больше картинок, схемы стоят тысячи слов (mason@bysocket.com)

Использованная литература:

  • «Все о балансировке нагрузки» https://mp.weixin.qq.com/s/xvozZjmn-CvmQMAEAyDc3w
  • «Балансировка нагрузки Dubbo» http://dubbo.apache.org/zh-cn/blog/dubbo-loadbalance.html
  • https://zh.wikipedia.org/wiki/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1