(WS12-01) Cloud/Keepalived HAProxy

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche

Hochverfügbarkeit und Loadbalancing

Keepalived

Paketinstallation

apt-get install keepalived

ipvsadm - Linux Virtual Server administration

Direkt nach der Paketinstallation erfolgt die Aufforderung, das Paket ipvsadm zu konfigurieren:

dpkg-reconfigure ipvsadm

Die Fragen sollten wie folgt beantwortet werden:

1. "Do you want to automatically load IPVS rules on boot?" mit <Yes> beantworten. 2. Die Abfrage nach dem Betriebsmodus mit both beantworten. 3. Für das Interface das jeweils konfigurierte Interface des Servers wählen:

* Openstack 1: eth0
* Openstack 2: eth2

Keepalived konfigurieren

Die Konfigurationsdatei /etc/keepalived/keepalived.conf muss openstack1 und openstack2 mit folgendem Inhalt angelegt werden.

Openstack1

global_defs {
        router_id node-1
}

vrrp_instance VI_1 {
        virtual_router_id 42
        priority 101
        state BOTH
        interface eth0
        virtual_ipaddress {
                10.18.48.145
        }
}

Openstack2

global_defs {
        router_id node-1
}

vrrp_instance VI_1 {
        virtual_router_id 42
        priority 100
        state BOTH
        interface eth2
        virtual_ipaddress {
                10.18.48.145
        }
}

Erläuterung der Konfiguration

Die Konfiguration ist auf beiden Servern fast identisch. Openstack1 hat eine höhere Priorität, da dort standardmäßig die PostgreSQL-Datenbank im Master-Mode läuft. Openstack2 bekommt die virtuelle IP-Adresse nur, falls openstack1 ausfällt.

Falls die Datenbank auf openstack2 vom Slave- in den Master-Betrieb umgeschaltet wird (z.B. nach einem Ausfall von openstack1), so muss die Priorität in Keepalive erhöht werden, damit openstack1 nach einem Neustart nicht automatisch die IP-Adresse zurückholt, und somit eventuell zwei Datenbank Master-Server parallel laufen.

Die Einstellung virtual_router_id muss für alle beteiligten Servern identisch und im angeschlossenen Netzwerk eindeutig sein.

Überprüfen, welcher Server die virtuelle IP-Adresse beansprucht

Mittels folgendem Befehl kann auf jedem Server überprüft werden, ob die virtuelle IP-Adresse gerade aktiv ist:

openstack1$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:e0:81:2b:c5:68 brd ff:ff:ff:ff:ff:ff
    inet 10.18.48.143/24 brd 10.18.48.255 scope global eth0
    inet 10.18.48.145/32 scope global eth0
    inet6 fe80::2e0:81ff:fe2b:c568/64 scope link
       valid_lft forever preferred_lft forever

Wie man in der Ausgabe sieht, hat openstack1 die in der Konfiguration angegebene IP-Adresse.

openstack2$ ip addr show dev eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:14:5e:5a:62:8b brd ff:ff:ff:ff:ff:ff
    inet 10.18.48.144/24 brd 10.18.48.255 scope global eth2
    inet6 fe80::214:5eff:fe5a:628b/64 scope link
       valid_lft forever preferred_lft forever

Zur Überprüfung sieht man auf openstack2, dass die IP-Adresse hier nicht aktiv ist.

Manuelles übertragen der virtuellen IP auf einen anderen Server

Möchte man die IP-Adresse von einem Server auf einen anderen übertragen, so muss man dem gewünschten Ziel-Server eine höhere Priorität zuweisen, als dem bisherigen Inhaber der IP-Adresse. Anschließend muss die Konfiguration von Keepalive neu geladen werden.

Beispiel Openstack2

Bearbeiten von /etc/keepalive/keepalived.conf auf openstack2:

global_defs {
        router_id node-1
}

vrrp_instance VI_1 {
        virtual_router_id 42
        priority 102
        state BOTH
        interface eth2
        virtual_ipaddress {
                10.18.48.145
        }
}

Die Priorität ist mit 102 höher als die von openstack1. Die Konfiguration wird mittels folgendem Befehl neu geladen:

service keepalived reload

Nach einem kurzen Moment sollte die IP-Adresse auf openstack2 sichtbar sein:

$ ip a s eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:14:5e:5a:62:8b brd ff:ff:ff:ff:ff:ff
    inet 10.18.48.144/24 brd 10.18.48.255 scope global eth2
    inet 10.18.48.145/32 scope global eth2
    inet6 fe80::214:5eff:fe5a:628b/64 scope link

HAProxy

Paketinstallation

Via Paketmanager in Ubuntu:

apt-get install haproxy

Konfiguration

Konfiguriert wird HAProxy über die Datei /etc/haproxy/haproxy.conf. Diese ist auf allen Servern gleich:

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        user haproxy
        group haproxy
        daemon
        #debug
        #quiet

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

listen  keystone-1 10.18.48.145:35357
        balance roundrobin
        option tcplog
        server controller-1 10.18.48.143:35357 check
        server controller-2 10.18.48.144:35357 check

listen  keystone-2 10.18.48.145:5000
        balance roundrobin
        option tcplog
        server controller-1 10.18.48.143:5000 check
        server controller-2 10.18.48.144:5000 check

listen  glance-1 10.18.48.145:9292
        balance roundrobin
        option tcplog
        server controller-1 10.18.48.143:9292 check
        server controller-2 10.18.48.144:9292 check

listen  glance-2 10.18.48.145:9191
        balance roundrobin
        option tcplog
        server controller-1 10.18.48.143:9191 check
        server controller-2 10.18.48.144:9191 check

listen  nova-1 10.18.48.145:8774
        balance roundrobin
        option tcplog
        server compute-1 10.18.48.142:8774 check

listen  nova-2 10.18.48.145:8776
        balance roundrobin
        option tcplog
        server compute-1 10.18.48.142:8776 check

listen  swift-1 10.18.48.145:8888
        balance roundrobin
        option tcplog
        server compute-1 10.18.48.142:8888 check

Nachdem die Datei erstellt wurde, muss HAProxy noch aktiviert werden. Dazu muss zuerst in der Datei /etc/default/haproxy der Wert für ENABLED auf 1 gesetzt werden:

# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
# Add extra flags here.
#EXTRAOPTS="-de -m 16" 

Bevor HAProxy nun gestartet werden kann, muss noch eine Netzwerk-Einstellung in Linux geändert werden, damit HAProxy auch dann einen Socket für die virtuelle IP-Adresse öffnen kann, wenn der Server gerade nicht im Besitz dieser IP-Adresse ist.

Dazu wird in der Datei /etc/sysctl.conf der folgende Eintrag eingefügt:

net.ipv4.ip_nonlocal_bind=1

Und danach wird die neue Einstellung aktiviert:

sysctl -p

Zuletzt kann nun HAProxy gestartet werden:

service haproxy start