Мастер-Тур(15):Балансировщик нагрузки HaProxy
Введение
При увеличении потока запросов на поиск и бронирование на службы Мастер тур, пользователи и поисковики начинают сталкиваться с замедлением в работе поиска и/или c таймаутами. Что в итоге приводит к снижению продаж. Балансировщик позволяет произвести горизонтальное масштабирование (путем поднятия нескольких служб), равномерно перераспределяя нагрузку между поднятыми службами.
Статья описывает процесс настройки балансировщика нагрузки с использованием HaProxy(серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP- и HTTP-приложений посредством распределения входящих запросов на несколько обслуживающих узлов). Этот инструмент включен в репозитории большинства Linux-дистрибутивов и прост в установке и настройке.
Установка
Для установки и настройки HaProxy выполните следующие шаги:
1. Скачивание дистрибутива:
Выбор Linux-дистрибутива остается на усмотрение пользователя. В примере рассмотрен CentOS 7.
Ссылки на дистрибутив: Архив и Актуальные версии дистрибутивов
Официальная документация для установки дистрибутива
2. Установка пакета HaProxy:
yum install haproxy
3. Копирование оригинального файла конфигурации:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig
4. Редактирование файла конфигурации:
vi /etc/haproxy/haproxy.cfg
укажите свои параметры:
frontend main *:10000 - порт к которому будут обращаться клиенты для работы со службами
IpdaddressNode1:PortNode1 - ip адрес сервера со службой и порт на котором работает служба для первого узла
IpdaddressNode2:PortNode2 - ip адрес сервера со службой и порт на котором работает служба для второго узла
Конфигурация
Текст файла конфигурации для двух узлов TourSearchOwin:
#--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #---------------------------------------------------------------------
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon tune.bufsize 163840
# turn on stats unix socket stats socket /var/lib/haproxy/stats
#--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http stats enable # turns on stats module stats refresh 10s # set auto-refresh rate stats uri /stats log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 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
#--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *:10000 acl node1 urlp_val(nodeid,?) 1 acl node2 urlp_val(nodeid,?) 2
use_backend service_1 if node1 use_backend service_2 if node2
default_backend service_all
#--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend service_1 option httpchk GET /toursearchowin/cacheready http-check expect rstring ^.*true.*$ server nodeid1 IpdaddressNode1:PortNode1 check
backend service_2 option httpchk GET /toursearchowin/cacheready http-check expect rstring ^.*true.*$ server nodeid2 IpdaddressNode2:PortNode2 check
#--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend service_all balance roundrobin option httpchk GET /toursearchowin/cacheready http-check expect rstring ^.*true.*$ server nodeid1 IpdaddressNode1:PortNode1 check server nodeid2 IpdaddressNode2:PortNode2 check