Mohamed KEITA
Note #25 min read

Le Write-Ahead Log (WAL) : la pierre angulaire de la durabilité

La durabilité (durability) est l’une des promesses les plus fondamentales d’une base de données. Lorsqu’une application valide (commit) une transaction, elle s’attend à ce que les données survivent à une coupure de courant, un crash du processus ou même certaines défaillances matérielles. Obtenir cette garantie n’est pas trivial : la mémoire vive est volatile, les disques peuvent réordonner les écritures, et les systèmes d’exploitation bufferisent de manière agressive.

Pour combler l’écart entre l’imprévisibilité du matériel réel et les attentes strictes des applications, les moteurs de bases de données s’appuient sur un mécanisme fondamental : le Write-Ahead Log, ou WAL.

Le WAL est bien plus qu’un simple fichier de logs. C’est un contrat structuré entre plusieurs couches du moteur, qui impose une règle simple mais extrêmement puissante :

aucune modification n’atteint les fichiers de données principaux tant qu’elle n’a pas été enregistrée de manière sûre dans un log append-only.

Cette règle, pourtant minimaliste, façonne toute l’architecture du stockage durable.

Pourquoi le WAL existe

Si une base de données écrivait directement ses modifications dans les structures de données — B-Trees, tables LSM, heap files — un crash pendant le processus pourrait laisser la base dans un état incohérent, voire irrécupérable. Une seule page partiellement écrite (torn page) ou une mise à jour incomplète peut suffire à corrompre un dataset entier.

Le WAL résout ce problème en imposant un ordre strict :


Modifications → ajoutées au WAL → synchronisées sur disque → appliquées aux fichiers de données

En écrivant les changements de manière séquentielle, le WAL crée un historique linéaire et récupérable de l’intention. Même si un crash interrompt les étapes suivantes, la base peut toujours rejouer (replay) ou annuler (rollback) les opérations à partir d’une entrée stable dans le log.

Ce design transforme un comportement matériel erratique en un processus de récupération déterministe.

Comment le WAL garantit la durabilité

La garantie de durabilité repose sur deux propriétés clés :

Les écritures append-only sont prévisibles

Les disques gèrent beaucoup plus fiablement les écritures séquentielles que les écritures aléatoires. La base de données exploite ce point pour s’assurer que les entrées du log atteignent un stockage stable avant de confirmer un commit.

Le WAL devient la source de vérité pendant la récupération

Après un crash, les fichiers de données peuvent être incohérents. Le WAL, lui, ne l’est pas.

Vue simplifiée d’une récupération :


[Démarrage]
│
├─ Lire le WAL depuis le dernier checkpoint
│
├─ REDO toutes les opérations validées (committed)
│
└─ UNDO les opérations non terminées

Ce processus (replay redo/undo) permet à une base de données de reconstruire un état valide même si le crash est survenu au pire moment possible.
Des systèmes comme PostgreSQL, InnoDB et RocksDB implémentent des variantes de ce cycle, mais l’idée centrale reste identique :

le WAL est l’enregistrement de référence après une panne.

Replay du WAL et recovery après crash

Pour rendre le replay efficace, les moteurs créent périodiquement des checkpoints, qui représentent un snapshot cohérent des fichiers de données. Après un checkpoint, seules les entrées de log postérieures à ce point doivent être rejouées.

Diagramme conceptuel :


WAL : |- anciens logs -|- checkpoint -|- logs actifs -|

Au recovery :

* Ignorer tout ce qui précède le checkpoint
* Réappliquer les logs actifs dans l’ordre

Cela permet de borner le temps de redémarrage et d’éviter que le WAL ne grossisse indéfiniment.

Dans les systèmes basés sur LSM (ex. RocksDB), le replay du WAL sert à reconstruire des structures en mémoire (comme les memtables) avant leur flush vers des SSTables.
Dans les systèmes B-Tree (ex. Postgres), le replay répare les pages non flushées et annule les transactions incomplètes.

Quelle que soit l’architecture, le replay du WAL est le battement de cœur qui restaure la cohérence interne du moteur.

Forces structurelles et limites

Le WAL apporte des garanties puissantes, mais introduit également des contraintes qui influencent fortement la conception du moteur.

Forces

  • Permet une durabilité stricte avec des performances prévisibles
  • Protège les structures de données contre les écritures partielles
  • Fournit un historique linéaire et récupérable
  • Autorise le moteur de stockage à batcher et optimiser les écritures vers les fichiers de données

Limites

  • Le volume de logs augmente vite et nécessite compaction ou archivage
  • Les workloads intensifs en écriture peuvent devenir limités par le log
  • Le checkpointing devient indispensable pour maintenir des temps de recovery raisonnables
  • Certains workloads exigent un réglage fin du fsync ou des mécanismes de group commit

Dans la pratique, ces compromis sont essentiels pour comprendre pourquoi les moteurs se comportent différemment sous charge et pourquoi leur configuration est si importante.

Conclusion

Le Write-Ahead Log n’est pas une fonctionnalité de confort : c’est le fondement architectural qui permet aux bases de données de promettre durabilité et cohérence dans un monde où les pannes sont inévitables.

En imposant la règle « on log d’abord, on écrit ensuite », le WAL façonne chaque partie du chemin d’écriture, du cycle de crash recovery et du modèle de fiabilité d’un moteur de stockage. Pour tout ingénieur qui explore les internals d’une base de données, comprendre le WAL est indispensable. Presque tous les moteurs modernes — qu’ils soient B-Tree, LSM, relationnels ou distribués — reposent sur cette idée simple, mais incroyablement puissante.

Références recommandées

  1. Jim Gray & Andreas Reuter — Transaction Processing: Concepts and Techniques
  2. Documentation PostgreSQL — Write-Ahead Logging
  3. Garcia-Molina et al. — Database Systems: The Complete Book
  4. RocksDB Engineering Notes — WAL & Recovery
  5. Stonebraker — The Design of the POSTGRES Storage System
  6. Haerder & Reuter — Principles of Transaction-Oriented Database Recovery