P18 - Haute disponibilité : stockage, bases de données, réseau

Objectif

Supprimer les SPOF (Single Point Of Failure, point unique de défaillance) d’une infrastructure : stockage partagé (NAS / SAN), adresse IP flottante (keepalived), base de données en cluster (Galera), réplication de disque (DRBD), agrégation de cartes réseau (bonding).

Source

Fiche rédigée à partir de cours de lidstah (cours « Maintenance opérationnelle et haute disponibilité »). Le RAID est déjà dans ST01 - RAID, keepalived/VRRP dans R07 - Redondance des passerelles (HSRP, CARP, Keepalived), HAProxy dans SV03 - HAProxy (reverse proxy et répartition de charge).


1. La démarche

flowchart TB
  U["Utilisateurs"] --> VIP["IP flottante 192.168.1.70<br/>(keepalived / VRRP)"]
  VIP --> LB1["HAProxy 1 (MASTER)"]
  VIP -.->|"si LB1 tombe"| LB2["HAProxy 2 (BACKUP)"]
  LB1 & LB2 --> W1["Web 1"] & W2["Web 2"]
  W1 & W2 --> DB1["MariaDB 1"] <-->|"Galera"| DB2["MariaDB 2"]
  W1 & W2 --> NAS["Stockage partagé<br/>NFS / iSCSI"]

À chaque étage on se demande : « si cette machine tombe, est-ce que le service tombe ? ». Si oui, on la double.

2. Stockage partagé : NAS ou SAN ?

NASSAN
Ce qu’on voitUn partage de fichiers (dossier réseau)Un disque brut (bloc), qu’on formate soi-même
ProtocolesNFS (Linux, port 2049), SMB/CIFS (Windows, Samba)iSCSI (sur IP), Fibre Channel (réseau dédié)
UsagePartages, sauvegardes, disques de VMBases de données, datastores d’hyperviseurs
ExemplesSynology, TrueNAS, NetAppBaies Dell EMC, NetApp, HPE
  • NFSv3 : sans état, sécurité faible, données en clair → réseau de confiance uniquement. NFSv4 : avec état, reprise après incident, Kerberos possible.
  • iSCSI : l’initiator (le serveur qui utilise le disque, identifié par un IQN) se connecte à une target (la baie qui fournit le disque). Idéalement sur un réseau ou VLAN dédié.
  • Fibre Channel : très rapide (jusqu’à 128 Gbit/s), cartes et switchs spécifiques, chers.
# client NFS (Debian)
sudo apt install nfs-common
sudo mount -t nfs 192.168.1.10:/export/donnees /mnt/donnees
# dans /etc/fstab (0 en dernière colonne : jamais de fsck sur du réseau)
192.168.1.10:/export/donnees  /mnt/donnees  nfs  defaults,_netdev  0  0

3. IP flottante avec keepalived (VRRP)

Deux répartiteurs HAProxy partagent une IP virtuelle. Le MASTER la porte ; s’il tombe (ou si HAProxy s’arrête), le BACKUP la reprend en quelques secondes.

sudo apt install keepalived haproxy
# autoriser HAProxy à écouter sur une IP que la machine n'a pas (encore)
echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee /etc/sysctl.d/90-keepalived.conf && sudo sysctl --system

/etc/keepalived/keepalived.conf sur le MASTER :

vrrp_script check_haproxy {
    script "/usr/bin/systemctl is-active --quiet haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_01 {
    state MASTER            # BACKUP sur la seconde machine
    interface ens18
    virtual_router_id 51    # identique sur les deux
    priority 101            # plus bas sur le BACKUP (ex. 100)
    virtual_ipaddress {
        192.168.1.70
    }
    track_script {
        check_haproxy
    }
}

Test : sudo systemctl stop haproxy sur le MASTER, puis ip a sur le BACKUP : l’IP 192.168.1.70 doit y apparaître.

4. Bases de données

NotionExplication
ACIDAtomicité, Cohérence, Isolation, Durabilité : une transaction est fiable (Jim Gray)
Maître / réplica (actif/passif)Un serveur écrit, les réplicas copient et servent la lecture
En cascadeUn réplica sert lui-même de maître à d’autres (PostgreSQL)
Multi-maître (actif/actif)Tous les nœuds acceptent les écritures : Galera (MariaDB), CockroachDB

Cluster MariaDB Galera (2 nœuds en labo, 3 en production pour le quorum)

/etc/mysql/conf.d/galera.cnf (sur chaque nœud, avec son IP et son nom) :

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="moncluster"
wsrep_cluster_address="gcomm://192.168.1.43,192.168.1.27"
wsrep_sst_method=rsync
wsrep_node_address="192.168.1.43"
wsrep_node_name="sql1"
sudo galera_new_cluster            # sur le PREMIER nœud uniquement (démarre le cluster)
sudo systemctl start mariadb       # sur les autres nœuds
sudo mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"   # doit afficher 2 (ou 3)

Le cluster est « cassé » (tous les nœuds arrêtés)

Sur le nœud le plus à jour : sudo galera_recovery donne UUID:seqno. Dans /var/lib/mysql/grastate.dat, mettre ce uuid, ce seqno et safe_to_bootstrap: 1, puis galera_new_cluster sur ce nœud et démarrer les autres normalement.

Devant le cluster : deux HAProxy en mode TCP + keepalived → répartition de charge et bascule.

5. Réseau : bonding

Plusieurs cartes réseau vues comme une seule (une seule MAC, une seule IP).

# /etc/network/interfaces  (paquet ifenslave)
auto bond0
iface bond0 inet static
    address 192.168.1.20/24
    gateway 192.168.1.254
    bond-slaves eno1 ens1f0
    bond-mode active-backup
    bond-miimon 100

bond-mode active-backup = mode 1 ; bond-miimon 100 = vérifier l’état des liens toutes les 100 ms. (Dans ce fichier, un commentaire # doit être seul sur sa ligne.)

ModeNomFonctionnement
1active-backupUn seul lien actif, l’autre prend le relais (marche avec n’importe quel switch)
2balance-xorRépartition selon les adresses MAC
4802.3ad (LACP)Tous les liens actifs, le switch doit être configuré (EtherChannel chez Cisco)
5balance-tlbRépartition adaptative selon la charge

6. Réplication de disque : DRBD

DRBD recopie un disque bloc d’un serveur sur un autre, en temps réel et de façon transparente (RAID 1 à travers le réseau).

ModeAcquittement de l’écritureRisque
SynchroneQuand les deux disques ont écritAucune perte, mais plus lent (latence réseau)
AsynchroneDès l’écriture localePeut perdre les dernières écritures en cas de panne

Outils : drbdadm, drbdsetup, drbdmeta.

7. Hyperviseurs et conteneurs

  • Les clusters (Proxmox, VMware, XCP-ng) migrent à chaud et relancent automatiquement une VM si son hôte tombe → V06 - Proxmox VE.
  • ⚠ Piège du split-brain : l’hôte en panne revient et relance aussi la VM → deux copies écrivent sur le même disque. Parade : fencing (couper électriquement le nœud douteux) et quorum (au moins 3 nœuds).
  • Kubernetes (ou K3s) relance seul les conteneurs en panne ; il faut 3 control-planes minimum pour le quorum → P19 - Kubernetes.

Exercices

  1. Ton site a 2 serveurs web derrière un seul HAProxy. Où est le SPOF, et comment le supprimer ?
  2. NAS ou SAN pour stocker les disques de VM d’un cluster Proxmox ?
  3. Pourquoi Galera conseille-t-il 3 nœuds plutôt que 2 ?

Erreurs fréquentes / dépannage

SymptômeCause probable
Les deux keepalived ont l’IPIls ne se voient pas (pare-feu bloque VRRP, protocole 112, ou virtual_router_id différent)
HAProxy refuse de démarrer sur le BACKUPip_nonlocal_bind pas activé
Galera : le 2e nœud ne rejoint pasPorts 4567, 4568, 4444 fermés, ou galera_new_cluster lancé sur les deux
Bond LACP qui ne monte pasLe switch n’est pas configuré en LACP

Voir aussi