Ce chapitre explique comment les WAL sont utilisés pour obtenir des
traitements efficaces et fiables.
27.1. Fiabilité
La fiabilité est une propriété importante de tout système de base
de données sérieux. PostgreSQL™ fait tout ce qui est en son
pouvoir pour garantir des opérations fiables. Un aspect de la
fiabilité des opérations est que toutes les données enregistrées
par une transaction validée doivent être stockées dans un espace
non volatile, un espace non sensible aux coupures de courant, aux
bogues du système d'exploitation et aux problèmes matériels (sauf
en cas de problème sur l'espace non volatile, bien sûr). Écrire
avec succès les données sur le stockage permanent de l'ordinateur
(disque dur ou un équivalent) est habituellement suffisant pour
cela. En fait, même si un ordinateur est suffisamment endommagé, si
le disque dur survit, il peut être placé dans un autre ordinateur
avec un matériel similaire et toutes les transactions validées
resteront intactes.
Bien que forcer l'enregistrement des données périodiquement sur le
disque semble être une opération simple, ce n'est pas le cas. Comme
les disques durs sont beaucoup plus lents que la mémoire principale
et les processeurs, plusieurs niveaux de cache existent entre la
mémoire principale de l'ordinateur et les disques. Tout d'abord, il
existe le tampon cache du système d'exploitation, qui met en cache
les blocs disque fréquemment utilisés et combine les écritures sur
le disque. Heureusement, tous les systèmes d'exploitation donne un
moyen de forcer les écritures du cache disque vers le disque et
PostgreSQL™ utilise ces
fonctions (voir le paramètre wal_sync_method
pour voir comment cela se fait).
Ensuite, il pourrait y avoir un cache dans le contrôleur du disque
dur ; ceci est assez commun sur les cartes contrôleur
RAID. Certains de ces caches
sont write-through, signifiant que les
écritures sont passées au lecteur dès qu'elles arrivent. D'autres
sont write-back, signifiant que les
données sont passées au lecteur un peu après. De tels caches
peuvent apporter une faille dans la fiabilité car la mémoire du
cache du disque contrôleur est volatile et qu'elle perdra son
contenu à la prochaine coupure de courant. Des cartes contrôleur de
meilleure qualité ont des caches avec
batterie, signifiant que la carte dispose d'une batterie qui
maintient le courant dans le cache en cas de perte de courant. Une
fois le courant revenu, les données seront écrites sur les disques
durs.
Et enfin, la plupart des disques durs ont des caches. Certains sont
« write-through » alors que
d'autres sont « write-back ».
Les mêmes soucis sur la perte de données existent pour ces deux
types de cache. Les lecteurs IDE ont principalement des caches
« write-back » qui ne
survivront pas à une perte de courant.
Quand le système d'exploitation envoie une demande d'écriture au
disque, il ne peut pas faire grand chose pour s'assurer que les
données sont arrivées dans un espace de stockage non volatile. Ce
travail incombe à l'administrateur : il doit s'assurer que tous les
composants de stockage assurent l'intégrité des données. Évitez les
contrôleurs disques ne disposant pas de caches protégées par
batterie. Au niveau du disque, désactivez le cache
« write-back » si le disque ne
garantie pas que les données seront écrites avant un arrêt.
Un autre risque concernant la perte des données est dû aux
opérations d'écriture sur les plateaux du disque. Les plateaux sont
divisés en secteur de 512 octets généralement. Chaque opération de
lecture ou écriture physique traite un secteur entier. Quand la
demande d'écriture arrive au lecteur, elle pourrait contenir 512
octets, 1024 octets ou 9182 octets et le processus d'écriture
pourrait échouer à cause d'une perte de courant à tout moment
signifiant que certains octets pourraient être écrits et les autres
perdus. Pour se prévenir contre ce type d'échec, PostgreSQL™ écrit périodiquement des
images de page complète sur le stockage permanent
avant
de modifier la page réelle sur
disque. En effectuant ceci, lors d'une récupération après un arrêt
brutal, PostgreSQL™ peut
restaurer des pages écrites partiellement. Si vous avez un
contrôleur disque avec un cache préservé par batterie ou un
logiciel pour le système de fichiers qui protège les écritures de
pages incomplètes (c'est-à-dire ReiserFS 4), vous pouvez désactiver
la création des images de page en utilisant le paramètre full_page_writes.