środa, 9 stycznia 2013

Load Balancer - HAProxy + HTTP Debian Lenny

Najkrócej mówiąc, skonfigurujemy maszyny tak, aby równomiernie rozłożyć obciążenie na dwie maszyny obsługujące Apache oraz dwie z Proxy. Dzięki czemu w przypadku uszkodzenie jednego z wezłów zachowamy działanie naszej infrastruktury.


LB1/LB2 lub HTTP1/HTTP2 oznaczają, że opisane czynności trzeba wykonać na odpowiednich maszynach.


HAProxy – jak możemy wyczytać z dokumentacji, jest to reverse proxy TCP/HTTP dla środowisk wysokiej dostępności, potrafiące m.in:
  • route’ować pakiety HTTP na podstawie zawartych Cookie
  • przełączać ruch na inny serwer w przypadku wykrycia awarii
  • blokować requesty HTTP na podstawie analizy nagłówków
  • generować statystyki ruchu/usług
  • modyfikować nagłówki HTTP w locie (coś dodać, coś usunąć, coś zmodyfikować)
  • zatrzymać przyjmowanie nowych połączeń bez zrywania nawiązanych
  • i wiele wiele więcej
 0) Informacje podstawowe:

Potrzebować będziemy 4 maszyn z systemem Debian Lenny:

Load Balancer 1: lb1.example.com, IP address: 192.168.1.100

Load Balancer 2: lb2.example.com, IP address: 192.168.1.101
HTTP 1: http1.example.com, IP address: 192.168.1.102
HTTP 2: http2.example.com, IP address: 192.168.1.103
Wirtualny adres IP łączący LB1 oraz LB2: 192.168.1.99

Diagram


Łącznik IP=192.168.1.99
 192.168.1.100  192.168.1.101 192.168.1.102 192.168.1.103
 -------+------------+--------------+-----------+----------
        |            |              |           |
     +--+--+      +--+--+      +----+----+ +----+----+
     | LB1 |      | LB2 |      |  HTTP1  | |  HTTP2  |
     +-----+      +-----+      +---------+ +---------+
     haproxy      haproxy            2xApache
     







1) HAProxy - transparentne proxy (HTTP1/HTTP2):


nano /etc/apache2/apache2.conf


dodajemy do niego:


LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


będziemy sprawdzać kondycję naszych maszyn:


nano /etc/apache2/sites-available/default


dodamy:



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

CustomLog /var/log/apache2/access.log combined env=!dontlog



restart:



/etc/init.d/apache2 restart

tworzymy plik check

touch /var/www/check.txt







2)Instalacja HAProxy (LB1/LB2):

aptitude install haproxy







3)Konfiguracja Load Balancers (LB1/LB2):



cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig



cat /dev/null > /etc/haproxy/haproxy.cfg



vi /etc/haproxy/haproxy.cfg


do niego dodajemy:




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.1.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.1.102:80 cookie A check
       server webB 192.168.1.103:80 cookie B check


Dodajemy ENABLED = 1


nano /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"







4) Sprawdzenie czy LB działają (dla LB1/LB2):

aptitude install keepalived


pozwolimy na dzielenie jednego IP:192.168.1.99:


nano /etc/sysctl.conf

dodajemy:

net.ipv4.ip_nonlocal_bind=1


uruchamiamy:

sysctl -p


LB1:


nano /etc/keepalived/keepalived.conf


dodajemy do niego:


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.1.99
        }
        track_script {
            chk_haproxy
        }
}


LB1:


/etc/init.d/keepalived start

ip addr sh eth0

Eth0 powinno nasłuchiwać również na 192.168.1.99/32

LB2:

nano /etc/keepalived/keepalived.conf


dodajemy do niego:


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.1.99
        }
        track_script {
            chk_haproxy
        }
}


LB2:

/etc/init.d/keepalived start

ip addr sh eth0


dla LB2 nie będziemy mięli 192.168.1.99.


LB1/LB2:

/etc/init.d/haproxy start


Teraz po wpisaniu http://192.168.1.99 powinniśmy zobaczyć poniższe okno, które pokaże nam obciążenie na konkretnych węzłach:







Brak komentarzy:

Prześlij komentarz