## Лабораторная работа №7 ### Эссе на тему "Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах" При масштабировании приложения появляется необходимость в добавлении новых серверов. В таком случае нужно пользоваться балансировщиком нагрузок для распределения запросов. А что делать, если серверов больше сотни или тысячи? Балансировка нагрузки позволяет обеспечить равномерное распределение нагрузки между несколькими серверами. Без неё один сервер может перегрузиться, а другой простаивать. Это приводит к неэффективной работе системы. Для решения этой проблемы используют различные алгоритмы. 1. **"Round-robin"** - балансировка нагрузок циклическим перебором. Алгоритм можно описать так: балансировщик нагрузок отправляет запрос каждому серверу по очереди. Это решает проблему "отбрасывания" входящих запросов, когда предыдущий запрос еще не был обработан. Такой алгоритм подойдет для серверов с одинаковой мощностью и одинаково затратных запросов. 2. **Очереди запросов** - балансировка нагрузок с помощью создания очередей запросов. Редко встречаются ситуации, когда все запросы одинаково обрабатываются. Очереди запросов позволяют справиться с этой проблемой, но со своими недостатками. "Отбрасываться" будет меньше запросов, но некоторые из них будут иметь задержку при обработке (так как будут ожидать в очереди) 3. **"Weighted round-robin"** - взвешенный цикличный перебор. Алгоритм заключается в назначении веса каждому серверу. Вес определяет, сколько запросов сможет обработать сервер. Это нужно, для подстраивания к мощности каждого сервера. В качестве открытых технологий для балансировки нагрузки используются **HAProxy** и **Nginx**. Они выступают в роли обратного прокси-сервера: принимают запросы от клиентов и перенаправляют их на один из доступных серверов. Они предлагают гибкую настройку алгоритмов балансировки и отслеживания состояния серверов. Кроме того, существуют решения на основе Kubernetes или других оркестраторов контейнеров, которые управляют распределением нагрузки по микросервисам. Балансировка нагрузки на базах данных — специфическая задача, решаемая с помощью механизмов репликации и кластеризации. **Репликация** создает копии данных на нескольких серверах. Это обеспечивает отказоустойчивость и повышение производительности за счет распределения нагрузки чтения. **Кластеризация** объединяет несколько баз данных в единую систему. Это позволяет распределять нагрузку записи и чтения между несколькими базами. Выбор оптимального подхода зависит от специфики приложения и требований к доступности и производительности. **Реверс-прокси** играет ключевую роль в балансировке нагрузки. Он принимает все входящие запросы, контролирует доступность серверов на бэке и перенаправляет запросы на доступные и наименее загруженные сервера. Кроме распределения нагрузки, реверс-прокси выполняет другие важные функции: кэширование, SSL-терминирование и защита от атак. Благодаря своей гибкости и функциональности, реверс-прокси является важным компонентом высокопроизводительных и отказоустойчивых распределенных систем.