158
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Типы балансировки и их практическое использование на примере Nginx

Время чтения 4 минуты
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
158
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Привет! На связи Александр Бархатов — DevOps-инженер в крупнейшем продуктовом холдинге. Как и многие компании, мы используем микросервисную архитектуру, для которой критически важно обеспечить высокую доступность приложений — возможность принимать и обрабатывать сотни тысяч запросов. Ее можно добиться с помощью балансировки нагрузки — равномерного распределения сетевого трафика. Главная цель состоит в том, чтобы каждый сервис смог обрабатывать поступающие запросы и быть доступным для пользователей — людей или других сервисов. В этой статье я покажу существующие типы балансировки на примере Nginx, а также их реализацию на практике.

Типы балансировки и их практическое использование на примере Nginx

Предварительные требования

Для работы мне понадобились два сервера с ОС Linux, я выбрал дистрибутив Ubuntu. Вместо физических серверов можно использовать виртуальные машины.

Первый сервер выступает в роли балансировщика, с него я отправляю запросы для тестирования алгоритмов. На нем установлен Nginx. Для установки можно воспользоваться официальной документацией Nginx.

На втором сервере запущены три контейнера Docker с веб-сервером Nginx, которые эмулируют работу трех приложений. Про установку Docker можно почитать в документации.

Репозиторий GitHub с необходимыми файлами контейнеров можно найти по ссылке. Там же доступна инструкция по сборке и запуску контейнеров с Nginx.

 

Round Robin

Один из самых распространенных алгоритмов балансировки — Round Robin, который используется в Nginx по умолчанию. Суть алгоритма заключается в том, что поступающие запросы распределяются между микросервисами равномерно. 

На практике алгоритм Round Robin выглядит следующим образом: первый запрос балансировщик отправляет к первому приложению, второй — ко второму, третий — к третьему, а четвертый — снова к первому. Далее алгоритм повторяется по кругу, пока не закончатся запросы.

Принцип работы алгоритма Round Robin

Теперь перейдем к практике и настроим алгоритм.

1. На первом сервере, который выступает в роли балансировщика, открываем на редактирование стандартный конфигурационный файл:

nano /etc/nginx/conf.d/default.conf

и приводим его к следующему виду:

upstream applications {

server 147.45.184.201:8081; #first
server 147.45.184.201:8082; #second
server 147.45.184.201:8083; #third

}

server {

listen 8080;

location / {

proxy_pass http://applications;

}
}

В этой конфигурации в блоке upstream мы указываем адрес сервера и порты приложений, запущенных в Docker. На сервере с IP-адресом 147.45.184.201 запущено три Docker-контейнера с разными портами: 8081, 8082, 8083. Балансировщик будет запущен на порту 8080. Сохраняем внесенные изменения и выходим из файла.

2. Прежде чем перезапускать конфигурацию nginx, проверим ее на наличие ошибок. Для этого выполним команду:

nginx -t

Если в выводе команды отображались строки:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

то конфигурация не содержит ошибок и можно перезапускать конфигурацию nginx:

systemctl reload nginx

Дополнительно проверим статус nginx:

systemctl status nginx

3. Протестируем балансировку путем отправки трех запросов при помощи утилиты curl:

curl -H 'Host: 147.45.184.201' localhost:8080

Запросы направлены каждый к своему серверу согласно алгоритму

Также можно автоматически отправлять запросы — например, каждые пять секунд. Для этого воспользуемся командой:

while sleep 5; do curl -H 'Host: 147.45.184.201' localhost:8080; done

Round Robin с указанием приоритета

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

1. Для того чтобы указать приоритет, используем ключевое слово weight, в котором зададим числовой эквивалент веса. Добавим значения для каждого из трех используемых приложений:

upstream applications {

server 147.45.184.201:8081 weight=10; #first
server 147.45.184.201:8082 weight=5; #second
server 147.45.184.201:8083 weight=3; #third

}


server {

listen 8080;


location / {

proxy_pass http://applications;

}

}

 

Теперь сервер с адресом 147.45.184.201:8081 будет получать больше трафика, потому что у него указан наибольший приоритет. 

2. Проверим, как работает алгоритм Round Robin с указанием приоритета, выполнив команду:

while sleep 1; do curl -H 'Host: 147.45.184.201' localhost:8080; done

Всего было отправлено 11 запросов, из которых шесть попали к серверу с наибольшим приоритетом — первому

Least Connection

В Nginx есть еще один алгоритм под названием Least Connection, который позволяет равномерно распределять поступающие запросы, при этом каждый новый запрос попадает к серверу с наименьшим количеством активных соединений. 

1. Чтобы использовать алгоритм Least Connection, в блоке upstream укажем параметр least_conn:

upstream applications {

least_conn;
server 147.45.184.201:8081; #first
server 147.45.184.201:8082; #second
server 147.45.184.201:8083; #third

}

server {

listen 8080;

location / {

proxy_pass http://applications;

}

}

 

2. Проверим, как работает алгоритм Least Connection. Предположим, что у нас нагружены первый и третий серверы. В таком случае запросы будут отправляться на наименее загруженный сервер — второй:

while sleep 1; do curl -H 'Host: 147.45.184.201' localhost:8080; done

IP Hash

Еще один алгоритм, который можно использовать в Nginx, называется IP Hash. Он распределяет запросы, исходя из IP-адреса клиента, — это гарантирует, что все поступающие запросы с одного IP будут отправлены к одному экземпляру приложения. Для IPv4-адресации используются только первые три октета. Для IPv6 используется весь адрес целиком. 

1. Чтобы включить поддержку IP Hash, в директиве upstream укажем параметр ip_hash:

upstream applications {

ip_hash;
server 147.45.184.201:8081; #first
server 147.45.184.201:8082; #second
server 147.45.184.201:8083; #third

}

server {

listen 8080;

location / {

proxy_pass http://applications;

}

}

 

2. Проверим работоспособность алгоритма на практике. Для этого запустим команду:

while sleep 1; do curl -H 'Host: 147.45.184.201' localhost:8080; done

Все запросы отправлены с одного IP-адреса, поэтому балансировщик передает их на один сервер — третий.

В этой статье мы на практике рассмотрели типы балансировок в Nginx. С их помощью можно эффективно управлять входящим трафиком для приложений, чтобы обеспечить их доступность.

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники