haproxy: Принцип работы на примере

haproxy logo

haproxy — это балансировщик, распределяющий запросы, приходящие на фронтэнд, на несколько бэкендов. Haproxy обеспечивает очень высокую производительность и используется на высоконагруженных проектах. Его основные преимущества — скорость работы и простота настройки и интеграции в уже существующие системы.

Логотип haproxy является иллюстрацией его работы. Запросы приходят на одну машину, и распределяются на несколько. При этом вы можете просматривать статистику запросов и нагрузку.

Давайте посмотрим, как это работает.

Установим на одной машине haproxy на одном порту (80) и поднимем несколько экземпляров веб-сервера на разных портах (1080, 2080 и 3080). Для иллюстрации этого будет достаточно.

В первую очередь установим nginx, на котором сконфигурируем три сервера на разных портах.

# apt-get install nginx

Теперь сконфигурируем сервера на nginx.

Создадим в директории /etc/nginx/sites-available/ три файла следующего содержания:

www1:

server {
listen *:1080;
root /var/www;
index index.html;
}

www2:

server {
listen *:2080;
root /var/www;
index index.html;
}

www3:

server {
listen *:3080;
root /var/www;
index index.html;
}

Теперь создадим директорию /var/www

mkdir /var/www
chmod 755 /var/www

И разместим в этой директории файл index.html следующего содержания:

index page

It works!

 

И теперь запустим nginx:

# service nginx start

Для проверки можно проверить, работают ли эти сервера, при помощи команды

# apt-get install curl
# curl http://127.0.0.1:{1080,2080,3080}

Если вы видите три раза выведенное содержимое файла index.html, значит всё в порядке, можно приступать к установке и настройке haproxy.

Установка haproxy

Перед установкой haproxy в debian’е необходимо добавить репозиторий wheezy-backports. Можно добавить строчку в файл /etc/apt/sources.list, либо создать отдельный файл в директории /etc/apt/sources.list.d с названием, например, wheezy-backports.list и записать туда строчку:

deb http://YOURMIRROR.debian.org/debian wheezy-backports main

YOURMIRROR — это, например, «ftp.us» или «ftp.ru», в зависимости от того, из репозитория в каком регионе вы будете устанавливать пакеты.

После этого обновляем список пакетов:

# apt-get update

И устанавливаем пакет haproxy:

# apt-get install haproxy

После установки пакета можно сразу переходить к настройке

Настройка haproxy

Основной конфигурационный файл haproxy — /etc/haproxy/haproxy.conf

Немного изменим конфигурационный файл, чтобы он выглядел так:

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon
        debug
        stats socket /var/run/haproxy.sock mode 600

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        contimeout 5000
        clitimeout 50000
        srvtimeout 50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http
        stats enable
        stats uri /stats
        stats realm Global\ statistics
        stats auth admin:password

frontend http
        bind 192.168.0.14:80
        default_backend my_cluster

backend my_cluster
        balance roundrobin
        server www1 192.168.0.14:1080 check inter 3000 fall 3 minconn 50
        server www2 192.168.0.14:2080 check inter 3000 fall 3 minconn 50
        server www3 192.168.0.14:3080 check inter 3000 fall 3 minconn 50

После запуска haproxy с таким конфигурационным файлом вы можете в браузере открыть страничку http://<ваш-балансировщик>/stats, на которой вы можете увидеть примерно такую картинку (картинка открывается по клику):

Статистика haproxy

Это таблица, в которой собрана статистика по работе балансировщика.

Проведен небольшой эксперимент. При помощи программы wget запросим страничку тысячу раз такой командой:

for i in `seq 1 1000`; do wget http://192.168.0.14 -O -; done

После этого еще раз посмотрим на страничку со статистикой (картинка открывается по клику):

haproxy статистика

Как видите, сессии равномерно распределены между тремя бэкендами. Теперь давайте отключим один из бэкендов, закомментировав его в конфигурационном файле nginx’а. И после этого выполним еще тысячу запросов. Картинка изменится (картинка открывается по клику):

hap03

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

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

И, что еще интересно, haproxy умеет распределять не только http-запросы, но и трафик на уровне tcp, поэтому его можно использовать для широкого круга задач, а не только балансировки веб-сайтов.

[wysija_form id=»2″]