Содержание

High Availability and Load-Balancing

Подготовка

/etc/hosts - обязательно на каждой ноде прописываем все хосты на случай если что то может случиться с DNS

HAProxy

На обоих серверах делаем:

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
cat /dev/null > /etc/haproxy/haproxy.cfg
vi /etc/haproxy/haproxy.cfg
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 # для nginx комментируем
       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

keepalived

Этот сервис предназначен для мониторинга и управления выделенным виртуальным адресом в кластере серверов.

Устанавливаем его:

yum install -y keepalived

Для того, что бы HAProxy смог использовать виртуальный IP адрес, мы добавляем параметр в файл /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind=1

И запускам

sysctl -p

А там же нам надо в /etc/sysconfig/iptables разрешить MULTICAST, если нет. Добавляем строчку:

-A INPUT -s 192.168.0.0/24 -d 224.0.0.0/8 -j ACCEPT

Теперь настраиваем на keepalived на нодах.

На первой:

Файл: /etc/keepalived/keepalived.conf

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
        }
}

И запускаем keepalived

service keepalived start

Проверям конфигурацию. Должно получиться что то подобное:

# 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

Добавляем в автозагрузку

chkconfig keepalived on

На второй

Файл: /etc/keepalived/keepalived.conf

Небольшое, но очень важное отличие - мы используем здесь priority 100 вместо priority 101, что бы сделать вторую ноду запасной (slave или hot-standby)

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
        }
}

Запускаем:

/etc/init.d/keepalived start

И смотрим, что получилось:

# 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

Добавляем в автозагрузку

chkconfig keepalived on

Запуск

Запускаем HAProxy и добавляем его в автозагрузку.

service haproxy start

Статьи

Оригинал http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-keepalived-on-debian-lenny-p2

http://rails.nuvvo.com/lesson/3387-nginx-+-haproxy-usage-and-a-gotcha