Sélectionner une page

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:

global_defs {
  notification_email {
    benjamin@octopuce.fr
  }
  notification_email_from benjamin@octopuce.fr
    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:

global_defs {
  notification_email {
    benjamin@octopuce.fr
  }
  notification_email_from benjamin@octopuce.fr
    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.

 

Explications protocolaires :

keepalived utilise le protocole et le module de noyau VRRP, qui émet des trames multicast précisant quel réseau il représente et quelle IP il a, avec quelle priorité.

Si un slave ne reçoit pas régulièrement un paquet VRRP, il considère le MASTER comme éteint, et lui prend son IP via ip addr add et l’annonce fort au réseau à l’aide de plusieurs paquets ARP « gratuits » (des paquets ne répondant à aucune question, mais qui signalent aux autres membres du réseau, client et routeurs en premier, que l’IP a bougé)