Содержание

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »


Программное средство HAProxy используется для эффективного масштабирования TCP- и HTTP-приложений, обеспечивая высокую доступность, отказоустойчивость и распределение нагрузки посредством распределения входящих запросов на несколько обслуживающих серверов.

Данная статья применима к:

  • ОС СН Смоленск 1.6
  • ОС СН Ленинград 8.1
  • ОС ОН Орёл 2.12
  • Основные возможности HAProxy

    Периодическая проверка доступности обслуживающих серверов, на которые перенаправляются запросы пользователей;

    Несколько алгоритмов определения доступности серверов:

    tcp-check;

    http-check;

    mysql-check;
    Распределение HTTP-/HTTPS-/TCP-запросов между доступными серверами;
    Возможность закрепления определенных клиентов за конкретными обслуживающими серверам (stick-tables);
    Поддержка

    IPv6 и UNIX sockets,

    Сжатия HTTP/1.1 (deflate, gzip, libslz),

    SSL

    Полная поддержка постоянного HTTP-соединения;
    Поддержка переменных блоков и Lua-скриптов в конфигурации сервера;
    WEB-интерфейс с актуальным состоянием и статистикой работы программы.
    \subsubsection{Установка}\label{sec:haproxy_install}
    На основном сервере, который будет принимать запросы и распределять их, необходимо установить пакет HAProxy:
    \begin{verbatim}
    apt install haproxy
    \end{verbatim}


    \subsubsection{Настройка}\label{sec:haproxy_example}
    Настройка выполняется в конфигурационном файле \verb|/etc/haproxy/haproxy.cfg|,
    включающем следующие разделы:
    \begin{itemize}
    \item \verb|global| --- определяет общую конфигурацию для всего HAProxy;
    \item \verb|defaults| --- является обязательным и определяет настройки по-умолчанию для остальных разделов;
    \item \verb|frontend| --- используется для описания набора интерфейсов для принятия соединений от клиентов, а также правил распределения нагрузки;
    \item \verb|backend| --- используется для описания набора серверов, к которым будет выполняться подключение переадресованных входящих соединений, а также определения алгоритма распределения нагрузки;
    \item \verb|listen| --- объединенный раздел для описания \verb|frontend| и \verb|backend|. Используется для описания прокси-сервера в одном разделе, как правило, только для TCP-трафикa.
    \end{itemize}

    В таблице~\ref{tbl:haproxy_conf} представлены основные примеры значений параметров конфигурационного файла и их описание.

    \begin{longtable}[l]{|p{25mm}|p{55mm}|p{90mm}|}
    \RUSBCaption{Параметры конфигурационного файла \RUSBCourier{/etc/haproxy/haproxy.cfg}}
    \label{tbl:haproxy_conf}\\
    \hline
    \centering\arraybackslash Раздел &
    \centering\arraybackslash Параметр &
    \centering\arraybackslash Описание \\
    \hhline{|=|=|=|}
    \endfirsthead
    \noalign{\noindent\normalsize\textit{Продолжение таблицы \thetable}\vspace{5pt}}
    \hline
    \centering\arraybackslash Раздел &
    \centering\arraybackslash Параметр &
    \centering\arraybackslash Описание \\
    \hhline{|=|=|=|}
    \endhead
    \noalign{\noindent\normalsize\textit{Окончание таблицы \thetable}\vspace{5pt}}
    \hline
    \centering\arraybackslash Раздел &
    \centering\arraybackslash Параметр &
    \centering\arraybackslash Описание \\
    \hhline{|=|=|=|}
    \endlasthead
    \multirow{7}{1mm}\,{\RUSBCourier{global}} &
    \RUSBCourier{log <address> <facility>} \RUSBCourier{[max level [min level]]} \newline Например, \RUSBCourier{log 127.0.0.1 local0 notice} & Добавляет сервер системного журнала. \RUSBCourier{<facility>} --- должен быть одним из 24 стандартных типов регистрации событий: \verb|kern user mail daemon auth syslog lpr| \verb|news uucp cron auth2 ftp ntp audit| \verb|alert cron2 local0 local1 local2 local3| \verb|local4 local5 local6 local7|\\
    \cline{2-3}
    & \RUSBCourier{maxconn <number>} \newline Например, \RUSBCourier{maxconn 10000} & Устанавливает максимальное число одновременных подключений для каждого процесса \verb|haproxy|\\
    \cline{2-3}
    & \RUSBCourier{nbproc <number>}\newline Например, \RUSBCourier{nbproc 2} & Задает количество процессов \verb|haproxy|. По умолчанию создается только один процесс \verb|haproxy| \\
    \cline{2-3}
    & \RUSBCourier{daemon} & Устанавливает процессу \verb|haproxy| режим работы <<daemon>>\\
    \cline{2-3}
    & \RUSBCourier{user} & Пользователь, от имени которого работает процесс \verb|haproxy| \\
    \cline{2-3}
    & \RUSBCourier{group} & Группа, от имени которой работает процесс \verb|haproxy|\\
    \cline{2-3}
    & \RUSBCourier{chroot /var/lib/haproxy} & Устанавливает окружение процесса \verb|haproxy| \\
    \cline{2-3}
    \hline
    \multirow{7}{1mm}\,{\RUSBCourier{defaults}} & \RUSBCourier{log global} & Включает в регистрацию событий информацию о трафике \\
    \cline{2-3}
    & \RUSBCourier{mode http} & Режим работы HAProxy.
    Возможны два режима:
    \begin{itemize}
    \item \verb|http| --- выполняется анализ Layer~7, подходит для распределения http-трафика;
    \item \verb|tcp| --- распределение любого трафика
    \end{itemize}\\
    \cline{2-3}
    & \RUSBCourier{option dontlognull } & Отключает регистрацию пустых подключений \\
    \cline{2-3}
    & \RUSBCourier{retries 3} & Количество попыток определить состояние обслуживающего сервера после сбоя подключения \\
    \cline{2-3}
    & \RUSBCourier{option redispatch} & Распределяет запросы после сбоя подключения к одному из обслуживающих серверов \\
    \cline{2-3}
    & \RUSBCourier{option httpclose} & Закрывает пассивные соединения \\
    \cline{2-3}
    & \RUSBCourier{option forwardfor} & Включает X-Forwarded-For для передачи IP-адреса клиента обслуживающему серверу \\
    \hline
    \multirow{2}{1mm}\,{\RUSBCourier{frontend}} & \RUSBCourier{frontend http} & Задает имя \verb|frontend| \\
    \cline{2-3}
    & \RUSBCourier{bind *:80} & Задает IP-адрес и порт для прослушивания запросов \\
    \hline
    \newpage

    \hline
    \multirow{7}{1mm}\,{\RUSBCourier{backend}} & \RUSBCourier{backend sitecluster} & Задает имя обслуживающего сервера \\
    \cline{2-3}
    & \RUSBCourier{balance (roundrobin/leastconn/ static-rr/uri/source)} & Настройка алгоритма распределения. Поддерживаются следующие алгоритмы:
    \begin{itemize}
    \item \verb|Round Robin| --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. Вес сервера можно изменить <<на лету>>. Параметр включается при помощи команды \RUSBCourier{balance roundrobin};
    \item \verb|Least Connected| --- направляет новые подключения к серверу с наименьшим числом соединений. Параметр включается при помощи команды \RUSBCourier{balance leastconn};
    \item \verb|Static Round Robin| --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. В отличие от стандартной реализации \verb|Round Robin|, в данном алгоритме нельзя изменить вес сервера <<на лету>>. Изменение веса сервера требует перезагрузки HAProxy. Параметр включается при помощи команды \RUSBCourier{balance static-rr};
    \item \verb|Source| --- выбирает сервер исходя из хеша, построенного на основе IP-адреса пользователя. Таким образом, пользователь всегда обращается к одному и тому же серверу
    \end{itemize} \\
    \cline{2-3}
    & \RUSBCourier{server srv-1.3.my.com 21.86.21.20:80 cookie site113ha check inter 2000 fall 3 minconn 30 maxconn 70 weight 100} & Описание обслуживающего сервера, где:
    \begin{itemize}
    \item \verb|srv-1.3.my.com| --- имя сервера;
    \item \verb|21.86.21.20:80| --- IP-адрес: порт;
    \item \verb|cookie site113ha| --- задание cookie, необходимого для правильного распределения сессий клиентов;
    \item \verb|check inter 2000 fall 3| --- проверка доступности сервера каждые 2~с, при наличии трех ошибок считать сервер недоступным;
    \item \verb|minconn 30 maxconn 70| --- организация очереди запросов, ограничение не более 70 одновременно обрабатывающихся запросов;
    \item \verb|weight 100| --- вес сервера, возможные значения от 1 до 100
    \end{itemize} \\
    \cline{2-3}
    & \RUSBCourier{stats enable} & Включает статистику \\
    \cline{2-3}
    & \RUSBCourier{fullconn 200} & Задает максимальное значение одновременных подключений \\

    \hline
    \newpage
    \multirow{7}{1mm}\,{\RUSBCourier{listen}} & \RUSBCourier{listen stats-srv-3.my.com *:8180} & Описывает IP-адрес и порт доступа к статистике \\
    \cline{2-3}
    & \RUSBCourier{stats uri /stats} & URL доступа к статистике \\
    \cline{2-3}
    & \RUSBCourier{stats realm Haproxy\ Statistics} & Заголовок (title) страницы статистики \\
    \cline{2-3}
    & \RUSBCourier{stats show-legends} & Отображает в статистике дополнительную информацию о параметрах \\
    \cline{2-3}
    & \RUSBCourier{stats refresh 5s} & Указывает интервал автоматического обновления страницы статистики \\
    \cline{2-3}
    & \RUSBCourier{stats auth test:test} & Устанавливает логин и пароль доступа к странице статистики \\
    \hline
    \end{longtable}

    \begin{RUSBExample}
    Конфигурационный файл для распределения нагрузки сервера Apache
    \begin{verbatim}
    global
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 40000
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:
    ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:
    !aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3
    defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 5000
    timeout client 50000
    timeout server 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

    listen webcluster *:80
    mode http
    balance leastconn
    option forwardfor
    cookie serv insert
    option httpclose

    server webserver1 192.168.25.11:80 cookie serv1 check
    server webserver2 192.168.25.12:80 cookie serv2 check
    \end{verbatim}
    \end{RUSBExample}

  • No labels