Routage failover
Au Crans, comme on aime la HA, depuis février 2017, on a 2 routeurs redondants, un master (gulp) et un backup (odlyd)
Tout est normalement géré par bcfg2.
Comment ça marche ?
C'est simple comme dirait jammy. Voici ce qu'on veut faire, avoir 2 routeurs en parallèle. Pour cela, on utilise une vip (pour "Virtual IP address") comme le schéma ci-dessous. (Credit)
|
Les vip
Premièrement il y a une instance keepalived qui assigne les ip du routeur.
Chaque machine dispose d'ip en dur (ex : gulp.crans.org; 138.231.136.3) et en plus l'ip "passerelle" sur chaque vlan. De plus, coté zrt (vlan avec la dsi), l'ip est également gérée par keepalived. En voici la liste :
138.231.132.47/24 brd 138.231.132.255 dev ens scope global # vlan zrt, ip sortie 138.231.136.254/21 brd 138.231.143.255 dev crans scope global # vlan adh 10.231.136.254/24 brd 10.231.136.255 dev crans.2 scope global # vlan adm 138.231.148.254/21 brd 10.231.148.255 dev crans.3 scope global # vlan wifi 10.2.9.254/24 brd 10.2.9.255 dev crans.21 scope global # vlan appart 10.53.0.254/16 brd 10.53.254.255 dev crans.22 scope global # vlan federez
Les ip de sortie de la zone crans sont donc en .254 à présent, et gérées par keepalived.
En gros, coté interne, il y a 5 vip, et coté externe (zrt), une seule.
Quagga
Quand un routeur est activé, il faut donc lui assigner les ip. Mais pour communiquer nos routes avec la dsi; les routeurs doivent se parler (voir ospf). Le programme utilisé pour cela est quagga. Quand un routeur devient actif, il faut le démarrer, et l’éteindre quand il ne l'est plus, sous peine de déclencher un shitstorm de routes sur zrt.
Voici la ligne dans la conf keepalived (/etc/keepalived/keepalived.conf) qui commande cela :
notify_master "/usr/sbin/service quagga start" notify_backup "/usr/sbin/service quagga stop" notify_fault "/usr/sbin/service quagga stop"
Activation/désactivation des routeurs
Sur gulp
En temps normal, seul gulp est actif et route. On peut vouloir activer le routage sur odlyd, soit en cas de défaillance, soit manuellement. Pour cela, keepalived fait appel à un programme externe qu'on a écrit. Il est à noter que cette conf n'est présente que sur gulp, qui commande l'activation/désactivation. Si jamais gulp ne répond plus, odlyd prendra automatiquement la main.
track_script { check_routeur } vrrp_script check_routeur { script "/etc/keepalived/checkstatus.sh" interval 5 # check every 5 seconds fall 2 # require 2 failures for KO rise 2 # require 2 successes for OK }
Ce script (très simple et à compléter éventuellement) fait 2 choses, il vérifie la présence d'un fichier vide MASTER dans /etc/keepalived, et le bon fonctionnement de quagga. Si ce n'est pas le cas, il renvoie un code de sortie non nul, et le failover s'active.
Si on veut manuellement désactiver le routage sur gulp, il suffit de supprimer le fichier MASTER.
Le fichier checkstatus est également utilisé par monit, et en fault il signale que le routage est désactivé sur gulp.
Sur odlyd
Lorsque odlyd s'active, il crée le fichier /etc/keepalived/BACKUP_ACTIVE. Un second script utilisé cette fois uniquement par monit, vérifie la non présence de ce script. Si il est présent, le routage failover est donc activé, et le signale à travers monit.
Comportement observé, bugs connus
Lors de l'activation/désactivation, le lag dure 5 secondes. Si il dure plus ; s'inquiéter.
Éviter de redémarrer inutilement keepalived sur odlyd, cela engendre un lag de 5sec également, ce qui est pénible. (enfin surtout pour les gamers)