- Principes de fonctionnement de Keepalived
Keepalived s'appuie sur le protocole VRRP (Virtual Router Redundancy Protocol) pour assurer la redondance. VRRP est conçu pour les réseaux routés afin d'éviter les pannes causées par un point de défaillance unique au niveau de la passerelle. Plusieurs équipements offrant des fonctions identiques sont virtualisés en un seul routeur. Un appareil master effectue le transfert des données réseau, tandis que les backups restent en veille. En cas de défaillance du master, une élection par priorité VRRP désigne un nouveau master.
Keepalived se compose de trois modules : core, check et vrrp. Le module core gère le démarrage du processus principal, le chargement et l'analyse des fichiers de configuration globaux. Le module check effectue des vérifications de santé périodiques. Le module vrrp implémente le protocole VRRP pour garantir la haute disponibilité entre les nœuds master et backup. De plus, Keepalived intègre IPVS pour contrôler l'état des serveurs backend, assurant ainsi leur disponibilité continue.
- Compilation et installation de HAProxy
2.1 Compilation de Lua 5.4
# Installation des dépendances
[root@serveur-principal ~]# yum install gcc readline-devel -y
# Téléchargement et extraction de Lua
[root@serveur-principal ~]# wget http://www.lua.org/ftp/lua-5.4.4.tar.gz
[root@serveur-principal ~]# tar -xzf lua-5.4.4.tar.gz -C /usr/local/src/
# Compilation
[root@serveur-principal ~]# cd /usr/local/src/lua-5.4.4/
[root@serveur-principal lua-5.4.4]# make linux
[root@serveur-principal lua-5.4.4]# src/lua -v
Lua 5.4.4 Copyright (C) 1994-2021 Lua.org, PUC-Rio
2.2 Compilation de HAProxy 2.4
# Installation des paquets requis
[root@serveur-principal ~]# yum install gcc openssl-devel pcre-devel systemd-devel -y
# Extraction du code source
[root@serveur-principal ~]# ls
haproxy-2.4.0.tar.gz
[root@serveur-principal ~]# tar -xzf haproxy-2.4.0.tar.gz -C /usr/local/src
# Compilation avec les modules nécessaires
[root@serveur-principal ~]# cd /usr/local/src/haproxy-2.4.0/
[root@serveur-principal haproxy-2.4.0]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.4/src LUA_LIB=/usr/local/src/lua-5.4.4/src
# Installation dans un répertoire personnalisé
[root@serveur-principal haproxy-2.4.0]# make install PREFIX=/opt/haproxy
# Création d'un lien symbolique
[root@serveur-principal haproxy-2.4.0]# ln -s /opt/haproxy/sbin/haproxy /usr/bin/
# Vérification de la version
[root@serveur-principal haproxy-2.4.0]# haproxy -v
HA-Proxy version 2.4.0 2021/05/14 - https://haproxy.org/
2.3 Configuration du service systemd pour HAProxy
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/bin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/bin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
2.4 Création du fichier de configuration principal
global
maxconn 50000
chroot /opt/haproxy
stats socket /var/run/haproxy.sock mode 600 level admin
user haproxy
group haproxy
daemon
pidfile /var/run/haproxy.pid
log 127.0.0.1 local2 info
defaults
option http-keep-alive
option forwardfor
maxconn 50000
mode http
timeout connect 10000ms
timeout client 50000ms
timeout server 50000ms
listen stats
mode http
bind 0.0.0.0:8080
stats enable
log global
stats uri /status
stats auth admin:securite
listen web_service
bind 10.0.0.1:80
mode http
log global
server backend1 192.168.1.10:8080 check inter 2000 fall 2 rise 5
2.5 Démarrage et activation de HAProxy
# Création du répertoire pour le socket
[root@serveur-principal ~]# mkdir -p /var/run
# Création de l'utilisateur haproxy
[root@serveur-principal ~]# useradd -r -s /sbin/nologin haproxy
# Activation et démarrage du service
[root@serveur-principal ~]# systemctl enable --now haproxy.service
# Vérification du statut
[root@serveur-principal ~]# systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled)
Active: active (running) since ...
- Algorithmes de répartition de charge dans HAProxy
3.1 static-rr
Algorithme de répartition par poids basé sur le round-robin. Il ne permet pas l'ajustement dynamique des poids via socat pendant l'exécution (seulement valeurs 0 et 1) et ne supporte pas le démarrage lent. Il n'y a pas de limite sur le nombre de serveurs backend. Similaire au wrr de LVS. Convient aux clusters web avec partage de session.
listen web_cluster
bind 10.0.0.1:80
mode http
balance static-rr
server node1 192.168.1.10:80 weight 1 check
server node2 192.168.1.20:80 weight 2 check
3.2 first
Algorithme qui dirige les requêtes vers le premier serveur de la liste jusqu'à atteindre sa capacité maximale, puis passe au suivant. Ignore les poids. Ajustement dynamique limité à 0 et 1.
listen web_service
bind 10.0.0.1:80
mode http
balance first
server srv1 192.168.1.10:80 maxconn 100 weight 1 check
server srv2 192.168.1.20:80 weight 1 check
3.3 roundrobin
Algorithme par défaut basé sur les poids avec support de l'ajustement dynamique et du démarrage lent. Chaque backend peut contenir jusqu'à 4095 serveurs réels. Très répandu pour les environnements web.
listen app_cluster
bind 10.0.0.1:80
mode http
balance roundrobin
server app1 192.168.1.10:80 weight 3 check
server app2 192.168.1.20:80 weight 5 check
3.4 leastconn
Algorithme dynamique qui favorise le serveur avec le moins de connexions actives, pondéré par les poids. Supporte l'ajustement dynamique et le démarrage lent. Idéal pour les connexions longues comme les bases de données.
listen db_proxy
bind 10.0.0.1:3306
mode tcp
balance leastconn
server db1 192.168.1.30:3306 weight 1 check
server db2 192.168.1.40:3306 weight 1 check
3.5 random
Utilise une clé de hachage basée sur un nombre aléatoire pour la répartition. Convient aux grands clusters ou aux environnements où les serveurs sont fréquemment ajoutés ou retirés. Les serveurs avec un poids élevé ont plus de chances de recevoir des requêtes.
listen cache_layer
bind 10.0.0.1:80
mode http
balance random
server cache1 192.168.1.50:80 weight 1 check
server cache2 192.168.1.60:80 weight 2 check
3.6 source
Algorithme de hachage basé sur l'adresse IP source. Les requêtes provenant de la même source sont dirigées vers le même serveur. Utile pour maintenir les sessions sans cookies. Peut utiliser la méthode modulo ou le hachage cohérent via hash-type.
listen client_sessions
bind 10.0.0.1:80
mode tcp
balance source
hash-type consistent
server backend1 192.168.1.70:80 check
server backend2 192.168.1.80:80 check
3.7 uri
Hache l'URI de la requête pour diriger vers un serveur spécifique. Adopté aux serveurs de cache. Supporte les méthodes modulo et cohérente. Limité au mode HTTP.
listen web_content
bind 10.0.0.1:80
mode http
balance uri
hash-type consistent
server static1 192.168.1.90:80 check
server static2 192.168.1.100:80 check
3.8 url_param
Hache la valeur d'un paramètre spécifique dans l'URL pour assurer la continuité des sessions utilisateur. Si le paramètre est absent, utilise round-robin. Utile pour le suivi des utilisateurs.
listen user_tracking
bind 10.0.0.1:80
mode http
balance url_param session_id
hash-type consistent
server node1 192.168.1.110:80 check
server node2 192.168.1.120:80 check
3.9 hdr
Effectue un hachage sur une valeur d'en-tête HTTP spécifique, comme User-Agent. Si l'en-tête est manquant, utilise round-robin. Permet une répartition basée sur les caractéristiques du client.
listen client_based
bind 10.0.0.1:80
mode http
balance hdr(Accept-Language)
hash-type consistent
server server1 192.168.1.130:80 check
server server2 192.168.1.140:80 check
3.10 rdp-cookie
Pour le trafic de bureau à distance Windows (RDP), utilise un cookie pour maintenir les sessions. Supporte les méthodes modulo et cohérente.
listen rdp_services
bind 10.0.0.1:3389
mode tcp
balance rdp-cookie
hash-type consistent
server rdp_host1 192.168.1.150:3389 check
server rdp_host2 192.168.1.160:3389 check
- Implémentation de la séparation dynamique/statique avec ACL
4.1 Installation de HAProxy
Référez-vous à la section 2 pour les étapes d'installation.
4.2 Configuration des fichiers ACL
# Création du répertoire de configuration
[root@serveur-principal ~]# mkdir /etc/haproxy/conf.d
# Fichier de configuration pour la séparation
[root@serveur-principal ~]# cat /etc/haproxy/conf.d/web_split.cfg
frontend http_in
bind 10.0.0.1:80
mode http
balance roundrobin
log global
option httplog
acl static_content path_end -i .png .jpg .css .js
acl dynamic_content path_end -i .php .asp
use_backend static_servers if static_content
use_backend dynamic_servers if dynamic_content
default_backend dynamic_servers
backend static_servers
mode http
server file_server1 192.168.1.200:80 check inter 2000 fall 3 rise 5
backend dynamic_servers
mode http
server app_server1 192.168.1.210:80 check inter 2000 fall 3 rise 5
# Mise à jour du service systemd
[root@serveur-principal ~]# vim /usr/lib/systemd/system/haproxy.service
[Service]
ExecStartPre=/usr/bin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -c -q
ExecStart=/usr/bin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/run/haproxy.pid
# Redémarrage du service
[root@serveur-principal ~]# systemctl daemon-reload
[root@serveur-principal ~]# systemctl restart haproxy.service
4.3 Configuration des serveurs backend
# Serveur pour contenu statique
[root@static-serveur ~]# yum install httpd -y
[root@static-serveur ~]# systemctl enable --now httpd
[root@static-serveur ~]# echo "Contenu statique" > /var/www/html/index.html
# Serveur pour contenu dynamique
[root@dynamic-serveur ~]# yum install httpd php -y
[root@dynamic-serveur ~]# systemctl enable --now httpd
[root@dynamic-serveur ~]# echo "<?php echo 'Contenu dynamique'; ?>" > /var/www/html/index.php
4.4 Validation du fonctionnement
# Test d'accès au contenu dynamique
[root@client ~]# curl http://10.0.0.1/index.php
Contenu dynamique
# Test d'accès au contenu statique
[root@client ~]# curl http://10.0.0.1/index.html
Contenu statique