Установка Стабилизатора Загрузки С HAProxy/Keepalived На Debian / Ubuntu


Эта статья объясняет, как установить стабилизатор загрузки с двумя узлами в активной/пассивной конфигурации с HAProxy и keepalived на Debian. Стабилизатор загрузки находится между пользователем и два (или больше) внутренние Апачские веб-серверы, которые держат то же самое информационное наполнение. Мало того, что стабилизатор загрузки распространяет запросы двум внутренним серверам Apache, он также проверяет здоровье внутренних серверов. Если один из них снизится, то все запросы будут автоматически переадресованы на остающийся внутренний сервер. В дополнение к этому два узла стабилизатора загрузки контролируют друг друга, используя keepalived, и если задатчик терпит неудачу, раб становится задатчиком, что означает, что пользователи не будут обращать внимание ни на какое разрушение сервиса. HAProxy осведомлен о сессии, что означает, что Вы можете использовать его с любым веб-приложением, которое использует сессии (такие как форумы, телеги посещения магазина, и т.д.).От вебсайта HAProxy: «HAProxy — свободное, очень быстрое и надежное решение, предлагающее высокую пригодность, загрузить балансирование, и proxying для TCP и основанных на гипертекстовом транспортном протоколе приложений. Этому особенно удовлетворяют для вебсайтов, ползающих при очень высоких загрузках, нуждаясь в постоянстве или обработке Layer7. Поддержка десятков тысяч подключений ясно реалистична с todays аппаратными средствами. Его режим работы превращает его интеграцию в существующую очень легкую архитектуру и riskless, все еще предлагая возможность не выставить хрупкие веб-серверы Сети.»

Я не гарантирую, что это будет работать у Вас!

1 Предварительное Примечание1 Preliminary Note

В этой обучающей программе я буду использовать следующие главные компьютеры:

* Загрузите Стабилизатор 1: lb1.example.com, адрес IP: 192.168.0.100
Load Balancer 1: lb1.example.com, IP address: 192.168.0.100
* Загрузите Стабилизатор 2: lb2.example.com, адрес IP: 192.168.0.101
Load Balancer 2: lb2.example.com, IP address: 192.168.0.101
* Web-сервер 1: http1.example.com, адрес IP: 192.168.0.102
Web Server 1: http1.example.com, IP address: 192.168.0.102
* Web-сервер 2: http2.example.com, адрес IP: 192.168.0.103
Web Server 2: http2.example.com, IP address: 192.168.0.103
* Мы также нуждаемся в виртуальном адресе IP, который плавает между lb1 и lb2192.168.0.99

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

shared IP=192.168.0.99
192.168.0.100 192.168.0.101 192.168.0.102 192.168.0.103
——-+————+—————+————+———-
| | | |
+—+—+ +—+—+ +—-+—-+ +—-+—-+
| lb1 | | lb2 | | http1 | | http2 |
+——+ +——+ +———+ +———+
haproxy haproxy 2 web servers (Apache)
keepalived keepalived

Общедоступный (виртуальный) адрес IP не проблема, пока Вы находитесь в своей собственной локальной сети, где Вы можете назначить адреса IP, поскольку Вам нравится. Однако, если Вы хотите использовать эту установку с общественными адресами IP, Вы должны найти hoster, где Вы можете арендовать два сервера (узлы стабилизатора загрузки) в той же самой подсети; Вы можете тогда использовать свободный адрес IP в этой подсети для виртуального адреса IP.

http1 и http2 — стандартные установки Debian Lenny Apache с корнем документа/var/www (конфигурация этого значения по умолчанию vhost сохранен в/etc/apache2/sites-available/default). Если Ваш корень документа отличается, Вам, возможно, придется корректировать это руководство немного.

Чтобы продемонстрировать понимание сессии HAProxy, я предполагаю, что веб-приложение, которое установлено на http1 и http2, использует систему обнаружения атак сессии JSESSIONID.

2 Подготовки Внутренних Web-серверов

Мы конфигурируем HAProxy как прозрачный прокси-сервер, то есть, он передаст адрес IP оригинального пользователя в поле по имени X-Forwarded-For к внутренним веб-серверам. Конечно, внутренние веб-серверы должны регистрировать адрес IP оригинального пользователя в своих файлах регистрации доступа вместо адресов IP наших стабилизаторов загрузки. Поэтому мы должны изменить строку LogFormat в/etc/apache2/apache2.conf и заменить %h с %{X-Forwarded-For}i:

http1/http2:

Код:
vi /etc/apache2/apache2.conf
Код:
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

Кроме того, мы конфигурируем HAProxy, чтобы проверить здоровье внутренних серверов, непрерывно просящее файл check.txt (транслирует к/var/www/check.txt, если/var/www — Ваш корень документа) от внутренних серверов. Конечно, эти запросы полностью раздулись бы файлы регистрации доступа и смешали бы Вашу статистику представления страницы (если Вы используете инструмент как Webalizer или AWstats, который генерирует статистику, основанную на файлах регистрации доступа).

Поэтому мы открываем нашу vhost конфигурацию (в этом примере, в котором это находится/etc/apache2/sites-available/default), и поместите эти две строки в это (прокомментируйте все другие директивы CustomLog в своей vhost конфигурации):

Код:
vi /etc/apache2/sites-available/default
Код:
[...]
SetEnvIf Request_URI "^/check\.txt$" dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog
[...]

и создайте файл check.txt (это может быть пустым файлом):

Код:
touch /var/www/check.txt

Мы уже закончели с внутренними серверами; остальная часть конфигурации служит на двух узлах стабилизатора загрузки.

3 Установки HAProxy

lb1/lb2:

Мы можем установить HAProxy следующим образом:

Код:
aptitude install haproxy

4 Конфигурирования Стабилизаторов Загрузки

Конфигурация HAProxy сохранена в/etc/haproxy/haproxy.cfg и довольно прямая. Я не буду объяснять все директивы здесь; чтобы узнать больше обо всех опциях, пожалуйста читайте http://haproxy.1wt.eu/download/1.3/doc/haproxy-en.txt иhttp://haproxy.1wt.eu/download/1.2/doc/architecture.txt.

Мы резервируем оригинальный/etc/haproxy/haproxy.cfg и создаем новый как это:

lb1/lb2:

Код:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig
cat /dev/null > /etc/haproxy/haproxy.cfg
vi /etc/haproxy/haproxy.cfg
Код:
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #debug
        #quiet
        user haproxy
        group haproxy

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen webfarm 192.168.0.99:80
       mode http
       stats enable
       stats auth someuser:somepassword
       balance roundrobin
       cookie JSESSIONID prefix
       option httpclose
       option forwardfor
       option httpchk HEAD /check.txt HTTP/1.0
       server webA 192.168.0.102:80 cookie A check
       server webB 192.168.0.103:80 cookie B check

Впоследствии, мы устанавливаем, ENABLED to 1 in /etc/default/haproxy:

Код:
vi /etc/default/haproxy
Код:
# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
# Add extra flags here.
#EXTRAOPTS="-de -m 16"

5 Установок keepalived

Мы только что конфигурировали HAProxy, чтобы слушать на виртуальном адресе IP 192.168.0.99, но кто-то должен сказать lb1 и lb2, что они должны слушать на том адресе IP. Это сделано keepalived, который мы устанавливаем как это:

lb1/lb2:

Код:
aptitude install keepalived

Чтобы позволить HAProxy связывать с общедоступным адресом IP, мы добавляем следующую строку к/etc/sysctl.conf:

Код:
vi /etc/sysctl.conf
Код:
[...]
net.ipv4.ip_nonlocal_bind=1

… и работайте:

Код:
sysctl -p

Затем мы должны конфигурировать keepalived (это сделано через файл конфигурации/etc/keepalived/keepalived.conf). Я хочу, чтобы lb1 был активным (или задатчик) стабилизатор загрузки, таким образом мы используем эту конфигурацию на lb1:

lb1:

Код:
vi /etc/keepalived/keepalived.conf
Код:
vrrp_script chk_haproxy {           # Requires keepalived-1.1.13
        script "killall -0 haproxy"     # cheaper than pidof
        interval 2                      # check every 2 seconds
        weight 2                        # add 2 points of prio if OK
}

vrrp_instance VI_1 {
        interface eth0
        state MASTER
        virtual_router_id 51
        priority 101                    # 101 on master, 100 on backup
        virtual_ipaddress {
            192.168.0.99
        }
        track_script {
            chk_haproxy
        }
}

(Важно, что Вы используете приоритет 101 в вышеупомянутом файле — это делает lb1 задатчиком!)

Тогда мы запускаем keepalived на lb1:

lb1:

Код:
/etc/init.d/keepalived start

Тогда работайте:

lb1:

Код:
ip addr sh eth0

… и Вы должны найти, что lb1 теперь слушает на общедоступном адресе IP, также:
lb1:~# ip addr sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:63:f7:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
inet 192.168.0.99/32 scope global eth0
inet6 fe80::20c:29ff:fe63:f75c/64 scope link
valid_lft forever preferred_lft forever
lb1:~#

Теперь мы делаем почти то же самое на lb2. Есть одно маленькое, но важное различие — мы используем приоритет 100 вместо приоритета 101 в/etc/keepalived/keepalived.conf, который делает lb2 пассивным (подчиненное или горячее резервирование) стабилизатор загрузки:

lb2:

Код:
vi /etc/keepalived/keepalived.conf
Код:
vrrp_script chk_haproxy {           # Requires keepalived-1.1.13
        script "killall -0 haproxy"     # cheaper than pidof
        interval 2                      # check every 2 seconds
        weight 2                        # add 2 points of prio if OK
}

vrrp_instance VI_1 {
        interface eth0
        state MASTER
        virtual_router_id 51
        priority 100                    # 101 on master, 100 on backup
        virtual_ipaddress {
            192.168.0.99
        }
        track_script {
            chk_haproxy
        }

Тогда мы запускаем keepalived:

lb2:

Код:
/etc/init.d/keepalived start

Поскольку lb2 — пассивный стабилизатор загрузки, он не должен слушать на виртуальном адресе IP, пока lb1. Мы можем проверить что с:

lb2:

Код:
ip addr sh eth0

Вывод должен выглядеть следующим образом:

lb2:~# ip addr sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:be:7b:3b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.101/24 brd 192.168.0.255 scope global eth0
inet6 fe80::20c:29ff:febe:7b3b/64 scope link
valid_lft forever preferred_lft forever
lb2:~#

6 Стартов HAProxy
Теперь мы можем запустить HAProxy:

lb1/lb2:

Код:
/etc/init.d/haproxy start
Код:
7 Тестирований

Наш стабилизатор загрузки высокой пригодности теперь и выполнение.
Вы можете теперь обратиться с просьбами гипертекстового транспортного протокола к виртуальному адресу IP 192.168.0.99 (или к любому домену/имени хоста, который указывает на виртуальный адрес IP), и Вы должны получить информационное наполнение от внутренних веб-серверов.

Вы можете проверить его high-availability/failover возможности, выключая один внутренний веб-сервер — стабилизатор загрузки должен тогда переадресовать все запросы к остающемуся внутреннему веб-серверу. Впоследствии, выключите активный стабилизатор загрузки (lb1) — lb2, должен немедленно вступить во владение. Вы можете проверить что, работая:

lb2:

Код:
ip addr sh eth0

Вы должны теперь видеть виртуальный адрес IP в выводе на lb2:

lb2:~# ip addr sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:be:7b:3b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.101/24 brd 192.168.0.255 scope global eth0
inet 192.168.0.99/32 scope global eth0
inet6 fe80::20c:29ff:febe:7b3b/64 scope link
valid_lft forever preferred_lft forever
lb2:~#

Когда lb1 подойдет снова, он примет роль задатчика снова.

8 Статистических данных HAProxy

Вы, возможно, обратили внимание, что мы использовали опции stats, позволяют и stats подлинный someuser:somepassword в конфигурации HAProxy в главе 4. Это позволяет нам обращаться (к защищенной паролем) статистике HAProxy под URLhttp://192.168.0.99/haproxy? stats. Это — то, как это смотрит:

Если вам не нужна статистика, закомментируйте или удалите соответствующие строки stats из конфигурации HAProxy.