RAID mdadm avancé : setup, monitoring et remplacement à chaud

Publié le 16 janvier 2026

Hardware
Linux
Stockage

Le RAID logiciel Linux (mdadm) offre redondance et performance sans contrôleur matériel coûteux. Guide complet de déploiement production : configuration, monitoring, alertes et procédures de remplacement disque.

Plan

  • Choisir le bon niveau RAID
  • Installation et création RAID
  • Optimisation performance
  • Monitoring et alertes automatiques
  • Procédure remplacement disque à chaud
  • Recovery et reconstruction
  • Benchmarks et bonnes pratiques
  • Conclusion

Choisir le bon niveau RAID

Comparaison niveaux RAID

NiveauDisques minEspace utileTolérance pannePerformance lecturePerformance écritureCas d'usage
RAID 02100%0 disqueExcellente (x2)Excellente (x2)Performance pure (cache, scratch)
RAID 1250%1 disqueBonne (x2)StandardSystème, boot, haute disponibilité
RAID 53(n-1)/n1 disqueTrès bonneMoyenne (parité)Données, balance coût/perf
RAID 64(n-2)/n2 disquesTrès bonneFaible (double parité)Gros volumes, sécurité max
RAID 10450%1 disque/miroirExcellente (xN/2)Très bonneBases de données, I/O intensif

Recommandations par cas d'usage

Système / Boot :

RAID 1 sur 2 SSD
- Simplicité
- Boot possible même si 1 disque mort
- Performance lecture doublée

Bases de données (MySQL/PostgreSQL) :

RAID 10 sur 4+ disques
- Performance I/O maximale
- Tolérance panne
- Pas de pénalité écriture (vs RAID 5/6)

Stockage fichiers (NAS) :

RAID 6 sur 6-12 disques
- Bon compromis espace/sécurité
- Tolère 2 pannes simultanées
- Idéal gros volumes (>10 TB)

Cache / Scratch :

RAID 0 sur SSD NVMe
- Performance pure
- Données non critiques
- Accélération builds/compilation

Installation et création RAID

Prérequis

# Installer mdadm
apt install mdadm  # Debian/Ubuntu
dnf install mdadm  # RHEL/Rocky

# Identifier les disques
lsblk
fdisk -l

# Vérifier SMART status
apt install smartmontools
smartctl -a /dev/sda
smartctl -a /dev/sdb

Créer un RAID 1 (2 disques)

# Partitionner les disques (même taille)
# /dev/sda et /dev/sdb

# Créer partitions GPT
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary 0% 100%
parted /dev/sda set 1 raid on

parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
parted /dev/sdb set 1 raid on

# Créer RAID 1
mdadm --create /dev/md0 \
  --level=1 \
  --raid-devices=2 \
  /dev/sda1 /dev/sdb1

# Vérifier
cat /proc/mdstat
# md0 : active raid1 sdb1[1] sda1[0]
#       1000000000 blocks super 1.2 [2/2] [UU]

# Attendre fin de synchronisation initiale
watch cat /proc/mdstat

Créer un RAID 5 (3+ disques)

# 4 disques : /dev/sd{a,b,c,d}

# Partitionner tous les disques
for disk in a b c d; do
    parted /dev/sd${disk} mklabel gpt
    parted /dev/sd${disk} mkpart primary 0% 100%
    parted /dev/sd${disk} set 1 raid on
done

# Créer RAID 5
mdadm --create /dev/md0 \
  --level=5 \
  --raid-devices=4 \
  --chunk=256 \
  /dev/sd{a,b,c,d}1

# Vérifier
mdadm --detail /dev/md0

Créer un RAID 10 (4+ disques)

# 4 disques minimum (2 miroirs de 2)

mdadm --create /dev/md0 \
  --level=10 \
  --raid-devices=4 \
  --layout=n2 \
  /dev/sd{a,b,c,d}1

# Layout options :
# n2 = near 2 (défaut, meilleure performance)
# f2 = far 2 (meilleure lecture, pire écriture)
# o2 = offset 2

Formater et monter

# Créer filesystem (ext4 ou xfs)
mkfs.ext4 -L data /dev/md0

# Ou XFS (recommandé >16TB)
mkfs.xfs -L data /dev/md0

# Monter
mkdir -p /mnt/raid
mount /dev/md0 /mnt/raid

# Vérifier
df -h /mnt/raid

Configuration persistante

# Sauvegarder config RAID
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# Ou RHEL/Rocky
mdadm --detail --scan >> /etc/mdadm.conf

# Mettre à jour initramfs
update-initramfs -u  # Debian/Ubuntu
dracut -f            # RHEL/Rocky

# Ajouter au fstab
UUID=$(blkid /dev/md0 -s UUID -o value)
echo "UUID=$UUID /mnt/raid ext4 defaults,noatime 0 2" >> /etc/fstab

# Tester fstab
mount -a

Optimisation performance

Chunk size optimal

# Chunk size = taille bloc données avant écriture suivante

# RAID 5/6 :
# - 64K : petits fichiers, base de données
# - 256K : usage général (défaut recommandé)
# - 512K-1M : gros fichiers, streaming

# Recréer avec chunk custom
mdadm --create /dev/md0 \
  --level=5 \
  --chunk=512 \
  --raid-devices=4 \
  /dev/sd{a,b,c,d}1

Stripe cache size

# Augmenter cache pour meilleure performance (RAID 5/6)

# Voir valeur actuelle
cat /sys/block/md0/md/stripe_cache_size
# 256 (défaut)

# Augmenter (RAM disponible)
echo 8192 > /sys/block/md0/md/stripe_cache_size

# Permanent
echo 'DEVICE /dev/sd*' > /etc/mdadm/mdadm.conf
echo 'ARRAY /dev/md0 metadata=1.2 name=hostname:0 UUID=xxx stripe_cache_size=8192' >> /etc/mdadm/mdadm.conf

Read-ahead buffer

# Augmenter read-ahead (séquentiel)

# Défaut
blockdev --getra /dev/md0
# 256

# Augmenter (meilleur pour streaming)
blockdev --setra 8192 /dev/md0

# Permanent (systemd)
cat > /etc/systemd/system/raid-readahead.service << 'EOF'
[Unit]
Description=Set RAID read-ahead
After=mdadm.service

[Service]
Type=oneshot
ExecStart=/sbin/blockdev --setra 8192 /dev/md0

[Install]
WantedBy=multi-user.target
EOF

systemctl enable --now raid-readahead

Bitmap pour resync rapide

# Activer bitmap interne (journaling)
# Accélère resync après crash

mdadm --grow /dev/md0 --bitmap=internal

# Vérifier
mdadm --detail /dev/md0 | grep Bitmap
# Intent Bitmap : Internal

Monitoring et alertes automatiques

Configuration mdadm monitoring

# /etc/mdadm/mdadm.conf (Debian/Ubuntu)
# /etc/mdadm.conf (RHEL/Rocky)

# Email alertes
MAILADDR root@localhost

# Scan automatique
DEVICE /dev/sd*

# Arrays
ARRAY /dev/md0 metadata=1.2 name=hostname:0 UUID=xxx

Service mdmonitor

# Activer monitoring daemon
systemctl enable --now mdmonitor

# Vérifier status
systemctl status mdmonitor

# Logs
journalctl -u mdmonitor -f

Script de monitoring custom

#!/bin/bash
# /usr/local/bin/mdadm-check.sh

RAID_DEVICE="/dev/md0"
EMAIL="admin@example.com"

# Vérifier status
STATUS=$(mdadm --detail $RAID_DEVICE | grep "State :" | awk '{print $3}')

if [ "$STATUS" != "clean" ] && [ "$STATUS" != "active" ]; then
    # État anormal
    DETAIL=$(mdadm --detail $RAID_DEVICE)
    
    mail -s "⚠️ RAID Alert: $RAID_DEVICE status $STATUS" $EMAIL << EOF
RAID Array $RAID_DEVICE has abnormal status: $STATUS

Full details:
$DETAIL

Action required: Check failed disks and replace if necessary.
EOF
fi

# Vérifier disques failed
FAILED=$(mdadm --detail $RAID_DEVICE | grep "failed" | wc -l)

if [ $FAILED -gt 0 ]; then
    DETAIL=$(mdadm --detail $RAID_DEVICE)
    
    mail -s "🚨 CRITICAL: RAID $RAID_DEVICE has $FAILED failed disk(s)" $EMAIL << EOF
CRITICAL: $FAILED disk(s) have failed in $RAID_DEVICE

$DETAIL

IMMEDIATE ACTION REQUIRED: Replace failed disk(s)
EOF
fi

# Vérifier SMART
for disk in $(mdadm --detail $RAID_DEVICE | grep "active sync" | awk '{print $7}' | sed 's/[0-9]*$//'); do
    SMART_ERRORS=$(smartctl -a $disk | grep "Error" | wc -l)
    
    if [ $SMART_ERRORS -gt 0 ]; then
        mail -s "⚠️ SMART errors detected on $disk" $EMAIL << EOF
SMART errors detected on $disk (member of $RAID_DEVICE)

$(smartctl -a $disk | grep -A 20 "Error")

Recommend replacement before failure.
EOF
    fi
done
# Installer
chmod +x /usr/local/bin/mdadm-check.sh

# Cron toutes les heures
echo "0 * * * * /usr/local/bin/mdadm-check.sh" | crontab -

Monitoring Prometheus

# prometheus.yml
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
# Installer node_exporter avec mdstat collector
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
./node_exporter --collector.mdadm

# Métriques disponibles
curl localhost:9100/metrics | grep mdadm
# node_mdadm_disks_active{device="md0"} 4
# node_mdadm_disks_failed{device="md0"} 0

Procédure remplacement disque à chaud

Scénario : 1 disque failed dans RAID 5

# 1. Vérifier status
mdadm --detail /dev/md0
# /dev/sdb1 - faulty

cat /proc/mdstat
# md0 : active raid5 sdd1[3] sdc1[2] sdb1[1](F) sda1[0]

# 2. Marquer disque comme failed (si pas auto)
mdadm --manage /dev/md0 --fail /dev/sdb1

# 3. Retirer du RAID
mdadm --manage /dev/md0 --remove /dev/sdb1

# 4. Éteindre serveur et remplacer disque physique
# OU si hot-swap :
echo 1 > /sys/block/sdb/device/delete

# 5. Après remplacement, rescanner
echo "- - -" > /sys/class/scsi_host/host0/scan

# 6. Partitionner nouveau disque (copier table du disque sain)
sgdisk --replicate=/dev/sdb /dev/sda
sgdisk --randomize-guids /dev/sdb

# 7. Ajouter au RAID
mdadm --manage /dev/md0 --add /dev/sdb1

# 8. Suivre reconstruction
watch cat /proc/mdstat
# [=>...................]  recovery =  12.5% (125000000/1000000000)
# finish=45.2min speed=322000K/sec

# 9. Vérifier fin reconstruction
mdadm --detail /dev/md0
# State : clean
# /dev/sdb1 - active sync

Remplacement sans downtime (RAID 1/10)

# RAID 1 avec 2 disques : peut tourner avec 1 seul

# 1. Fail + remove
mdadm /dev/md0 --fail /dev/sdb1 --remove /dev/sdb1

# 2. Remplacer disque à chaud

# 3. Ajouter nouveau
mdadm /dev/md0 --add /dev/sdb1

# Système reste disponible pendant reconstruction

Recovery et reconstruction

Forcer un check complet

# Vérifier intégrité (scrub)
echo check > /sys/block/md0/md/sync_action

# Suivre progression
cat /proc/mdstat

# Voir résultat
cat /sys/block/md0/md/mismatch_cnt
# 0 = OK, >0 = problèmes détectés

Récupération après crash

# Assembler RAID automatiquement
mdadm --assemble --scan

# Ou manuellement
mdadm --assemble /dev/md0 /dev/sd{a,b,c,d}1

# Forcer démarrage même si dégradé
mdadm --assemble --force /dev/md0 /dev/sda1 /dev/sdc1 /dev/sdd1
# (sdb manquant)

# Voir status
mdadm --detail /dev/md0

Reconstruire array dégradé

# Scénario : RAID 5 avec 2 disques morts (data loss)
# Créer nouveau RAID avec disques restants + nouveaux

# 1. Sauvegarder données survivantes (si possible)

# 2. Détruire array corrompu
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sd{a,b,c,d}1

# 3. Recréer RAID avec TOUS nouveaux disques
mdadm --create /dev/md0 \
  --level=5 \
  --raid-devices=4 \
  /dev/sd{a,b,c,d}1

# 4. Restaurer backup

Benchmarks et bonnes pratiques

Tests performance

# Installer fio
apt install fio

# Test lecture séquentielle
fio --name=seqread --rw=read --bs=1M --size=10G \
    --numjobs=1 --filename=/mnt/raid/test --direct=1

# Test écriture séquentielle
fio --name=seqwrite --rw=write --bs=1M --size=10G \
    --numjobs=1 --filename=/mnt/raid/test --direct=1

# Test lecture aléatoire (IOPS)
fio --name=randread --rw=randread --bs=4K --size=1G \
    --numjobs=4 --filename=/mnt/raid/test --direct=1

# Test écriture aléatoire
fio --name=randwrite --rw=randwrite --bs=4K --size=1G \
    --numjobs=4 --filename=/mnt/raid/test --direct=1

Résultats typiques (4x SSD SATA) :

RAIDLecture seqÉcriture seqLecture 4KÉcriture 4K
RAID 02000 MB/s2000 MB/s160k IOPS160k IOPS
RAID 11000 MB/s500 MB/s80k IOPS40k IOPS
RAID 51500 MB/s700 MB/s120k IOPS50k IOPS
RAID 102000 MB/s1000 MB/s160k IOPS80k IOPS

Bonnes pratiques

Configuration :

  • Utiliser disques identiques (même taille/modèle)
  • Activer bitmap pour resync rapide
  • Configurer chunk size adapté au workload
  • Partitions alignées (2048 sectors)

Monitoring :

  • mdmonitor activé
  • Alertes email configurées
  • Check SMART hebdomadaire
  • Scrub mensuel (echo check)

Maintenance :

  • Remplacer disques proactivement (SMART warnings)
  • Tester procédure recovery régulièrement
  • Backup régulier (RAID ≠ backup !)
  • Documenter procédures

Performance :

  • RAID 10 pour DB (I/O random)
  • RAID 5/6 pour fichiers (séquentiel)
  • stripe_cache_size >= 8192 (RAID 5/6)
  • read-ahead adapté au workload

Checklist déploiement RAID

Installation :

  • mdadm installé
  • Disques testés (SMART)
  • Partitions créées et alignées
  • RAID créé et synchronisé
  • Filesystem formaté

Configuration :

  • mdadm.conf sauvegardé
  • initramfs mis à jour
  • fstab configuré avec UUID
  • Bitmap activé
  • Performance tunée

Monitoring :

  • mdmonitor activé
  • Email alertes configuré
  • Script monitoring custom
  • Prometheus node_exporter
  • SMART monitoring actif

Procédures :

  • Procédure remplacement disque documentée
  • Test remplacement à chaud effectué
  • Backup régulier configuré
  • Recovery testé

Conclusion

Le RAID logiciel Linux avec mdadm offre une solution fiable et performante pour la redondance des données. Le monitoring proactif et des procédures de remplacement bien rodées sont essentiels pour éviter la perte de données.

Points clés :

  • RAID 1 : système/boot, simplicité
  • RAID 10 : bases de données, performance I/O
  • RAID 5/6 : stockage fichiers, bon compromis
  • Monitoring automatique obligatoire
  • Remplacer disques proactivement (SMART)

Gains typiques :

  • Disponibilité : 99.9%+ (tolérance panne)
  • Performance : +50-200% vs disque seul
  • Coût : -60% vs RAID matériel
  • Flexibilité : migration/extension facile

Actions prioritaires :

  1. Choisir niveau RAID adapté
  2. Configurer monitoring + alertes
  3. Tester procédure remplacement
  4. Documenter pour l'équipe
  5. Backup régulier (RAID ≠ backup)
Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets.

Contactez-nous

Articles similaires qui pourraient vous intéresser