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 {
[email protected]
}
notification_email_from [email protected]
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.