Мастер-Тур(15):Балансировщик нагрузки HaProxy — различия между версиями
| [досмотренная версия] | [досмотренная версия] |
Gavrilov (обсуждение | вклад) (Новая страница: «==Введение== Эта инструкция описывает процесс настройки простейшего балансировщика наг…») |
Moism (обсуждение | вклад) |
||
| (не показано 7 промежуточных версий 3 участников) | |||
| Строка 1: | Строка 1: | ||
==Введение== | ==Введение== | ||
| − | + | При увеличении потока запросов на поиск и бронирование на службы Мастер-Тур, пользователи и поисковики начинают сталкиваться с замедлением в работе поиска и/или c таймаутами. Что в итоге приводит к снижению продаж. Балансировщик позволяет произвести горизонтальное масштабирование (путем поднятия нескольких служб), равномерно перераспределяя нагрузку между поднятыми службами. | |
| + | |||
| + | Статья описывает процесс настройки балансировщика нагрузки с использованием [https://www.haproxy.com/ ''HaProxy''] (серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP и HTTP приложений посредством распределения входящих запросов на несколько обслуживающих узлов). Этот инструмент включен в репозитории большинства Linux дистрибутивов и прост в установке и настройке. | ||
==Установка== | ==Установка== | ||
| − | Для установки и настройки HaProxy выполните следующие шаги: | + | Для установки и настройки ''HaProxy'' выполните следующие шаги:<br /> |
| − | + | * Скачивание дистрибутива. Выбор Linux дистрибутива остается на усмотрение пользователя. В примере рассмотрен ''CentOS 7'' | |
| − | + | ** Архив дистрибутива https://vault.centos.org/7.7.1908/ | |
| + | ** Актуальные версии дистрибутивов https://www.centos.org/download/ | ||
| + | ** Официальная документация для установки https://netpoint-dc.com/blog/centos-8-installation-guide/ <br /> | ||
| + | * Установка пакета ''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: | Текст файла конфигурации для двух узлов TourSearchOwin: | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
| Строка 31: | Строка 31: | ||
# | # | ||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
# Global settings | # Global settings | ||
| Строка 57: | Строка 56: | ||
daemon | daemon | ||
tune.bufsize 163840 | tune.bufsize 163840 | ||
| − | |||
# turn on stats unix socket | # turn on stats unix socket | ||
stats socket /var/lib/haproxy/stats | stats socket /var/lib/haproxy/stats | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
# common defaults that all the 'listen' and 'backend' sections will | # common defaults that all the 'listen' and 'backend' sections will | ||
| Строка 85: | Строка 82: | ||
timeout check 10s | timeout check 10s | ||
maxconn 3000 | maxconn 3000 | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
# main frontend which proxys to the backends | # main frontend which proxys to the backends | ||
| Строка 92: | Строка 88: | ||
acl node1 urlp_val(nodeid,?) 1 | acl node1 urlp_val(nodeid,?) 1 | ||
acl node2 urlp_val(nodeid,?) 2 | acl node2 urlp_val(nodeid,?) 2 | ||
| − | |||
use_backend service_1 if node1 | use_backend service_1 if node1 | ||
use_backend service_2 if node2 | use_backend service_2 if node2 | ||
| − | |||
default_backend service_all | default_backend service_all | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
# static backend for serving up images, stylesheets and such | # static backend for serving up images, stylesheets and such | ||
| Строка 105: | Строка 98: | ||
http-check expect rstring ^.*true.*$ | http-check expect rstring ^.*true.*$ | ||
server nodeid1 IpdaddressNode1:PortNode1 check | server nodeid1 IpdaddressNode1:PortNode1 check | ||
| − | |||
| − | |||
backend service_2 | backend service_2 | ||
option httpchk GET /toursearchowin/cacheready | option httpchk GET /toursearchowin/cacheready | ||
http-check expect rstring ^.*true.*$ | http-check expect rstring ^.*true.*$ | ||
server nodeid2 IpdaddressNode2:PortNode2 check | server nodeid2 IpdaddressNode2:PortNode2 check | ||
| − | |||
#--------------------------------------------------------------------- | #--------------------------------------------------------------------- | ||
# round robin balancing between the various backends | # round robin balancing between the various backends | ||
| Строка 121: | Строка 111: | ||
server nodeid1 IpdaddressNode1:PortNode1 check | server nodeid1 IpdaddressNode1:PortNode1 check | ||
server nodeid2 IpdaddressNode2:PortNode2 check | server nodeid2 IpdaddressNode2:PortNode2 check | ||
| + | |||
| + | ==Рекомендации по работе с HaProxy== | ||
| + | Для работы с туроператором Мастер-Тур через API, используются методы [[Мастер-Тур(15):API для отдачи цен в поисковые системы#Поиск туров (GetTours)|GetTours]] и [[Мастер-Тур(15):API для отдачи цен в поисковые системы#Поиск всех цен по туру (GetToursAllPrices) начиная с релиза 15.3|GetToursAllPrices]].<br /> | ||
| + | |||
| + | Также добавлена возможность работы в корзине с методами основного API для разработки поиска и бронирования: [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Поиск туров (Tour)|Tour]] ([[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Поиск туров онлайн (TourForWeb)|Simple]]), [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Выгрузка настройки отображения полей по туристам (TouristDataSettings)|TouristDataSettings]], [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Выгрузка услуг доплат к авиаперелетам (GetFlightsAdditionalServices)|GetFlightsAdditionalServices]], [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Выгрузка услуг доплат к отелям (GetHotelsAdditionalServices)|GetHotelsAdditionalServices]], [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Расчет индивидуальных услуг (CalculateIndividualServiceCosts)|CalculateIndividualServiceCosts]], [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Расчет путевки (CalculateReservation)|CalculateReservation]], [[Мастер-Тур(15):API для разработки онлайн поиска и бронирования#Бронирование путевки (CreateReservation)|CreateReservation]]. При последовательном вызове этих контроллеров – необходимо использовать единый ''nodeId'' во всей цепочке вызовов (полученный в предыдущем методе).<br /> | ||
| + | '''Важно:''' обработка реализована только в API (приложение ''Canary'' и ''TourSearchClient'' эти параметры пока не обрабатывает. | ||
| + | |||
| + | Для корректной работы с HaProxy, рекомендуется настроить его для балансировки нагрузки между несколькими серверами, обрабатывающими запросы к API. | ||
| + | При настройке '''HaProxy''' для распределения запросов на несколько серверов следует использовать параметры '''acl''' и '''use_backend''', как показано в конфигурации. Например, запросы могут направляться на разные серверы в зависимости от значения параметра '''nodeid''': | ||
| + | acl node1 urlp_val(nodeid,?) 1 | ||
| + | acl node2 urlp_val(nodeid,?) 2 | ||
| + | use_backend service_1 if node1 | ||
| + | use_backend service_2 if node2 | ||
Текущая версия на 16:28, 13 ноября 2025
Введение
При увеличении потока запросов на поиск и бронирование на службы Мастер-Тур, пользователи и поисковики начинают сталкиваться с замедлением в работе поиска и/или c таймаутами. Что в итоге приводит к снижению продаж. Балансировщик позволяет произвести горизонтальное масштабирование (путем поднятия нескольких служб), равномерно перераспределяя нагрузку между поднятыми службами.
Статья описывает процесс настройки балансировщика нагрузки с использованием HaProxy (серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP и HTTP приложений посредством распределения входящих запросов на несколько обслуживающих узлов). Этот инструмент включен в репозитории большинства Linux дистрибутивов и прост в установке и настройке.
Установка
Для установки и настройки HaProxy выполните следующие шаги:
- Скачивание дистрибутива. Выбор Linux дистрибутива остается на усмотрение пользователя. В примере рассмотрен CentOS 7
- Архив дистрибутива https://vault.centos.org/7.7.1908/
- Актуальные версии дистрибутивов https://www.centos.org/download/
- Официальная документация для установки https://netpoint-dc.com/blog/centos-8-installation-guide/
- Установка пакета 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
Рекомендации по работе с HaProxy
Для работы с туроператором Мастер-Тур через API, используются методы GetTours и GetToursAllPrices.
Также добавлена возможность работы в корзине с методами основного API для разработки поиска и бронирования: Tour (Simple), TouristDataSettings, GetFlightsAdditionalServices, GetHotelsAdditionalServices, CalculateIndividualServiceCosts, CalculateReservation, CreateReservation. При последовательном вызове этих контроллеров – необходимо использовать единый nodeId во всей цепочке вызовов (полученный в предыдущем методе).
Важно: обработка реализована только в API (приложение Canary и TourSearchClient эти параметры пока не обрабатывает.
Для корректной работы с HaProxy, рекомендуется настроить его для балансировки нагрузки между несколькими серверами, обрабатывающими запросы к API. При настройке HaProxy для распределения запросов на несколько серверов следует использовать параметры acl и use_backend, как показано в конфигурации. Например, запросы могут направляться на разные серверы в зависимости от значения параметра nodeid:
acl node1 urlp_val(nodeid,?) 1 acl node2 urlp_val(nodeid,?) 2 use_backend service_1 if node1 use_backend service_2 if node2