Page tree
Skip to end of metadata
Go to start of metadata

Beschreibung

Die folgende Dokumentation beschreibt die Installation eines Load Balancers unter Ubuntu 12.04 mit Nginx. Der Load Balancer wird als Cluster mit Hochverfügbarkeit über eine Failover IP mit Corosync und Pacemaker betrieben. Die Anfragen werden gleichmäßig auf 4 Application Server verteilt.

Die Architektur sieht wie folgt aus:

Folgende IP's werden verwendet:

10.4.12.222 cluster // Im produktiven Aufbau wird hier eine öffentliche IP verwendet

10.4.12.158 node1
10.4.12.159 node2

10.4.12.112 appserver1
10.4.12.113 appserver2
10.4.12.114 appserver3
10.4.12.115 appserver4

Corosync und Pacemaker

Installation

Software installieren:

node[1|2] # aptitude install corosync pacemaker

Key erzeugen:

node1 # corosync-keygen
node1 # scp /etc/corosync/authkey root@node2:/etc/corosync/

Firewall anpassen:

node[1|2] # vi /etc/iptables.rules

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 5404 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 5405 -j ACCEPT
-A INPUT -j DROP
COMMIT

node[1|2] # iptables-restore < /etc/iptables.rules
node[1|2] # vi /etc/network/interfaces

auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.rules

Konfiguration erstellen und Cluster starten:

node[1|2] # vi /etc/default/corosync

START=yes

node[1|2] # vi /etc/corosync/corosync.conf

compatibility: whitetank
totem {
        version: 2
        secauth: off
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 10.4.12.1
                mcastaddr: 226.94.1.1
                mcastport: 5405
                ttl: 1
        }
}
quorum {
           provider: corosync_votequorum
           expected_votes: 2
}
logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        to_syslog: yes
        logfile: /var/log/corosync/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
        }
}
amf {
        mode: disabled
}
service {
        name: pacemaker
        ver: 1
}

node[1|2] # /etc/init.d/corosync start
node[1|2] # update-rc.d corosync defaults
node[1|2] # /etc/init.d/pacemaker start
node[1|2] # update-rc.d pacemaker defaults

Installation prüfen:

node1 # corosync-quorumtool -l
Nodeid     Votes  Name
2651587594     1  10.4.12.158
2668364810     1  10.4.12.159

node1 # corosync-cfgtool -s
Printing ring status.
Local node ID -1643379702
RING ID 0
    id    = 10.4.12.158
    status    = ring 0 active with no faults

node1 # crm_mon -1
============
Last updated: Mon Apr 15 09:39:25 2013
Last change: Mon Apr 15 09:35:24 2013 via crmd on node1
Stack: openais
Current DC: node1 - partition with quorum
Version: 1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ node1 node2 ]

Konfiguration

Aktuelle Konfiguration prüfen:

node1 # crm configure show
node node1
node node2
property $id="cib-bootstrap-options" \
    dc-version="1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c" \
    cluster-infrastructure="openais" \
    expected-quorum-votes="2"

Im ersten Schritt deaktiviert man Stonith:

node1 # crm configure property stonith-enabled=false

Dann konfiguriert man eine Failover IP:

node1 # crm configure primitive failover-ip ocf:heartbeat:IPaddr params ip=10.4.12.222 op monitor interval=10s

Nginx

Als Load Balancer kommt Nginx in Version 1.1.19 zum Einsatz.

Installation

Im ersten Schritt installiert man auf beiden Nodes die Software:

node[1|2] # aptitude install nginx

Der Zugriff auf den Nginx Webserver wird über iptables auf die Failover IP eingeschränkt:

node[1|2] # vi /etc/iptables.rules

-A INPUT -i eth0 -p tcp -m tcp --destination 10.4.12.161 --dport 80 -j ACCEPT

node[1|2] # iptables-restore < /etc/iptables.rules

Konfiguration

Im nächsten Schritt konfiguriert man den Nginx Webserver als Load Balancer auf die gewünschten Applicationserver:

node[1|2] # vi /etc/nginx/nginx.conf

user www-data;
worker_processes 10;
pid /var/run/nginx.pid;
events {
    worker_connections 10;
}
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";
    upstream appserver {
        server 10.4.12.112;
        server 10.4.12.113;
        server 10.4.12.114;    
        server 10.4.12.115;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://appserver;
        }
    }
}

node[1|2] # /etc/init.d/nginx start
node[1|2] # update-rc.d nginx defaults

Damit werden alle Anfragen gleichmäßig auf die 4 Application Server verteilt.

Betrieb

Failover IP

Möchte man nun die Failover IP auf den Node 2 schwenken, hilft folgender Befehl:

root@node2:~# crm resource list
 failover-ip    (ocf::heartbeat:IPaddr) Started 
root@node2:~# crm resource migrate failover-ip node2

Load Balancer

In diesem Aufbau muss beachtet werden, dass vor der Wartung eines Application Server dieser aus dem Load Balancing entfernt werden muss:

node[1|2]# vi /etc/nginx/nginx.conf

- server 10.4.12.112;
+ server 10.4.12.112 down;

node[1|2] # /etc/init.d/nginx reload

Dieser Vorgang kann auch automatisiert werden. Dann muss aber ein Monitoring deaktivierte Application Server melden, damit am Ende nicht plötzlich alle deaktiviert sind.

Links