Балансировка HTTP-нагрузки

LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы балансировки нагрузки с помощью HAProxy.

Представьте банк, в котором работает только один кассир. Очередь становится очень длинной, и клиенты начинают сердиться. Чтобы решить проблему, банк открывает несколько кассовых окон. Но теперь у входа нужен сотрудник, который будет направлять каждого клиента к следующему доступному окну.

В этом сценарии:

  • Управляющий банка — это балансировщик нагрузки (HAProxy).
  • Кассиры — это серверы Backend (имитируемые веб-серверы).
  • Клиенты — это веб-трафик.

Вы создадите такую систему в Linux. Сначала запустите два имитируемых веб-сервера, а затем настроите HAProxy для распределения трафика между ними по алгоритму round robin — одному из самых простых алгоритмов балансировки.

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

В конце лабораторной работы вы сможете:

  1. Запускать простые веб-серверы Python.
  2. Настраивать HAProxy для приёма трафика (Frontend) и отправки его на серверы (Backend).
  3. Наблюдать работу балансировки нагрузки.

Подготовьте терминалы

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

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

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

Сейчас у вас открыт один терминал (Terminal). Откройте ещё два:

  1. Найдите в интерфейсе терминала значок + (Plus).
  2. Нажмите его два раза, чтобы открыть Terminal 1 и Terminal 2.

Используйте терминалы следующим образом:

  • Terminal: центр управления (здесь вы будете настраивать HAProxy).
  • Terminal 1: здесь будет работать Server 1.
  • Terminal 2: здесь будет работать Server 2.

Запустите Server 1

Теперь запустим первого «кассира» — Server 1. Вместо установки тяжёлого веб-сервера мы воспользуемся встроенным в Python удобным инструментом, который превращает любую папку в веб-сайт.

Перейдите в Terminal 1.

Сначала откройте папку, подготовленную для Server 1.

cd ~/project/server1

Теперь запустите сервер. Укажите ему порт 8001. Порт можно представить как номер квартиры: компьютер — это здание, а порт 8001 — конкретная дверь, за которой находится Server 1.

python3 -m http.server 8001

Вы увидите сообщение Serving HTTP on 0.0.0.0 port 8001. Это означает, что сервер запущен и ожидает посетителей. Теперь этот терминал занят, поэтому не вводите в нём другие команды.

Запустите Server 2

Запустим второго «кассира» — Server 2, чтобы распределить между серверами нагрузку.

Перейдите в Terminal 2.

Откройте папку для Server 2.

cd ~/project/server2

Запустите этот сервер на другом порте — 8002. Нельзя использовать порт 8001, потому что его уже занял Server 1: две «семьи» не могут жить в одной квартире 8001.

python3 -m http.server 8002

Теперь работают два независимых веб-сервера. Один возвращает сообщение «Response from Server 1» на порту 8001, а другой — «Response from Server 2» на порту 8002.

Настройте Frontend

Теперь, когда серверы готовы, настроим «управляющего банка» — HAProxy, чтобы он направлял к ним трафик.

На этом этапе начинается разделение на Frontend и Backend. Frontend описывает, как клиенты подключаются к HAProxy, а Backend — пул серверов, которые фактически обрабатывают запросы.

Вернитесь в Terminal.

Сначала сохраним старую конфигурацию в резервную копию и создадим новую.

sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
sudo nano /etc/haproxy/haproxy.cfg

Скопируйте и вставьте в редактор следующий текст. Он определяет Frontend. Frontend — это публичная сторона балансировщика нагрузки, куда приходят клиенты (пользователи).

global
    log /dev/log    local0
    log /dev/log    local1 notice
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend http_front
    bind *:80
    default_backend http_back

Основные элементы:

  • bind *:80: указывает HAProxy прослушивать порт 80. Порт 80 — стандартный порт для веб-трафика (HTTP). Если в адресе сайта не указан порт, браузер использует порт 80.
  • default_backend http_back: сообщает HAProxy: «Когда сюда приходит клиент, отправляй его в группу http_back».

Это имя важно, потому что конфигурация HAProxy фактически представляет собой карту движения трафика. Frontend принимает подключения, а Backend содержит возможные назначения этих подключений.

Сохраните файл (Ctrl+O, Enter). Файл можно оставить открытым, но лучше сохранить его и выйти (Ctrl+X), чтобы проверять выполнение по шагам.

Настройте Backend

Теперь нужно определить группу рабочих серверов — Backend.

Если вы закрыли файл конфигурации, снова откройте его:

sudo nano /etc/haproxy/haproxy.cfg

Добавьте следующие строки в конец файла:

backend http_back
    server server1 127.0.0.1:8001 check
    server server2 127.0.0.1:8002 check

Что мы только что сделали?

  • backend http_back: создали группу с именем http_back.
  • server server1 ...: добавили первый рабочий сервер (Server 1) по адресу 127.0.0.1:8001 — это порт 8001 локального компьютера.
  • server server2 ...: добавили второй рабочий сервер (Server 2) по адресу 127.0.0.1:8002.
  • check: это важная настройка. Она указывает управляющему периодически проверять, доступен ли рабочий сервер (то есть находится ли он в состоянии Healthy). Если сервер выйдет из строя, HAProxy перестанет отправлять ему клиентов.

Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).

Проверьте балансировку

Как управляющему решать, к кому направить следующего клиента? Самый распространённый способ — Round Robin, то есть простое чередование.

  • Клиент 1 → Server 1
  • Клиент 2 → Server 2
  • Клиент 3 → Server 1
  • …и так далее.

Явно укажем этот алгоритм в конфигурации. В последний раз откройте файл конфигурации:

sudo nano /etc/haproxy/haproxy.cfg

Найдите добавленный ранее раздел backend http_back и вставьте директиву balance, чтобы раздел выглядел так:

backend http_back
    balance roundrobin
    server server1 127.0.0.1:8001 check
    server server2 127.0.0.1:8002 check

Примечание: отступы (пробелы в начале строк) важны для удобства чтения, хотя HAProxy не требует строгого выравнивания. Старайтесь сохранять аккуратное форматирование.

Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).

Перезапустите HAProxy и выполните проверку

Конфигурация готова, но HAProxy ещё не использует её. Перезапустите службу, чтобы применить изменения.

sudo service haproxy restart

Теперь настало время проверки. Мы воспользуемся командой curl. Представляйте curl как веб-браузер без графического интерфейса: она загружает веб-страницу и выводит её текст на экран.

Подключимся к localhost — этому компьютеру — через порт 80 по умолчанию, на котором прослушивает HAProxy.

Выполните команду несколько раз:

curl localhost

Вы должны увидеть сообщение «Response from Server 1». Выполните команду ещё раз.

curl localhost

Теперь вы должны увидеть сообщение «Response from Server 2».

Чтобы быстро увидеть чередование ответов, выполните цикл, который обращается к серверу 4 раза подряд:

for i in {1..4}; do
  curl localhost
  echo
done

В выводе ответы должны идеально чередоваться: 1, 2, 1, 2.

Это подтверждает, что балансировщик нагрузки работает. Он принимает запросы на порту 80 и равномерно распределяет работу между портами 8001 и 8002.

Итоги

В этой лабораторной работе вы успешно создали веб-кластер с балансировкой нагрузки.

Вы выполнили следующие задачи:

  1. Имитировали Backend: с помощью Python создали два работающих веб-сервера на разных портах (8001 и 8002).
  2. Настроили Frontend: указали HAProxy прослушивать стандартный веб-порт 80.
  3. Настроили Backend: зарегистрировали два сервера в качестве рабочих серверов.
  4. Настроили Round Robin: задали справедливую политику чередования для распределения трафика.

Это та же архитектура, которую используют крупные веб-сайты для обработки миллионов пользователей, только в меньшем масштабе.