1. Что такое балансировка нагрузки?
Что такое балансировка нагрузки?
Я помню, что впервые столкнулся с Nginx в лаборатории, тогда мне нужно было использовать Nginx для развертывания сайта на сервере. Nginx — это сервисный компонент, используемый для обратного проксирования, балансировки нагрузки, кэширования HTTP и т. д. Так что же такое балансировка нагрузки?
Балансировка нагрузки (LB, Load Balance) — техническое решение. Используется для распределения нагрузки между несколькими ресурсами (обычно серверами) для оптимизации использования ресурсов и предотвращения перегрузки.
Ресурс эквивалентен операционной единице выполнения каждого экземпляра службы Балансировка нагрузки заключается в распределении большого количества операций обработки данных для выполнения нескольких операционных единиц, что используется для решения проблем большого трафика, высокой параллельности и высокой доступности Интернета. распределенные системы. Так что же такое высокая доступность?
2. Что такое высокая доступность?
Сначала поймите, что такое высокая доступность?
Это основа теоремы CAP для распределенных систем, а также 3 индикатора распределенных систем:
- Последовательность
- Доступность
- Допуск перегородки
Что такое высокая доступность? Высокая доступность, или сокращенно HA, — это функция или показатель системы, обычно обозначающий время работы службы, обеспечивающее определенную производительность, превышающую средний нормальный период времени. И наоборот, устраните время, когда системные службы недоступны.
Чтобы измерить, удовлетворяет ли система высокой доступности, то есть когда один или несколько серверов выходят из строя, система в целом и службы по-прежнему доступны в обычном режиме.
Например, некоторые известные веб-сайты гарантируют доступность более 4 девяток, что составляет более 99,99% доступности. Эти 0,01% и есть то, что называется процентом времени простоя. Например, веб-сайт электронной коммерции имеет высокую оценку, а недоступность сервиса приведет к тому, что продавец потеряет деньги и пользователей. Затем на основе улучшения доступности будет компенсация простоя системы и недоступности услуги.
Например, для службы заказов можно использовать несколько экземпляров службы заказов с балансировкой нагрузки вместо одного экземпляра службы заказов, то есть для повышения надежности используется избыточность.
В целом, балансировка нагрузки — это один из факторов, который необходимо учитывать при проектировании архитектуры распределенной системы. Как правило, проблемы большого трафика, высокого параллелизма и высокой доступности распределенных систем решаются за счет балансировки нагрузки и резервирования одного и того же экземпляра службы. Ключом к балансировке нагрузки является ее равномерное распределение.
3. Распространенные случаи балансировки нагрузки
Сценарий 1. В микросервисной архитектуре шлюз направляет приветствие к определенному экземпляру службы:
- Два идентичных экземпляра службы hello service , один на порту 8000, а другой на порту 8082.
- Благодаря функции LB балансировки нагрузки Kong запросы равномерно распределяются между двумя экземплярами службы приветствия.
- У Kong есть много алгоритмов стратегии балансировки нагрузки: алгоритм взвешенного циклического перебора по умолчанию и потребитель: идентификатор потребителя в качестве входного значения алгоритма хеширования и т. д.
Сценарий 2. В микросервисной архитектуре служба A вызывает кластер службы B. Передал компонент балансировки нагрузки Ribbon client:
- Алгоритм стратегии балансировки нагрузки не является продвинутым, самый простой — это случайный выбор и циклический перебор.
4. Интернет-распределенные системные решения
Общая архитектура распределенной системы Интернета делится на несколько уровней, как правило, следующим образом:
- Клиентский уровень: например, пользовательский браузер, сторона приложения
- Слой обратного прокси: технический выбор 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 есть несколько методов балансировки:
- Запрос опроса. Запросы распространяются на службы веб-уровня один за другим в хронологическом порядке, и цикл начинается снова и снова. Если служба веб-слоя не работает, она будет автоматически удалена.
upstream web-server {
server ip3;
server ip4;
}
- хэш айпи. По хеш-значению ip определите маршрут к соответствующему веб-слою. Пока IP-адрес пользователя един, запросы к веб-слою также едины.
Еще одним преимуществом является то, что запросы с одного и того же IP-адреса будут распределяться на один и тот же сервис веб-уровня. Таким образом, каждый пользователь может получить фиксированный доступ к сервису веб-уровня, что может решить проблему сеанса.
upstream web-server {
ip_hash;
server ip3;
server ip4;
}
- вес, вес, честность, 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