TUTOS.EU

Mettre 2 serveurs Linux en cluster avec keepalived

Notez que l'article est un peu sommaire et mérite certainement d'être complété.
La doc officielle est https://www.keepalived.org/manpage.html


Sinon, vous avez par exemple 2 serveurs HAProxy et vous voulez assurer une redondance en créant une VIP, cad une Adresse IP virtuelle, pour que, quand un des 2 serveurs tombe, cela soit l'autre qui reprenne la main. Pour cela vous pouvez utiliser keepalived.

Sur vos deux serveurs, avec une distribution de type Red Hat comme CentOs etc, installer keepalived avec

dnf install keepalived
Lien vers le fichier : cliquez ici Copier le code

Créer un utilisateur pour le service

useradd -r -s /sbin/nologin keepalived_script
Lien vers le fichier : cliquez ici Copier le code

En effet au niveau du compte qui exécute les scripts de keepalived, la doc dit

# Specify the default username/groupname to run scripts under.

# If this option is not specified, the user defaults to keepalived_script

# if that user exists, otherwise the uid/gid under which keepalived is running.

# If groupname is not specified, it defaults to the user's group. script_user username [groupname]

 

J'en comprends que le compte par défaut utilisé pour exécuter les scripts est keepalived_script si on ne le précise pas

Au cas où, si vous voulez le supprimer

userdel -r keepalived_script
groupdel keepalived_script
Lien vers le fichier : cliquez ici Copier le code

Relever le nom de votre interface réseau avec

ip a
Lien vers le fichier : cliquez ici Copier le code

Dans cet exemple c'est enp0s3

Sur vos deux serveurs, sauvegarder la configuration d'origine puis la modifier avec

cd /etc/keepalived
cp keepalived.conf backup_keepalived.conf

nano keepalived.conf
Lien vers le fichier : cliquez ici Copier le code

Sur le premier serveur, remplacer intégralement la configuration avec cet exemple tout simple.

A noter que dans ce lien vmware il est demandé de préciser le nom du serveur dans un paramètre router_id

global_defs {
  router_id haproxy2 # The hostname of this host.
}

Vous prendrez soin de remplacer d'adapter le nom de l'interface qui est ici réglé à enp0s3 avec le résultat de la commande ip a.
Adaptez également l'adresse ip qui sera utilisée pour la VIP, elle est ici réglé à 192.168.0.149/24.

Notez également que si vous avez plusieurs cluster keepalived sur le même subnet, il faudrait modifier le numéro de virtual_router_id pour éviter les conflits.

Vous observerez que dans la section vrrp_script haproxy {} on donne le chemin complet de la commande à exécuter.

Pour tester qu'un process répond bien il est préférable d'utiliser pgreg au lieu d'un killall -0 car killall demande d'être root or ici on tourne avec un compte keepalived_script qui a le minimum de droits.

enable_script_security permet, comme dit dans la doc, de ne pas faire tourner le script en tant que root.

global_defs {
  router_id haproxy2 # The hostname of this host.
}
vrrp_script haproxy {
        script "/usr/bin/pgrep -x haproxy"
        interval 2
        weight 2
        enable_script_security # Active les vérifications de sécurité
}
vrrp_instance VI_1 {
        state MASTER
        interface enp0s3
        virtual_router_id 51
        priority 252
        advert_int 1
        virtual_ipaddress {
              192.168.0.149/24
        }
        track_script {
        haproxy
        }
}
Lien vers le fichier : cliquez ici Copier le code

Sur le second serveur,  remplacer également intégralement la configuration avec la même configuration sauf pour state MASTER qui devient state BACKUP

Le nom du serveur doit être adapté au niveau de router_id. La doc VMware dit qu'il ne faut pas toucher à la priorité qui sera donc la même de chaque côté, par conséquent s'il y a une bascule entre le noeud Master et le noeud Backup, même si le noeud Master revient à la normale, le noeud Backup conservera la vip tant qu'il n'a pas de défaillance.

Editer le fichier /etc/sysctl.conf pour modifier ce paramètre pour permettre d'utiliser une VIP (You should configure the kernel to use a VIP to bind )

net.ipv4.ip_nonlocal_bind=1
Lien vers le fichier : cliquez ici Copier le code

Prendre en compte les modifications sans rebooter avec

sysctl -p
Lien vers le fichier : cliquez ici Copier le code

Le service s'active avec

systemctl enable keepalived
systemctl start keepalived
Lien vers le fichier : cliquez ici Copier le code

Vous pouvez aussi avoir un état du service avec

systemctl status keepalived -l
Lien vers le fichier : cliquez ici Copier le code

Le journal des logs se voit avec

journalctl -u keepalived
Lien vers le fichier : cliquez ici Copier le code

Sur le master, si tout va bien la carte réseau doit se voir affecter une seconde adresse, celle de la VIP

Pour voir quand il y a une bascule, chercher dans les logs avec

cat /var/log/messages |  grep "Keepalived" | grep "Entering"
Lien vers le fichier : cliquez ici Copier le code

Particularités pour OOM Killer
 

OOM Killer est le processus de la dernière chance de Linux. En cas de saturation de la mémoire vive, OOM Killer se base sur un score par process pour décider lequel il va tuer. Plus le score  oom_score est bas, moins il a de chance de se faire éliminer.
Pour baisser le score de keepalived face à l'OOM Killer et réduire le risque qu'il soit terminé en cas de manque de mémoire, vous devez ajuster le paramètre oom_score_adj directement dans la configuration du service.

Exemple

[Service]
Type=notify
NotifyAccess=all
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived --dont-fork $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
OOMScoreAdjust=-500
Lien vers le fichier : cliquez ici Copier le code

Pour voir le oom_score et le oom_score_adj (oom_score_adjjustement)

for pid in /proc/[0-9]*; do
    [ -r ${pid}/oom_score ] && echo "$(cat ${pid}/oom_score) $(cat ${pid}/comm 2>/dev/null) $(basename $pid) $(cat ${pid}/oom_score_adj 2>/dev/null)"
done | sort -rn | head -20 | awk '{printf "Score: %-5s Adj: %-5s PID: %-7s Process: %s\n", $1, $4, $3, $2}'
Lien vers le fichier : cliquez ici Copier le code

Article(s) précédent(s)