Les journaux WAL
WAL(Write-Ahead Logging) est une approche conventionnelle pour l'écriture d'un journal de transactions.
WALest que pour toute modification :
WAL),
roll-forwardconnue sous le nom de
REDO.
WALenregistré,
WAL.
WALjusqu'au moment désiré.
WAL
WALen utilisant le paramètre wal_sync_method = OFF, mais...
Le mode fsync = off est très déconseillé, mais il permet un gain significatif de performances. Il existe cependant quelques contextes
pertinents tels que durant les restaurations ou encore dans le cas de bases de données en read only
.
Dans la plupart des cas on préférera utiliser synchronous_commit = OFF qui est quasiment aussi avantageux en
performances et qui supporte également les arrêts brutaux et autres crashs.
La commande système pg_test_fsync permet de déterminer quelle est la méthode la plus performante sur notre système.
La plupart des disques y compris les SSD sont pourvus de cache. Ceci est vérifiable par la commande (sous Linux) hdparm -I device. Afin de garantir l'écriture des données en cas de crash il faudra le désactiver, ce qui peut se réaliser par la commande hdparm -W 0 device.
WALdeux modes sont possibles :
commit asynchroneentraînera un enregistrement différé des
WAL,
commit synchroneentraînera l'attente du retour de la synchronisation des
WALsur le disque avant de poursuivre tout traitement.
L'intérêt est de permettre une accélération significative de la performance, mais au détriment de la garantie d'écriture et donc avec risque de pertes de données en cas de crash.
waldes serveurs répliqués,
waldes serveurs répliqués,
Un standby name
se définit par le paramètre application_name indiqué dans le fichier recovery.conf
exigé en mode réplication.
Pour indiquer que l'on souhaite la réponse d'au moins 2 serveurs répliqués quelconques il faudra positionner le paramètre synchronous_standby_names = '2 (*)'.
WAL
WAL,
check pointsqui sont les points de synchronisation mémoire vive/mémoire de masse,
WALsont à activer.
la plupart des valeurs seront à positionner dans le fichier postgresql.conf.
WAL
WAL:
# la commande à utiliser pour archiver les WAL archive_command = 'cp %p /net/rescue/var/tmp/test/%f' # la durée maximale séparant 2 archives archive_timeout = 60 # l'archivage des WAL est activé archive_mode = on # le mode d'archivage est archive wal_level = replica
WAL
WALest data_directory/pg_wal.
WALsont des fichiers de taille fixe de 16 MiB (défini à la compilation de Postgresql).
WAL.
L'utilisation de archive_command et archive_timeout permet de réaliser un système d'archivage répliqué.
Un fichier WAL
est pré-alloué sur le disque afin que PostgreSQL ne soit pas confronté à des problèmes d’espace.
La commande archive_command permet l'utilisation des paramètres %p et %f qui se substituent
respectivement au chemin complet du fichier et au seul nom du fichier. Il est ainsi possible de transférer chaque fichier WAL
dans un espace dédié à leur archivage.
WAL
walest celui des LSN (
Log Sequence Number).
WALdont le nom est 00000001000000020000005A, celui-ci se décompose ainsi :
TimeLineID(ici 00000001),
Les TimeLineID
commencent à 1 au premier lancement du cluster
puis s'incrémentent à chaque nouvelle restauration
permettant ainsi de distinguer les différents niveaux d'archives.
WAL
SELECT pg_current_wal_lsn(); pg_current_wal_lsn -------------------------- 2A/DC9F0880 (1 row)
SELECT pg_walfile_name('2A/DC9F0880'); pg_walfile_name -------------------------- 000000010000002A000000DC (1 row)
Lors de l'évolution du système, des WAL
deviennent inutiles. Afin d'éviter de gaspiller des ressources de traitement
PostgreSQL renommera les fichiers de journaux devenu inutiles en leur donnant un nom qui sera utilisé dans le futur.
C'est la raison pour laquelle il apparaîtra parfois des journaux situés au delà du journal courant, ce qui se vérifie à l'aide
de la commande SELECT pg_walfile_name(pg_current_wal_lsn());.
checkpoints
checkpointsera automatiquement exécuté en cas de faible activité,
cluster, en cas de débordement un
checkpointest généré,
streaming,
checkpointssont trop rapprochés.
Les WAL
ne peuvent être supprimés sans altérer le fonctionnement du système car il contiennent éventuellement des informations nécessaires
aux tables. C'est la raison pour laquelle il est indispensable de recourir à l'utilisation de CHECKPOINT qui rendra tous les enregistrements
antérieurs inutiles.
La fréquence des checkpoints
peut devenir trop importante si la base de données est fortement sollicitée et que le paramètre
checkpoint_warning indique un nombre trop bas de secondes entre deux checkpoints
automatiquement générés, ce qui conduira à la production
de messages dans les logs. Pour éviter cela il faudra :
checkpointsplus rapprochés,
WAL
WALon notera :
checkpoint,
WALen lui donnant un nom tel que 00000001000000000000005C.00000028.backup,
WALsuivant,
WALsuivant,
WALcontenus dans le répertoire dédié.
WAL
WALpeuvent conduire à une consommation excessive de l'espace de travail.
WAL.
Depuis la version 9.5 il est possible de réduire l'espace demandé par les WALs grâce à l'utilisation de le compression de type LZ. Ceci s'active par le paramètre wal_compression=on et apporte également l'avantage de réduire les entrées-sorties, mais au détriment de consommation CPU.
WAL: www.postgresql.org/docs/current/static/runtime-config-wal.html
En réalité les informations stockées dans les WAL ne sont pas des directives SQL, mais des pages de mémoire de masse de longueur de 8 kio correspondant aux zones impactées dans les divers fichiers. En conséquence il est inutile d'essayer d'en interpréter le contenu car les instructions ayant provoqué la modification des pages n'y sont pas stokées.
En raison de son aptitude à restaurer la base de données en cas de crash, les systèmes de fichiers journalisés ne sont pas nécessaires et peuvent même nuire à la performance. Pour éviter cela sous Linux il est possible de configurer un système de fichier ext3 avec l'option data=writeback.