RuCore.NET

Обзор возможностей HaProxy





HAProxy (High Availability Proxy) — популярный прокси сервер для Linux, Solaris и FreeBSD с возможностью балансировки нагрузки TCP/HTTP с открытым программным кодом. Его основная задача — повышение производительности серверной среды путем распределения рабочей нагрузки среди нескольких серверов (web, приложения, базы данных). Им пользуются такие известные проекты как GitHub, Imgur, Instagram и Twitter.

 



Терминология HAProxy

Существует ряд основополагающих терминов и положений, в которых стоит четко разбираться при обсуждении распределения нагрузки и прокси серверов. Но прежде, чем начать разбираться в новых терминах, стоит поговорить о том, что такое ACL, backend и frontend.

Список контроля доступа (ACL)

Когда мы разговариваем о распределении нагрузки, ACL применяется для проверки установленных правил распределения и для запуска некоторого действия (например, выбор сервера или блокировка сетевого запроса) в зависимости от применимости правила.

Использование ACL позволяет гибко управлять трафиком, перенаправляя его в зависимости от большего количества факторов, среди которых есть соответствие паттерну или ограничение количества соединений с бекэндом и др.

Пример ACL:

acl url_blog pat_beg /blog

Это правило будет применено в случае, если путь, к которому обращается пользователь начинается с /blog. То есть следующий запрос попадает под действие правила: //yourdomain.com/blog/blog-entry-1.

Для более подробного описания использования ACL обращайтесь к инструкции по настройке HAProxy.

Backend

Бекэндом называется набор серверов, получающих перенаправленные запросы пользователей. Они указываются в разделе настройки backend. В общем случае бекэнд определяется следующими параметрами:

  • алгоритм распределения нагрузки
  • набор серверов и портов

Бекэнд может включать в себя как один, так и несколько серверов. Другими словами, добавляя больше серверов вы увеличиваете максимально возможную нагрузку, распределяя её по всем серверам. Так же, таким образом, повышается отказоустойчивость в случае, если отказал один из серверов.

Приведем пример настройки двух бекэндов, web-backend и blog-backend обрабатывающих запросы? поступающие на 80 порт:

backend web-backend
  balance roundrobin
  server web1 web1.yourdomain.com:80 check
  server web2 web2.yourdomain.com:80 check

backend blog-backend
  balance roundrobin
  mode http
  server blog1 blog1.yourdomain.com:80 check
  server blog1 blog1.yourdomain.com:80 check

Строка balance roundrobin указывает на алгоритм балансировки, который описан в секции Алгоритмы распределения нагрузки ниже.

Mode http указывает на то, что будет использован 7 слой прокси, который также описан в Типы распределения нагрузки.

Параметр check означает, что эти серверы должны проверяться на работоспособность.

Frontend

Фронтэнд определяет каким образом запросы должны быть перенаправлены на бекэнд. Они указываются в разделе frontend настройки HAProxy. Их определение состоит из следующих частей:

  • набор ip адресов и портов
  • ACL
  • правила use_backend, указывающие на то, какой бекэнд должен быть задействован в зависимости от соответствия правилам ACL, а также и/или default_backend — бекэнд, используемый во всех остальных случаях.

Фронтэнды можно указывать различные для разного сетевого трафика, что мы обсудим позднее.

 

 

Имеет целую кучу опций и вариантов настройки, а также имеет свои причуды. Мне будет очень тяжело изложить содержание всех моих черновиков на эту тему в рамках этой статьи, поскольку она получится большой и тяжелой для усваивания, но я постараюсь дать обзор базовых принципов настройки.

На момент написания статьи вышел стабильный релиз 1.5.3 с поддержкой балансировки SSL соединений. В те времена, когда мне приходилось работать с Haproxy, доставка SSL трафика к конечному серверу производилась обычным форвардингом соединения на 443 порт.

К сожалению в репозитариях CentOS и Ubuntu последняя версия еще не доступна. Поэтому ее не буду рассматривать. О том, как установить и настроить HaProxy из исходников будет отдельная статья.

Устанавливается оно с помощью обычно мэнэджера пакетов. Дальше буду работать с CentOS:

yum install haproxy

После установки файл настроек сохраняется в /etc/haproxy

По умолчанию в этом файле можно описать все настройки. Есть общие настройки haproxy и настройки так называемых бэк-эндов (back-ends).

Общие настройки из секции global, как правило не требуют изменений.

Конфигурацию бэк-эндов я рассмотрю подробнее. Бэк-эндом (BackEnd) называется сервер, который находится за балансировщиком нагрузки, многие их называют головами или вэб головами (web heads). Есть два подхода к описанию кластеров серверов, находящихся за балансировщиком нагрузки:

1. Простой метод listen->servers используется в том случае, если у Вас есть несколько вэб серверов (допустим 3), их параметры одинаковы (CPU/RAM) и весь трафик равномерно распределяется между ними. В функционале серверов нету разницы. Каждый из них в равной степени может обрабатывать все входящие запросы. В таком случае

listen listener_mane
bind <strong>ip_address</strong>:80
option &lt;option1&gt;
option &lt;option2&gt;
....................
option &lt;optionN&lt;
server server1 192.168.1.10:80 &lt;option1&gt; &lt;option2&gt; ... &lt;option N>
server server2 192.168.1.20:80 &lt;option1&gt; &lt;option2&gt; ... &lt;option N>
server server3 192.168.1.30:80 &lt;option1&gt; &lt;option2&gt; ... &lt;option N>

Более тонкий метод frontend->backend->servers. В этом случае сервера групируются в так называемые backend, которые по сути представляют собой подобие секции listen, описанной в предыдущем пункте. Backendы в свою очередь объединятся в гллобальный frontend.

frontend &lt;instance_name&gt;
bind &lt;ip_address:port&gt;
mode &lt;layer mode&gt;
option &lt;option1&gt;
option &lt;option2&gt;
…
option &lt;optionN&gt;
acl &lt;acl_name1&gt; &lt;acl_type&gt; &lt;acl_definition&gt;

use_backend &lt;backend_name&gt; if &lt;acl_name1&gt; 
default_backend &lt;backend_name&gt;

backend static &lt;backend_name&gt;
balance &lt;ballance method&gt;
option &lt;option1&gt;
option &lt;option2&gt;
…
option &lt;optionN&gt;
server &lt;server_name1&gt; &lt;nod_ip_address&gt;:&lt;port&gt; &lt;option1&gt; &lt;option2&gt; … &lt;option N&gt;
server &lt;server_name2&gt; &lt;nod_ip_address&gt;:&lt;port&gt; &lt;option1&gt; &lt;option2&gt; … &lt;option N&gt;

backend web&lt;backend_name&gt; server &lt;server_name2&gt; &lt;nod_ip_address&gt;:&lt;port&gt; &lt;option1&gt; &lt;option2&gt; … &lt;option N&gt;
backend backoffice &lt;backend_name&gt; server &lt;server_name2&gt; &lt;nod_ip_address&gt;:&lt;port&gt; &lt;option1&gt; &lt;option2&gt; … &lt;option N&gt;

bind — определяет ip адрес и порт, на котором будет создан ip сокет для входящих соединений.

Что же качается режимов балансироваки нагрузки (**mode**), то их всего два:

  • http — используется исключительно для балансировки http трафика (уровень 7 OSI). Позволяет использовать возможности манипуляции с заголовками, куками и т.д.
  • tcp — универсальный режим. Можно использовать для балансироваки любого трафика (https, mysql, smtp, и т.д.)

option — с помощью этой директив можно включить дополнительные плюшки для необходимой секции.

Алгоритмы распределения нагрузки

Алгоритм распределения нагрузки отвечает за выбор сервера для обработки запроса пользователя. HAProxy предлагает нам несколько алгоритмов. В дополнение к алгоритму, мы можем указать вес каждого сервера, в соответствии с которым он будет выбран чаще или реже.

Мы рассмотрим только часто используемые алгоритмы, хотя HAProxy предлагает их намного больше. В инструкции по настройке HAProxy вы сможете ознакомится с ними более подробно.

Приведем основные алгоритмы:

roundrobin

Алгоритм, применяемый по умолчанию. Перебирает сервера по очереди.

leastconn

Выбирает сервер с наименьшим числом активных соединений. Рекомендуется к использованию для длинных сессий. Сервера в одном бекэнде варьируются циклически.

source

Выбирает сервер исходя из хеша, построенного на основе IP пользователя. Таким образом, пользователь всегда обращается к одному и тому же серверу.

Другие решения

Если HAProxy показался вам слишком сложным для решения ваших проблем, попробуйте рассмотреть следующие варианты:

  • Linux Virtual Servers (LVS) — просто балансировщик 4 уровня, включенный в большинство Linux дистрибутивов.
  • Nginx — быстрый и надежный веб сервер, который так же можно использовать в качестве балансировщика. Он очень часто используется в связке с HAProxy благодаря своим возможностям кеширования и архивирования.

Заключение

Итак, вы познакомились с основами распределения нагрузки и имеете представление каким образом HAProxy способен вам помочь. Теперь вы можете смело начать импровизировать для достижения лучших результатов работы вашего сервера.

 

Источник: //devacademy.ru/ и //www.tech-notes.net/



Поделись статьей с друзьями


68 просмотров



Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: