Thank you for reading this post, don't forget to subscribe!
HAProxy это ПО с открытым исходным кодом, а так же быстрый и надежный балансировщик нагрузки для TCP и HTTP-приложений, посредством распределения входящих запросов на несколько обслуживающих серверов.
1. Подготовка бэкендов
На каждый сервер установим web сервер nginx
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum -y install nginx
2. Установка балансировщика
При выборе сервера для балансировщика стоит исходить из того, что 1Гб ОЗУ хватает для обслуживания примерно 20-30 тысяч одновременных сессий, другими словами, пока ваш сервис не вырос до размеров фейсбука или твиттера, для работы балансировщика будет достаточно почти любого сервера.
yum -y install haproxy
3. Настройка балансировщика
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
Конфигурационный файл состоит из нескольких секций. Некоторые секции (frontend, backend, listen) должны иметь своё имя, некоторые (например, defaults) - могут, но не обязаны, некоторые (global) - не должны.
Добавим глобальные настройки:
1 2 3 4 5 6 7 8 |
global log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon |
Здесь мы дали HAProxy следующие указания:
- log - вести лог в /dev/log сохраняя в "объект" local0
- chroot - настройки безопасности, "запирающие" HAProxy в указанной директории
- stats socket - настройки сокета, по которому будет передаваться статистика
- maxconn - максимальное количество конкурирующих соединений на один процесс
- user - пользователь, от имени которого будет запущена программа
- group - группа пользователя, от имени которого будет запущена программа
- daemon - запуск процесса как демона
Выставим значения по умолчанию:
1 2 3 4 5 6 7 8 |
defaults log global mode http retries 3 option httplog option redispatch maxconn 2000 contimeout 2000 |
В секции defaults описываются параметры по умолчанию для всех других секций, следующих за данной. В вашем файле конфигрурации может быть несколько секций defaults, в таком случае параметры, описанные в данной секции, будут переопределены в следующей, и будут применяться к секциям, идущим за ней. В данной секции мы описали следующие параметры:
- log - указывает, в какой лог вести записи (global в данном случае означает, что используются параметры, заданные в секции global)
- mode - устанавливает протокол взаимодействия, принимает одно из значений: tcp, http, health
- retries - количество попыток соединения с сервером в случае отказа
- option httplog - формат лога, в случае использования HAProxy для проксирования HTTP-запросов, рекомендуется включать данную настройку
- option redispatch - разрешает программе разорвать и переназначить сессию в случае отказа сервера
- contimeout - максимальное время ожидания успешного соединения с сервером
Теперь укажем HAProxy, какие запросы он должен слушать, для этого нужна секция frontend, которую в нашем примере мы назовём "front":
1 2 3 |
frontend front bind *:80 default_backend backend_servers |
Параметр bind со значением *:80 говорит о том, что HAProxy должен принимать все запросы на 80-й порт. Параметр default_backend указывает, какие сервера будут обрабатывать эти запросы. В данном случае - backend_servers, так мы назвали следующую секцию:
1 2 3 4 5 6 |
backend backend_servers balance roundrobin server backend1 192.168.1.156 weight 1 server backend2 192.168.1.157 weight 2 |
В этой секции мы задали алгоритм балансировки (параметр balance) и список серверов-обработчиков (server). В качестве алгоритма балансировки мы указали простейший roundrobin, более подробно различные аглоритмы будут рассмотрены ниже.
При перечислении серверов используется следующий формат: ключевое слово server, название сервера, IP-адрес, дополнительные параметры (в данном случае - задание весов).
Теперь всё готово к тестированию, однако, вероятно, вы захотите следить за состоянием своей "фермы" и её статистикой, для этого добавим ещё одну секцию в файл конфигурации:
1 2 3 4 5 |
listen stats bind :80 stats enable stats uri /haproxy_stats stats auth admin:password |
- bind :80 означает, что HAProxy будет ожидать запросы к порту 80
- stats enable - включить отчёты со статистикой
- stats uri - установка адреса страницы с отчётом
- stats auth - логин и пароль для авторизации на странице со статистикой (может быть задано несколько)
Таким образом, в данной секции мы указали HAProxy, что он должен показывать статистику на странице "/haproxy_stats" на порту 10001, если пользователь введёт логин "admin" и пароль "password".
Конечный вид конфиг файла будет следующим:
global
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend front
bind *:80
default_backend backend_servers
backend backend_servers
balance roundrobin
server backend1 192.168.1.155:81 weight 1
server backend2 192.168.1.156:80 weight 5
server backend3 192.168.1.157:80 weight 3
listen stats
bind :80
stats enable
stats uri /haproxy_stats
stats auth admin:password
Перед перезапуском, рекомендуем проверить синтаксис
haproxy -f /etc/haproxy/haproxy.cfg -c
4.Тестирование
Переходим в браузере по адресу балансировщика, в моём примере это 192.168.1.155 . На экране я вижу строку "Welcome to Backend #1!" - эту строку отдаёт первый бэкенд. Обновив страницу, получаю "Welcome to Backend #2!" - ответ от другого бэкенда. Продолжая нажимать F5 я получаю последовательно адреса всех бэкендов. Здесь стоит упомянуть про веса серверов, которые мы задали в секции backend: вес выражается числом от 0 до 256, и запросы распределяются между серверами пропорционально их весу, что применяется в основном для распределения запросов между серверами с разной мощностью/производительностью. Мы видим, что ответы от сервера, которому задали больший вес, приходят чаще, чем от двух других.
Посмотрим статистику. Для этого нам нужно подключиться, используя параметры, заданные в секции stats: ввожу в адресной строке браузера 192.168.1.155:10001/haproxy_stats
5. Выбор алгоритма балансировки
HAProxy предлагает несколько алгоритмов балансировки, и в зависимости от вашей задачи можно выбрать наиболее подходящий:
- roundrobin - каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету
- static-rr - то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта
- leastconn - выбирает сервер с наименьшим количеством активных соединений
- first - выбирает первый сервер с доступными слотами для соединения
- source - на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения
- uri - сервер выбирается на основе адреса (без параметров) страницы
- url_param - сервер выбирается на основе GET-параметров запроса
- hdr - сервер выбирается на основе заголовков запроса
- rdp-cookie - сервер выбирается на основе cookie (если они не установлены, то применяется обычный round robin)