Установка и настройка отказоустойчивого балансировщика нагрузки на основе Haproxy+Keepalived (Горизонтальное масштабирование на уровне приложений модели OSI) на Centos

Структурная схема кластера

На серверах lb01 и lb02 устанавливается Haproxy для балансировки нагрузки (распределения запросов клиентов на пару Web-серверов(серверов приложений app01 и app02)), а также для отказоустойчивости. При выходе со строя одного из lb-ов второй из них автоматически становится активным сервером(цепляет на себя VIP(Virtual IP) на который прописаны сайты в ДНС)

Это достигается за счет настроенного KeepAlived на обоих loadbalancer-серверах. Именно KeepAlived постоянно мониторит доступность активного loadbalancer -сервера и в случае его недоступности по какой-либо причине VIP-адрес перемещается с проблемного loadbalancer -сервера на запасной.

Запасной(вторичный) loadbalancer -сервер становится активным до тех пор пока не поднимется основной(loadbalancer, который имеет больший вес, согласно настройкам KeepAlived – это lb01)

HAProxy в свою очередь также мониторит Web-сервера на доступность и  в случае недоступности какого-то Web-сервера он будет автоматически выброшен с кластера

На структурной схеме обозначено:

-черным цветом штатный режим работы(lb01-активный,на него поступают все запросы клиентов, он мониторит Web-сервера и распределяет по ним  запросы клиентов)

-в случае проблем с lb01 ,автоматически становится главным lb02 и он уже выполняет все функции.Этот режим работы обозначен зеленым цветом

-красным цветом обозначена master-master(между app01 и app02) и master-slave(между активным  на текущий момент master-ом  и slave-ом) репликации

(В целях экономии виртуальных машин я поднял на app-серверах также mysql-mmm-кластер)

Более подробно о mysql-mmm изложено здесь

https://kamaok.org.ua/?p=282

Итого имеем

VIP-адреc  расшаренный/плавающий между двумя лоадбалансерами 192.168.1.127

Только активный в данный момент времени имеет на себе этот адрес( ip addr show покажет его)

Установка и настройка Keepalived

На обоих lb устанавливаем Keepalived и вносим необходимое значение в  переменную ядра

 

Для того, чтобы разрешить HAproxy прослушивать VIP-адрес(адрес, плавающий/расшаренный между двумя лоадбалансерами 192.168.1.127 )

Активный lb01(192.168.1.38)

Пассивный lb02(192.168.1.39)

Запускаем keepalived на lb01

Проверяем наличие VIP адреса на интерфейсе eth0

(смотрим через ip addr show(через ifconfig его не видно))

Запускаем keepalived на lb02

Проверяем отсутствие VIP адреса на интерфейсе eth0

Тестируем Keepalived

Например, останавливаем keepalived на активном лоадбалансере lb01

Логи для keepalived смотрим в

Бывший пассивный лоадбалансер lb02 стал активным путем получения роли Master и VIP-адреса

Добавление в автозагрузку на обоих севрерах

Установка и настройка Haproxy

Настройка rsyslog    для записи логов в файл /var/log/haproxy.log

 

Вся статистика по кластеру HAproxy становится доступна по адресу

с учеткой,указанной в haproxy.cfg

 

В корне сайта по умолчанию создаем файл test.php

Nginx у меня это определено так

Содержание проверочного файла

Для проверки балансировки запросов на оба Web-сервера на обоих серверах создаем либо разные странички для сайта по умолчанию, либо файл,например, с таким содержимым

Далее тестируем распределение  запросов

Т.е запросы по очереди направляются но оба Web-сервера

Далее, отключим, например, Nginx на сервере Web1

В логах haproxy наблюдаем

Тестируем

Т.е неисправный Web-сервер был автоамтически выброшен из кластера HAProxy и все запросы идут только к одному исправному Web-серверу

 

Приведенная выше настройка HAproxy не предусматривает поддержку sticky user’s session

Т.е нет возможности направить  все запросы пользователя на один и тот же сервер приложений. Такая привязка не нужна, например, если PHP-сессии хранятся в едином хранилище(например в общей папке примонтированной по NFS на серверах приложений, или PHP-сессии хранятся  на сервере/серверах memcache или в базе данных)

В случае,если нет единого общего типа хранения PHP-сессий необходимо настроить HAproxy для поддержки PHP-сессий

 

Настройка HAProxy для поддержки  PHP-сессий

При первом соединении с HAproxy-сервером клиент будет получать от HAproxy-сервера заголовок Set-Cookie со значением сервера, который его будет обслуживать.

При последующих подключениях этого клиента, браузер клиента сообщает HAproxy-серверу значение заголовка Cookie и уже на основании этого значения HAproxy-сервер направляет запрос клиента на сервер, который обслуживал его первый запрос т.е тем самым достигается возможность обработки всех запросов конкретного клиента одним и тем же сервером(т.е конкретный клиент прикрепляется к конкретному Web-серверу)

В данном случае HAproxy-сервер будет вставлять куку с именем SRVNAME (если только пользователь не пришел с такой кукой т.е, если это первый запрос пользователя),а значение этой куки будет app01 или app02.

Тестируем

Для эмуляции работы браузера (передачи полученной от HAproxy-сервера заголовка)

Используем команду

Оба этих запроса обработал все тот же сервер, который обрабатывал и самый первый запрос клиента(192.168.1.110 — app01)

 

Настройка HAproxy  и Nginx на отображение реального IP-адреса клиента в логах Nginx

а) в haproxy.cfg проверяем наличие строк для требуемого блока listen

б) проверяем сборку Nginx с опцией http_realip_module

 

Альтернатива:

1. Установка и настройка отказоустойчивого балансировщика нагрузки на основе Nginx+Keepalived (Горизонтальное масштабирование на уровне приложений модели OSI) на Centos

2.Установка и настройка отказоустойчивого балансировщика нагрузки на основе Keepalived в качестве одного из типов реализации LVS(Linux Virtual Server) (Горизонтальное масштабирование на транспортном уровне модели OSI) на Centos

 

Источник

https://www.digitalocean.com/community/articles/how-to-use-haproxy-to-set-up-http-load-balancing-on-an-ubuntu-vps

http://www.phphighload.com/2012/08/blog-post.html

http://www.timgalyean.com/2011/03/load-balancing-with-haproxy-and-apache/#!

http://www.howtoforge.com/haproxy_loadbalancer_debian_etch_p2

http://blog.exceliance.fr/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-you-need-to-know/

 

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика