Мастер-Тур(15):Балансировщик нагрузки HaProxy

Материал из Megatec
Перейти к: навигация, поиск

Введение

При увеличении потока запросов на поиск и бронирование на службы Мастер-Тур, пользователи и поисковики начинают сталкиваться с замедлением в работе поиска и/или c таймаутами. Что в итоге приводит к снижению продаж. Балансировщик позволяет произвести горизонтальное масштабирование (путем поднятия нескольких служб), равномерно перераспределяя нагрузку между поднятыми службами.

Статья описывает процесс настройки балансировщика нагрузки с использованием HaProxy (серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP и HTTP приложений посредством распределения входящих запросов на несколько обслуживающих узлов). Этот инструмент включен в репозитории большинства Linux дистрибутивов и прост в установке и настройке.

Установка

Для установки и настройки HaProxy выполните следующие шаги:

  • Скачивание дистрибутива. Выбор Linux дистрибутива остается на усмотрение пользователя. В примере рассмотрен CentOS 7
  • Установка пакета 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