KeepAlived est un framework pour LVS (Linux Virtual Server) qui permet de faire du Failover et du LoadBalancing entre plusieurs machines.


Nous allons utiliser KeepAlived en mode DR (Direct Routing), il existes deux autres façon d’utiliser KeepAlived NAT et TUN (Tunneling) mais elles ne seront pas évoqués ici.
Pour les testes j’utilise deux machine virtuel (VirtualBox) sous linux avec une Debian Lenny x64 avec trois serveur apache sur des interfaces virtuel d’un serveur sur un VLAN de mon réseau.
Je ne détaillerai pas ici la mise en place des machines virtuel et du VLAN.

Installation de KeepAlived

#aptitude install ipvsadm keepalived

Configuration du lvs MASTER

global_defs {
    notification_email {
        notify@domain.tld
    }
    notification_email_from lvs@domain.tld
    smtp_server xxx.xxx.xxx.xxx #IP du serveur smtp
    smpt_connect_timeout 30
    router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 100
    priority 100
    advert_int 1
    lvs_sync_daemon_interface eth1
    authentication {
        auth_type PASS
        auth_pass mot_de_passe
    }
    virtual_ipaddress {
        xxx.xxx.xxx.30/32 brd xxx.xxx.xxx.255 scope global
    }
}

virtual_server xxx.xxx.xxx.30 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server xxx.xxx.xxx.31 80 {
        weight 100

        HTTP_GET {
            url {
                path /check-lvs
                digest 3544ffe7337ce70356d9de6aeb868973
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server xxx.xxx.xxx.32 80 {
        weight 100

        HTTP_GET {
            url {
                path /check-lvs
                digest 3544ffe7337ce70356d9de6aeb868973
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server xxx.xxx.xxx.33 80 {
        weight 100

        HTTP_GET {
            url {
                path /check-lvs
                digest 3544ffe7337ce70356d9de6aeb868973
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Configuration du lvs BACKUP

Pour la configuration du serveur BACKUP c’est la même chose que ci-dessus, il faut juste remplacer MASTER par BACKUP et changer la priorité.

vrrp_instance VI_1 {
    state BAKUP #MASTER vers BACKUP
    interface eth1
    virtual_router_id 100
    priority 50 # < 100
    advert_int 1
    lvs_sync_daemon_interface eth1
    authentication {
        auth_type PASS
        auth_pass mot_de_passe
    }
    virtual_ipaddress {
        xxx.xxx.xxx.30/32 brd xxx.xxx.xxx.255 scope global
    }
}

Configuration des serveurs réels

Donc déjà il va falloir déactiver certaine fonction réseau pour éviter des conflits d’IP vue que plusieurs serveurs auront la même IP (VIP).
Il faut aussi configurer l’interface loopback de chaque serveur réel pour qu’il réponde à la VIP.

Pour chaque serveur réel:
Modification du fichier « /etc/sysctl.conf »:

# vi /etc/sysctl.conf

et y ajouter:

net.ipv4.conf.lo.forwarding=0
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Puis recharger les paramètres:

# sysctl -p

Maintenant il faut monter l’adresse de la VIP sur chaque serveur réels:

ifconfig lo:30 xxx.xxx.xxx.30 -arp netmask 255.255.255.255 up

Si tous fonctionne correctement vous ne devriez pas pourvoir faire un ping sur la VIP.

Configuration des serveurs apaches

Il faut donc que chaque serveur apache écoutes sur la VIP.
Dans le fichier « /etc/apache2/ports.conf » rajouter :
Normalement Apache 2 est configurer pour écouter sur toutes les interfaces « Listen * », donc il ne devrai pas y avoir besoin de faire cette modification.

Listen xxx.xxx.xxx.30

Ensuite il faut créer un fichier accessible via http://xxx.xxx.xxx.31/check-lvs, http://xxx.xxx.xxx.32/check-lvs, http://xxx.xxx.xxx.32/check-lvs qui va permettre à KeepAlived de voir si le service est toujours actif et dans le cas échéant, il le retirera de ca liste pour ne plus rediriger de trafic dessus.

Par exemple dans le fichier check-lvs vous pouvez aussi mettre un script qui vérifie certain paramètre du serveur et renvoie un contenu différent en cas d’erreur.
Pour l’exemple nous allons juste mettre du texte:

// Sur tous les serveurs réels:
# echo "LVS CHECK" > /var/www/check-lvs

Ensuite il faut générer le hash md5 pour que keepalived puisse faire une comparaison.

# genhash -s xxx.xxx.xxx.31 -p 80 -u /check-lvs

Puis vérifier dans « /etc/keepalived/keepalived.conf » que les paramètres sont bon:

        HTTP_GET {
            url {
                path /check-lvs #l'url du fichier
                digest 3544ffe7337ce70356d9de6aeb868973 #le md5 généré avec genhash
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }

Vérification de la configuration

Maintenant il faut lancer KeepAlived.
On commence donc par le MASTER :

lvs-master# /etc/init.d/keepalived start

Puis on vérifie que le serveur c’est bien attribué la VIP (xxx.xxx.xxx.30)

lvs-master# ip addr ls
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:33:1c:0b brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.10/24 brd xxx.xxx.xxx.255 scope global eth1
    inet xxx.xxx.xxx.30/32 brd xxx.xxx.xxx.255 scope global eth1  # ICI le serveur c'est bien attribué l'IP Virtuel (VIP)
    inet6 fe80::a00:27ff:fe33:1c0b/64 scope link
       valid_lft forever preferred_lft forever

Ensuite même chose pour le serveur BACKUP:

lvs-backup# /etc/init.d/keepalived start

Puis on vérifie que le serveur ne c’est pas attribué la VIP.

lvs-backup# ip addr ls
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:33:1c:0b brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.11/24 brd xxx.xxx.xxx.255 scope global eth1
    inet6 fe80::a00:27ff:fe33:1c0b/64 scope link
       valid_lft forever preferred_lft forever

Puis on peut vérifier avec la commande « ipvsadm » que tous fonctionne bien:

lvs-master# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  xxx.xxx.xxx.30:www wlc persistent 50
  -> xxx.xxx.xxx.31:www           Route   100    0          0   
  -> xxx.xxx.xxx.32:www           Route   100    0          0 
  -> xxx.xxx.xxx.33:www           Route   100    0          0

Vérifier que le failover fonctionne

Pour les serveurs apaches il suffit d’en arrêter un par exemple celui avec l’ip  » xxx.xxx.xxx.32 « .
Puis lancer la commande « ipvsadm ». Si tous fonctionne correctement, il ne devrai plus êtres dans la liste:

lvs-master# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  xxx.xxx.xxx.30:www wlc persistent 50
  -> xxx.xxx.xxx.31:www           Route   100    0          0   
  -> xxx.xxx.xxx.33:www           Route   100    0          0

Pour tester le bon fonctionnement du failover de keepalived, il suffit d’arrêter le master:

lvs-master# /etc/init.d/keepalived stop

Ensuite il faut regarder si le serveur BACKUP a bien pris le relais.
Donc sur le serveur BACKUP:

lvs-backup# ip addr ls
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:33:1c:0b brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.10/24 brd xxx.xxx.xxx.255 scope global eth1
    inet xxx.xxx.xxx.30/32 brd xxx.xxx.xxx.255 scope global eth1  # ICI le serveur backup c'est bien attribué l'IP Virtuel (VIP)
    inet6 fe80::a00:27ff:fe33:1c0b/64 scope link
       valid_lft forever preferred_lft forever

Voila la fin d’un petit tutoriel rapide sur la mise en place d’un LoadBalancing, failover avec KeepAlived.

There are no comments.

Leave a Reply