Sauvegarde locale avec pgBackRest

Une architecture basique de type Oracle-like

      Oracle propose par défaut de créer une zone appelée FRA (Fast Recovery Area). Cette zone peut contenir une copie des fichiers de journalisation courant (redo log online, WAL) mais surtout les fichiers de journalisation archivés (redo logs archivés, WAL archivés) et les sauvegardes des fichiers de données.
      Le principe de sauvegarde est alors de faire "backup database to FRA" suivi de "backup FRA to tape". L'idée est de sauvegarder la base dans la FRA afin de disposer d'une zone disque immédiatement disponible pour faire des PITR (point in time recovery) rapides mais limités au niveau de la période couverte mais aussi de remonter la FRA sur bande pour constituer des sauvegardes de plus long terme. Les bandes sont souvent à présent des librairies virtuelles mais le principe demeure le même.
      Nous allons constituer l'équivalent de la FRA pour PostgreSQL avec Pgbackrest, outil sous licence MIT.
      La fonctionnalité archive_push de pgBackRest, appelée via le paramètre archive_command, va nous apporter les WAL archivés.
      La fonctionnalité backup de pgBackRest va nous apporter la vérification de la corruption et la sauvegarde des fichiers de données.
      Il n'est actuellement pas possible avec pgBackRest de protéger le WAL courant via streaming comme avec Barman. Il faut donc se reporter sur une fonctionnalité native de PostgreSQL, les hot standby, pour obtenir un RPO (recovery point objective) proche de 0 (voire même égal à 0).
      Les exemples de cette page ont été réalisés avec pgBackRest 2.x et PostgreSQL 11 sous Debian 10 "buster". Nous allons d'abord installer le logiciel pgBackRest. Un simple apt-get avec l'utilisateur root suffit :

apt-get install pgbackrest


      Préparer avec root les dossiers, celui du fichier de configuration et celui des sauvegardes (le dossier des sauvegardes fait idéalement l'objet d'un filesystem dédié) :

mkdir -p /etc/pgbackrest chown postgres:postgres /etc/pgbackrest chmod 770 /etc/pgbackrest mkdir -p /var/lib/pgbackrest chown postgres:postgres /var/lib/pgbackrest chmod 770 /var/lib/pgbackrest


      Il est ensuite possible de travailler avec l'utilisateur postgres, tout d'abord pour renseigner le fichier de configuration /etc/pgbackrest/pgbackrest.conf (l'utilisation de /etc/pgbackrest.conf est toujours possible mais dépréciée avec la version de pgBackRest incluse avec Debian 10).

vi /etc/pgbackrest/pgbackrest.conf [global] repo1-path=/var/lib/pgbackrest [apptra001] pg1-path=/var/lib/postgresql/11/apptra001 pg1-port=5432 repo1-retention-full=2

      La section "global" donne la configuration générale de pgBackRest.

      La section "apptra001" est spécifique à une "stanza", c'est le nom de la FRA dans le vocabulaire de pgBackRest. Nous choisissons ici de donner à la stanza le même nom qu'au cluster PostgreSQL à sauvegarder.       Les backups et les WAL archivés sont par défaut compressés avec pgBackRest (zlib niveau 6). Il est possible de modifier cet aspect au niveau du fichier de configuration ou encore à l'exécution. Exemple, pour modifier le niveau de compression des WAL archivés à 1, ajouter cette section à /etc/pgbackrest/pgbackrest.conf :

[global:archive-push] compress-level=1

      Il faut ensuite créer la stanza avec une commande dédiée :

pgbackrest --stanza=apptra001 --log-level-console=info stanza-create

      La stanza porte ici le même nom que le cluster : apptra001
      L'archivage des WAL doit être configuré au niveau du cluster apptra001 pour qu'ils soient poussés vers la stanza correspondante :

psql -p 5432 alter system set archive_mode='on'; alter system set archive_command = 'pgbackrest --stanza=apptra001 archive-push %p'; alter system set archive_timeout = 600; alter system set wal_level = 'replica';

      Nous choisissons de provoquer un archivage de WAL toutes les 10 minutes (600 secondes) afin d'avoir un engagement plus précis au niveau du RPO (recovery point objective).
      Un redémarrage du cluster avec root est ensuite nécessaire :

pg_ctlcluster 11 apptra001 restart

      Il est à présent possible de réaliser une première sauvegarde complète (full) du cluster apptra001 avec l'utilisateur postgres. Les différentes options peuvent être fixées via /etc/pgbackrest/pgbackrest.conf mais aussi être choisies à l'exécution. Nous allons par exemple ici choisir d'utiliser un parallélisme de 4 et un niveau de compression de 1 (vous pouvez aussi complètement désactiver la compression, par exemple si votre outil de sauvegarde complémentaire propose la déduplication) :

pgbackrest --log-level-console=info --compress-level=1 --process-max=4 --type=full --stanza=apptra001 backup

      Vous pouvez ensuite planifier cette sauvegarde, par exemple via la crontab de l'utilisateur postgres.
      L'expiration des backups sera automatiquement réalisée en fonction de la redondance choisie.
      La vérification de la corruption est automatiquement incluse si les sommes de contrôle (checksums) sont activées au niveau du cluster PostgreSQL. Elle fait cependant l'objet d'un simple warning donc il convient d'analyser le log et de remonter une alerte dans ce cas.
      Vous pouvez vérifier si la configuration de l'archivage des WAL est OK avec l'option check ou encore contrôler à tout moment la situation des sauvegardes avec l'option info :

pgbackrest --stanza=apptra001 info

Mise à jour : 22/07/2019