Comment installer une IP failover entre 2 machines
Le principe de l’IP failover est le suivant :
- 2 machines (physiquement distinctes, même si ce sont des VM LXC ou KVM) ont chacune une IP (publique ou privée selon si le service est public ou privé) différente sur une interface commune (même “zone de broadcast” ethernet)
- Sur chaque machine on installe keepalived, chargé du failover IP (décrit ci-dessous) et de la programmation du load-balancer IPVS (fonction non utilisée ici)
- On configure keepalived dans /etc/keepalived/keepalived.conf en définissant le même numéro de réseau virtuel, unique sur notre réseau (entre 0 et 255)
- La machine MASTER possède l’IP, et en cas de panne, elle bascule sur la machine SLAVE, qui prend l’IP et fournit le même service.
- en cas de retour de la machine MASTER, le retour se fait le plus souvent en manuel, car le rallumage d’une machine ne signifie pas toujours qu’elle est capable de servir correctement.
configuration de keepalived
Ceci est un exemple de configuration, où les nodes N1 et N2 ont respectivement l’IP 10.1.1.253/16 et 10.1.1.254/16. L’IP virtuelle qui passe d’une machine à l’autre est 10.1.1.255/16.
sur le node N1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
global_defs {
notification_email {
xxx@xxx.net
}
notification_email_from xxx@xxx.net
smtp_server 10.1.1.1
smtp_connect_timeout 30
}
vrrp_instance VI_TEST_1 {
# We don’t own the IP address, which allows manual triggering of IP change when machine comes UP
# see man keepalived.conf.
state BACKUP
priority 150
nopreempt
interface eth1
virtual_router_id 255
advert_int 5
smtp_alert
virtual_ipaddress {
10.1.1.255/16 brd 10.1.255.255 dev eth1 scope global
}
}
|
sur le node N2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
global_defs {
notification_email {
xxx@xxx.net
}
notification_email_from xxx@xxx.net
smtp_server 10.1.1.1
smtp_connect_timeout 30
}
vrrp_instance VI_TEST_1 {
# We don’t own the IP address, which allows manual triggering of IP change when machine comes UP
# see man keepalived.conf.
state BACKUP
priority 100
nopreempt
interface eth1
virtual_router_id 255
advert_int 5
smtp_alert
virtual_ipaddress {
10.1.1.255/16 brd 10.1.255.255 dev eth1 scope global
}
}
|
Bien entendu, les clients de ce serveur doivent utiliser l’IP dite “failover” ou “de service”, à savoir dans notre exemple 10.1.1.255.
L’option nopreempt a pour conséquence qu’un master qui renaît ne reprendra pas l’IP si son SLAVE l’a.
Test
sur une machine externe, située dans le même lan (par exemple UBAL ou VPN) on pingue l’IP de service :
root@ubal# ping 10.1.1.255
et on vérifie son adresse mac et celle de ses 2 machines en failover. Grâce à cela on verra la transmission d’une machine à l’autre
root@ubal# watch -n 1 ‘arp -an |egrep “10.1.1.25(3|4|5)” ‘
On peut aussi vérifier la présente de l’IP failover sur les 2 nodes via watch -n 1 ip addr list eth1
On peut tester les situations suivantes :
- une fois les 2 keepalived démarrés, le MASTER a l’IP.
- Si on éteint le MASTER, le SLAVE prend la main.
- Si on relance ensuite le MASTER, il ne la reprend pas.
- Si on éteint le SLAVE quand il a la main, le MASTER la reprend.
Note: keepalived pour Squeeze ne marche pas bien, il n’envoie pas de paquet “gratuitous ARP” lorsque l’IP bascule. À cause de cela, les routeurs ne voient pas le changement d’IP immédiatement. La version de Wheezy inclut un émetteur de paquet ARP lors de la bascule, résolvant ce bug.