Submitted by Adrian Joian on Sat, 16/08/2008 - 16:50

Acest tutorial va descrie felul in care se poate instala un load balancer pe doua noduri avand o configuratie activ/pasiv cu ajutorul Heartbeat si HAProxy.
Load balancer-ul va actiona intre doua sau mai multe Web Server-e Apache care pot servii acelasi continut. Acesta trimite cererile catre Web Server-e si verifica de asemenea starea lor. Daca unul dintre Web Server-e este "picat" atunci toate cererile vor fi redirectate automat catre Web Server-ele ramase.
Pe langa cele de mai sus cele doua load-balancer-e se monitorizeaza intre ele folosing hearbeat. Daca nodul master "pica" atunci nodul slave devine activ astfel utilizatorii nu vor simtii pierderea unuia dintre noduri ori pierderea serviciului web. HAProxy este de asemenea si "session-aware" ceea ce inseamna ca se poate folosi impreuna cu el orice aplicatie care se foloseste de sesiuni cu ar fi forumuri ori magazine virtuale.

1 Pregatire


Pentru acest tutorial trebuie mai intai facuta cate o instalare minimala fara GUI a sistemul de operare Fedora ori Centos pentru urmatoarele 4 masini:

1.1 Load Balancer 1


Hostname: ldb1.example.com
IP: 192.168.0.10
IP Comun: 192.168.0.20

1.2 Load Balancer 2


Hostname: ldb2.example.com
IP: 192.168.0.11
IP Comun: 192.168.0.20

1.3 Web Server 1


Hostname: http1.example.com
IP: 192.168.0.12

1.4 Web Server 2


Hostname: http2.example.com
IP: 192.168.0.13

2 HTTP1 & HTTP2


Ca Web Server-ele sa fie accesibile din exterior nu uitati ca trebuiesc deschise in firewall porturile 80 si 443 pe ambele Webserv-e. Comenzile pentru a face acest lucru posibil si permanent sunt:

iptables -A INPUT -p tcp -s 0/0 -m multiport --dports 80,443 -j ACCEPT
iptables-save

2.2 Apache Configuration


HAProxy va functiona ca un proxy transparent astfel adresa IP va fi trimisa in campul "X-Forwarded-For" catre Web Server-e. Pentru ca Web Server-ele sa intregistreze corect in loguri adesa IP a celui care face cererea si nu adresa load balancer-ului trebuie sa modificam formatul log-ului, aceasta se tare se gaseste in fisierul de configuratie al Apache-ului si ea trebuie facuta pe ambele Web Server-e. Astfel editam :

vi /etc/httpd/conf/httpd.conf

si schimbam urmatoarele linii sa arate astfel:


[...]
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
[...]

Vom configura HAProxy sa verifice starea Web Server-elor facand de fiecare data cerere pentru fisierul check.txt. Pentru a optimiza marimea logurilor vom personaliza setarile pentru vhost-uri pe ambele Web Server-e astfel incat cererea pentru check.txt sa nu fie inregistrata.
In acest exemplu vhost-urile sunt configurate in fisierul /etc/httpd/conf/httpd.conf:
Adaugati urmatoarea linie in configuratia vhost-ului:


SetEnvIf Request_URI "^/check\.txt$" dontlog

mai adaugati exceptia (env=!dontlog) pe aceeasi linie dupa CustomLog. Un exemplu pentru primul virtual host poate arata in felul urmator:


NameVirtualHost 192.168.0.112:80


    ServerName webA.example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/html/webA
    
    SetEnvIf Request_URI "^/check\.txt$" dontlog
    LogLevel warn
    ErrorLog /var/log/httpd/vhost_error.log
    CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog

Acum mai trebuie doar sa cream fisierul check.txt in document root-ul primul virtual host:


touch /var/www/haproxy/html/webA

Prin urmatoarele 2 comenzi se va termina configuratia Web-Server-elor, astfel restartam serviciul si facem ca acesta sa porneasca in timpul boot-ari sistemului


/etc/init.d/httpd restart
chkconfig httpd on

3 LDB1 & LDB2


3.1 Configurarea Firewall-ului
Conexiunile HTTP si HTTPS vor fi trimise corect intre Web Server-e daca daemon-ul heartbeat poate comunica corect intre noduri, astfel trebuie sa deschidem portul UDP 694 pe ambele load balacer-e folosind urmatoarele comenzi:

iptables -A INPUT -p udp -s 0/0  --dport 694 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -m multiport --dports 80,443 -j ACCEPT
iptables-save

3.2 Pachete necesare pe cele doua Load Balancer-e


Instalarea pachetelor se va face cu yum:

yum -y install haproxy heartbeat

3.3 Configurarea HAProxy


cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig
cat /dev/null > /etc/haproxy/haproxy.cfg
vi /etc/haproxy/haproxy.cfg

Continutul fisierului de configurare pe ambele load balacere-e trebuie sa fie urmatorul:


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 webservers 192.168.0.20:80
       mode http
       stats enable
       stats auth fedorauser:fedorapassword
       balance roundrobin
       cookie JSESSIONID prefix
       option httpclose
       option forwardfor
       option httpchk HEAD /check.txt HTTP/1.0
       server webA 192.168.0.12:80 cookie A check
       server webB 192.168.0.13:80 cookie B check


Nota: Daca doriti sa aflati mai multe despre optiunile de configurare a HAProxy, va putei informa la adresele http://haproxy.1wt.eu/download/1.3/doc/haproxy-en.txt si http://haproxy.1wt.eu/download/1.2/doc/architecture.txt.

3.4 Configurarea Heartbeat


3.4.1 Pe ambele Load Balancer-e

Heartbeat va informa LDB1 si LDB2 ca trebuie sa asculte pe adresa comuna IP (192.168.0.20). In prima faza trebuie sa permitem HAProxy sa foloseasca adresa IP comuna:


vi /etc/sysctl.conf


Adaugati urmatoarele linii in fisier:


# Allow HAProxy shared IP
net.ipv4.ip_nonlocal_bind = 1


Apoi rulati:

 sysctl -p


Acum trebuie sa cream cele trei fisiere de configuratie pentru heartbeat.


vi /etc/ha.d/authkeys


Continutul fisierului ar trebuii sa arata astfel - trebuie sa inlocuti %auth_password% cu o parola aleasa de dumnevoastra. Daemon-ul heartbeat de pe ambele noduri ale load balancer-ului va folosi aceeasi parola pentru a se unul cu celalat.


auth 3
3 md5 %authpassword%

Schimbati drepturile pe fisier astfel incat doar root sa il poata accesa:


chmod 600 /etc/ha.d/authkeys

Urmatorul fisier va fi:


vi /etc/ha.d/haresources

Continutul acestui fisier trebuie sa arate astfel pe ldb1:


ldb1.example.com 192.168.0.120 haproxy


si pe ldb2


ldb2.example.com 192.168.0.20 haproxy

3.4.2 Pe Load Balancer-ul 1 (LDB1)


vi /etc/ha.d/ha.cf

Continutul acestui fisier trebuie sa arate astfel:


#
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  eth0
mcast eth0 225.0.0.1 694 1 0
ucast eth0 192.168.0.10
#       What interfaces to heartbeat over?
udp     eth0
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    ldb1.example.com
node    ldb2.example.com

Pe Load Balancer-ul 2 (LDB2)


vi /etc/ha.d/ha.cf

Continutul acestui fisier trebuie sa arate astfel:


#
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  eth0
mcast eth0 225.0.0.1 694 1 0
ucast eth0 192.168.0.11
#       What interfaces to heartbeat over?
udp     eth0
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    ldb1.example.com
node    ldb2.example.com

Apoi putem porni heartbeat pe ambele noduri:


/etc/init.d/heartbeat start

4 Failover Test


4.1 Pentru Web Server-e


Opriti unul dintre cele 2 web server-e si apoi faceti cereri HTTP catre ip-ul 192.168.0.20, astfel server-ul inca functional va trebui sa raspunda si sa va afiseze continutul.

4.2 Pentru Load Balancer


Opriti load balacer-ul activ LDB1 - imediat load balancer-ul pasiv LDB2 va prelua controlul.

5 HAProxy Statistics


HAProxy vine si cu o interfata web pentru statistici. Ea poate fi accesata din web browser via http://192.168.0.20/haproxy?stats. Intrati cu datele pe care le-ati introdus in fisierul de configurare HAProxy (in acest examplu va puteti autentifica cu username "fedorauser" si parola "fedorapassword". Daca nu aveti nevoie de statistici, puteti sterge liniile care incep cu "stats" din fisierul de configurare HAProxy de pe ambele load balancer-e.

Statistici

Tutoriale

Add new comment