Мастер-Тур(15):Балансировщик нагрузки HaProxy
Введение
При увеличении потока запросов на поиск и бронирование на службы Мастер-Тур, пользователи и поисковики начинают сталкиваться с замедлением в работе поиска и/или c таймаутами. Что в итоге приводит к снижению продаж. Балансировщик позволяет произвести горизонтальное масштабирование (путем поднятия нескольких служб), равномерно перераспределяя нагрузку между поднятыми службами.
Статья описывает процесс настройки балансировщика нагрузки с использованием HaProxy (серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP и HTTP приложений посредством распределения входящих запросов на несколько обслуживающих узлов). Этот инструмент включен в репозитории большинства Linux дистрибутивов и прост в установке и настройке.
Установка
Для установки и настройки HaProxy выполните следующие шаги:
- Скачивание дистрибутива. Выбор Linux дистрибутива остается на усмотрение пользователя. В примере рассмотрен CentOS 7
- Архив дистрибутива https://vault.centos.org/7.7.1908/
- Актуальные версии дистрибутивов https://www.centos.org/download/
- Официальная документация для установки https://docs.centos.org/en-US/8-docs/standard-install/proc_performing-a-quick-install-with-gui/
- Установка пакета HaProxy
- yum install haproxy
- Копирование оригинального файла конфигурации
- cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig
- Редактирование файла конфигурации
- 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