## Лабораторная работа №7

### Эссе на тему "Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах"

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

А что делать, если серверов больше сотни или тысячи?

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

Для решения этой проблемы используют различные алгоритмы.

1. **"Round-robin"** - балансировка нагрузок циклическим перебором.
Алгоритм можно описать так: балансировщик нагрузок отправляет 
запрос каждому серверу по очереди. Это решает проблему "отбрасывания" 
входящих запросов, когда предыдущий запрос еще не был обработан.
Такой алгоритм подойдет для серверов с одинаковой мощностью и 
одинаково затратных запросов.

2. **Очереди запросов** - балансировка нагрузок с помощью создания очередей 
запросов.
Редко встречаются ситуации, когда все запросы одинаково обрабатываются. 
Очереди запросов позволяют справиться с этой проблемой, но со своими 
недостатками.
"Отбрасываться" будет меньше запросов, но некоторые из них будут иметь
задержку при обработке (так как будут ожидать в очереди)

3. **"Weighted round-robin"** - взвешенный цикличный перебор.
Алгоритм заключается в назначении веса каждому серверу. Вес определяет, 
сколько запросов сможет обработать сервер. Это нужно, для подстраивания
к мощности каждого сервера.

В качестве открытых технологий для балансировки нагрузки используются **HAProxy** и **Nginx**. 
Они выступают в роли обратного прокси-сервера: принимают запросы от клиентов 
и перенаправляют их на один из доступных серверов. Они предлагают 
гибкую настройку алгоритмов балансировки и отслеживания состояния серверов. 
Кроме того, существуют решения на основе Kubernetes или других 
оркестраторов контейнеров, которые управляют распределением нагрузки 
по микросервисам.

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

**Репликация** создает копии данных на нескольких серверах. Это обеспечивает 
отказоустойчивость и повышение производительности за счет распределения 
нагрузки чтения. 

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

**Реверс-прокси** играет ключевую роль в балансировке нагрузки. 
Он принимает все входящие запросы, контролирует доступность серверов 
на бэке и перенаправляет запросы на доступные и наименее загруженные сервера. 
Кроме распределения нагрузки, реверс-прокси выполняет другие важные функции: 
кэширование, SSL-терминирование и защита от атак. Благодаря своей гибкости 
и функциональности, реверс-прокси является важным компонентом 
высокопроизводительных и отказоустойчивых распределенных систем.