Outils de sauvegarde physique

Module I4

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module I4
Titre Outils de sauvegarde physique
Révision 24.09
PDF https://dali.bo/i4_pdf
EPUB https://dali.bo/i4_epub
HTML https://dali.bo/i4_html
Slides https://dali.bo/i4_slides
TP https://dali.bo/i4_tp
TP (solutions) https://dali.bo/i4_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

PostgreSQL : Outils de sauvegarde physique

PostgreSQL

Introduction

  • 2 mécanismes de sauvegarde natifs et robustes
  • Industrialisation fastidieuse
  • Des outils existent !!

Au menu

  • Présentation:
    • pg_basebackup
    • pgBackRest
    • Barman
  • Comment choisir ?

Préalable : définir les besoins

  • Sauvegarde locale (ex. NFS) ?
  • Copie vers un serveur tiers (push) ?
  • Sauvegarde distante initiée depuis un serveur tiers (pull) ?
  • Ressources à disposition ?
  • Accès SSH ?
  • OS ?
  • Sauvegardes physiques ? Logiques ?
  • Version de PostgreSQL ?
  • Politique de rétention ?

pg_basebackup

pg_basebackup - Présentation

  • Outil intégré à PostgreSQL
  • Prévu pour créer une instance secondaire
  • Pour sauvegarde ponctuelle
    • PITR avec outils complémentaires

pg_basebackup - Formats de sauvegarde

  • --format plain
    • arborescence identique à l’instance sauvegardée
  • --format tar
    • archive
    • compression : -z, -Z (0..9)

pg_basebackup - Avantages

  • Transfert des WAL pendant la sauvegarde
  • Slot de réplication automatique (temporaire voire permanent)
  • Limitation du débit
  • Relocalisation des tablespaces
  • Fichier manifeste (v13+)
  • Vérification des checksums
  • Sauvegarde possible à partir d’un secondaire
  • Compression côté serveur ou client (v15+)
  • Emplacement de la sauvegarde (client/server/blackhole) (v15+)
  • Suivi : pg_stat_progress_basebackup (v13+)

pg_basebackup - Limitations

  • Configuration streaming nécessaire
  • Pas de configuration de l’archivage
  • Pas d’association WAL archivés / sauvegarde
  • Pas de politique de rétention
    • sauvegarde ponctuelle
  • Pas de gestion de la restauration !
    • manuel : recovery.signal, restore_command
    • pour un secondaire : --write-recovery-conf

pgBackRest

PgbackRest

pgBackRest - Présentation générale

  • David Steele (Crunchy Data)
  • Langage : C
  • License : MIT (libre)
  • Type d’interface : CLI (ligne de commande)

pgBackRest - Fonctionnalités

  • Gère la sauvegarde et la restauration
    • pull ou push, multidépôts
    • mono- ou multiserveur
  • Indépendant des commandes système
    • protocole dédié
  • Sauvegardes complètes, différentielles ou incrémentales
  • Multithread, sauvegarde depuis un secondaire, archivage asynchrone…
  • Projet mature

pgBackRest - Sauvegardes

  • Type de sauvegarde : physique/PITR (à chaud)
  • Type de stockage : local, push ou pull
  • Planification : crontab (ou autre)
  • Complètes, différentielles et incrémentales
  • Compression des WAL

pgBackRest - Restauration

  • Depuis le serveur de BDD avec un dépôt local ou à distance
  • Point dans le temps : date, identifiant de transaction, timeline ou point de restauration

pgBackRest - Installation

  • Accéder au dépôt communautaire PGDG
  • Installer le paquet pgbackrest

pgBackRest - Utilisation

Usage:
    pgbackrest [options] [command]

Commands:
    annotate        Add or modify backup annotation.
    archive-get     Get a WAL segment from the archive.
    archive-push    Push a WAL segment to the archive.
    backup          Backup a database cluster.
    check           Check the configuration.
    expire          Expire backups that exceed retention.
    help            Get help.
    info            Retrieve information about backups.
    repo-get        Get a file from a repository.
    repo-ls         List files in a repository.
    restore         Restore a database cluster.
    server          pgBackRest server.
    server-ping     Ping pgBackRest server.
    stanza-create   Create the required stanza data.
    stanza-delete   Delete a stanza.
    stanza-upgrade  Upgrade a stanza.
    start           Allow pgBackRest processes to run.
    stop            Stop pgBackRest processes from running.
    verify          Verify contents of the repository.
    version         Get version.

pgBackRest - Configuration

  • /etc/pgbackrest.conf
  • Configuration générale dans la section [global]
  • Chaque instance à sauvegarder doit avoir sa propre section, appelée stanza
  • possibilité d’éclater la configuration dans plusieurs fichiers : config-include-path

pgBackRest - Configuration PostgreSQL

  • Adapter l’archivage dans le fichier postgresql.conf
archive_mode = on
wal_level = replica
archive_command = 'pgbackrest --stanza=erp_prod archive-push %p'
archive_timeout = '? min'   # à définir

pgBackRest - Configuration globale

  • Fichier pgbackrest.conf
  • Section [global] pour la configuration globale
[global]
process-max=1
repo1-path=/var/lib/pgbackrest

pgBackRest - Configuration de la rétention

  • Type de rétention des sauvegardes complètes
repo1-retention-full-type=count|time
  • Nombre de sauvegardes complètes
repo1-retention-full=2
  • Nombre de sauvegardes différentielles
repo1-retention-diff=3

pgBackRest - Configuration SSH

  • Utilisateur postgres pour les serveurs PostgreSQL
  • Échanger les clés SSH publiques entre les serveurs PostgreSQL et le serveur de sauvegarde
  • Configurer repo1-host* dans la pgbackrest.conf

pgBackRest - Configuration TLS

  • Alternative au SSH
  • {repo1|pg1}-host-type = tls
  • paramètres tls-server-{address|auth|cert|key|ca}
  • paramètres repo1-host-{cert|key|ca}
  • paramètres pg1-host-{cert|key|ca}
  • pgbackrest server

pgBackRest - Configuration par instance

  • Une section par instance
    • appelée stanza

pgBackRest - Exemple configuration par instance

  • Section spécifique par instance
  • Permet d’adapter la configuration aux différentes instances
  • Exemple
[erp_prod]
pg1-path=/var/lib/pgsql/10/data

pgBackRest - Initialiser le répertoire de stockage des sauvegardes

  • Pour initialiser le répertoire de stockage des sauvegardes
$ sudo -u postgres pgbackrest --stanza=erp_prod stanza-create
  • Vérifier la configuration de l’archivage
$ sudo -u postgres pgbackrest --stanza=erp_prod check

pgBackRest - Effectuer une sauvegarde

  • Pour déclencher une nouvelle sauvegarde complète
$ sudo -u postgres pgbackrest --stanza=erp_prod --type=full backup
  • Types supportés : incr, diff, full
  • La plupart des paramètres peuvent être surchargés

pgBackRest - Lister les sauvegardes

  • Lister les sauvegardes présentes et leur taille
$ sudo -u postgres pgbackrest --stanza=erp_prod info
  • ou une sauvegarde spécifique (backup set)
$ sudo -u postgres pgbackrest --stanza=erp_prod --set 20221026-071751F info

pgBackRest - Dépôts

  • Plusieurs dépôts simultanés possibles
    • sauvegarde par dépôt selon rétention
    • archivage sur tous les dépôts (asynchrone conseillé!)
    • --repo1-option=… , appel avec --repo=1
  • POSIX (NFS, ssh), CIFS, SFTP, cloud (S3, Azure, GFS)

pgBackRest - bundling et sauvegarde incrémentale en mode block

  • Regrouper les petits fichiers dans des bundles
repo1-bundle=y
  • Sauvegarde incrémentale en mode block (requiert le bundling)
repo1-bundle=y
repo1-block=y

pgBackRest - Restauration

  • Effectuer une restauration
$ sudo -u postgres pgbackrest --stanza=erp_prod restore
  • Nombreuses options à la restauration, notamment :
    • --delta
    • --target / --type

Barman

Barman

Barman - Présentation générale

  • 2ndQuadrant Italia
  • Langage: python >= 3.4
  • OS: Unix/Linux
  • Versions compatibles: >= 8.3
  • License: GPL3 (libre)
  • Type d’interface: CLI (ligne de commande)

Barman - Scénario « streaming-only »

Architecture barman 1

Barman - Scénario « rsync-over-ssh »

Architecture barman 2

Barman - Sauvegardes

  • Type de sauvegarde : physique/PITR (à chaud)
  • Type de stockage : local ou pull
  • Planification : crontab
  • Méthodes :
    • pg_backup_start() / rsync / pg_backup_stop()
    • pg_basebackup / pg_receivewal
  • Incrémentales : si rsync + hardlink
  • Compression des WAL

Barman - Sauvegardes (suite)

  • Limitation du débit réseau lors des transferts
  • Compression des données lors des transferts via le réseau
  • Sauvegardes concurrentes
  • Hook pre/post sauvegarde
  • Hook pre/post archivage WAL
  • Compression WAL : gzip, bzip2, pigz, pbzip2, etc.
  • Compression des données via pg_basebackup

Barman - Politique de rétention

  • Durée (jour/semaine)
  • Nombre de sauvegardes

Barman - Restauration

  • Locale ou à distance
  • Point dans le temps : date, identifiant de transaction, timeline ou point de restauration

Barman - Installation

  • Accéder au dépôt communautaire PGDG
  • Installer les paquets barman et barman-cli

Barman - Utilisation

usage: barman [-h] [-v] [-c CONFIG] [--color {never,always,auto}] [-q] [-d]
              [-f {json,console}]

          {archive-wal,backup,check,check-backup,check-wal-archive,cron,
          delete,diagnose,generate-manifest,get-wal,help,keep,list-backup,
          list-backups,list-files,list-server,list-servers,put-wal,
          rebuild-xlogdb,receive-wal,recover,replication-status,show-backup,
          show-backups,show-server,show-servers,status,switch-wal,switch-xlog,
          sync-backup,sync-info,sync-wals,verify,verify-backup}

[...]
optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -c CONFIG, --config CONFIG
                        uses a configuration file (defaults: ~/.barman.conf,
                        /etc/barman.conf, /etc/barman/barman.conf)
  --color {never,always,auto}, --colour {never,always,auto}
                        Whether to use colors in the output (default: 'auto')
  -q, --quiet           be quiet (default: False)
  -d, --debug           debug output (default: False)
  -f {json,console}, --format {json,console}
                        output format (default: 'console')

Barman - Configuration

  • /etc/barman.conf
  • Format INI
  • Configuration générale dans la section [barman]
  • Chaque instance à sauvegarder doit avoir sa propre section
  • Un fichier de configuration par instance via la directive :
configuration_files_directory = /etc/barman.d

Barman - Configuration utilisateur

  • Utilisateur système barman

Barman - Configuration SSH

  • Utilisateur postgres pour les serveurs PostgreSQL
  • Utilisateur barman pour le serveur de sauvegardes
  • Générer les clés SSH (RSA) des utilisateurs système postgres (serveurs PG) et barman (serveur barman)
  • Échanger les clés SSH publiques entre les serveurs PostgreSQL et le serveur de sauvegarde
  • Établir manuellement une première connexion SSH entre chaque machine
  • Inutile si utilisation de pg_basebackup / pg_receivewal

Barman - Configuration PostgreSQL

  • Adapter la configuration de l’archivage dans le fichier postgresql.conf :
wal_level = 'replica'
archive_mode = on
archive_command = 'barman-wal-archive backup-srv pgsrv %p'
  • … ou paramétrer la réplication si utilisation de pg_basebackup / pg_receivewal

Barman - Configuration globale

  • barman.conf
[barman]
barman_home = /var/lib/barman
barman_user = barman
log_file = /var/log/barman/barman.log
log_level = INFO
configuration_files_directory = /etc/barman.d

Barman - Configuration sauvegardes

  • Configuration globale des options de sauvegarde
compression = gzip
backup_compression = gzip
immediate_checkpoint = false
basebackup_retry_times = 0
basebackup_retry_sleep = 30

Barman - Configuration réseau

  • Possibilité de réduire la bande passante
  • Et de compresser le trafic réseau
  • Exemple
bandwidth_limit = 4000
network_compression = false

Barman - Configuration rétention

  • Configuration de la rétention en nombre de sauvegardes
  • Ou en « fenêtre de restauration », en jours, semaines ou mois
  • Déclenchement d’une erreur en cas de sauvegarde trop ancienne
  • Exemple
minimum_redundancy = 5
retention_policy = RECOVERY WINDOW OF 7 DAYS
last_backup_maximum_age = 2 DAYS

Barman - Configuration des hooks

  • Lancer des scripts avant ou après les sauvegardes
  • Et avant ou après le traitement du WAL archivé par Barman
  • Exemple :
pre_backup_script = ...
post_backup_script = ...
pre_archive_script = ...
post_archive_script = ...

Barman - Configuration d’un dépôt synchronisé

  • Copie à l’identique du dépôt d’origine
  • Sur le dépôt à synchroniser :
    • primary_ssh_command
  • Commandes :
    • barman sync-info --primary <instance> <ID-sauvegarde>
    • barman sync-backup <instance> <ID-sauvegarde>
    • barman sync-wal <instance>

Barman - Configuration par instance

  • configuration_files_directory
    • un fichier de configuration par instance
  • Ou une section par instance

Barman - Exemple configuration par instance

  • Section spécifique par instance
  • Permet d’adapter la configuration aux différentes instances
  • Exemple
[pgsrv]
description = "PostgreSQL Instance pgsrv"
ssh_command = ssh postgres@pgsrv
conninfo = host=pgsrv user=postgres dbname=postgres
backup_method = rsync
reuse_backup = link
backup_options = exclusive_backup
archiver = on

Barman - Exemple configuration Streaming Only

[pgsrv]
description =  "Sauvegarde de pgsrv via Streaming Replication"
conninfo = host=pgsrv user=barman dbname=postgres
streaming_conninfo = host=pgsrv user=streaming_barman
backup_method = postgres
streaming_archiver = on
create_slot = auto
slot_name = barman
  • barman replication-status pgsrv

Barman - Vérification de la configuration

  • La commande show-server montre la configuration
$ sudo -u barman barman show-server {<instance> | all}
  • La commande check effectue des tests pour la valider
$ sudo -u barman barman check {<instance> | all}
$ sudo -u barman barman check {<instance> | all} --nagios

Barman - Statut

  • La commande status affiche des informations détaillées
    • sur la configuration Barman
    • sur l’instance spécifiée
  • Exemple
$ sudo -u barman barman status {<instance> | all}

Barman - Diagnostiquer

  • La commande diagnose renvoie
    • les informations renvoyées par la commande status
    • des informations supplémentaires (sur le système par exemple)
    • au format json
  • Exemple
$ sudo -u barman barman diagnose

Barman - Nouvelle sauvegarde

  • Pour déclencher une nouvelle sauvegarde
$ sudo -u barman barman backup {<instance> | all} [--wait]
  • Le détail de sauvegarde effectuée est affiché en sortie

Barman - Lister les sauvegardes

  • Pour lister les sauvegardes existantes
$ sudo -u barman barman list-backup {<instance> | all}
  • Affiche notamment la taille de la sauvegarde et des WAL associés

Barman - Détail d’une sauvegarde

  • show-backup affiche le détail d’une sauvegarde (taille…)
$ sudo -u barman barman show-backup <instance> <ID-sauvegarde>
  • list-files affiche le détail des fichiers d’une sauvegarde
$ sudo -u barman barman list-files <instance> <ID-sauvegarde>

Barman - Suppression d’une sauvegarde

  • Pour supprimer manuellement une sauvegarde
$ sudo -u barman barman delete <instance> <ID-sauvegarde>
  • Renvoie une erreur si la redondance minimale ne le permet pas

Barman - Conserver une sauvegarde

  • Pour conserver une sauvegarde
$ sudo -u barman barman keep <instance> <ID-sauvegarde>
  • Pour relâcher une sauvegarde
$ sudo -u barman barman keep --release <instance> <ID-sauvegarde>

Barman - Tâches de maintenance

  • La commande Barman cron déclenche la maintenance
    • récupération des WAL archivés
    • compression
    • politique de rétention
    • démarrage de pg_receivewal
  • Exemple
$ sudo -u barman barman cron
  • À planifier ! (vérifier /etc/cron.d/barman)

Barman - Restauration

  • Copie/transfert de la sauvegarde
  • Copie/transfert des journaux de transactions
  • Génère le paramétrage pour la restauration
  • Copie/transfert des fichiers de configuration

Barman - Options de restauration

  • Locale ou à distance
  • Cibles : timeline, date, ID de transaction ou point de restauration
  • Déplacement des tablespaces

Barman - Exemple de restauration à distance

  • Exemple d’une restauration
    • déclenchée depuis le serveur Barman
    • avec un point dans le temps spécifié
$ sudo -u barman barman recover                   \
    --remote-ssh-command "ssh postgres@pgsrv"     \
    --target-time "2019-12-11 14:00:00"           \
    pgsrv 20191211T121244 /var/lib/pgsql/12/data/

pitrery

pitrery - Présentation générale

  • R&D Dalibo

  • Langage : bash

  • OS : Unix/Linux

  • Versions compatibles : 8.2 à 14 (pas 15+)

  • Développement arrêté, ne plus utiliser

Autres outils de l’écosystème

  • De nombreux autres outils existent
    • …ou ont existé
  • WAL-E, OmniPITR, pg_rman, walmgr…
  • WAL-G

WAL-G - présentation

  • Successeur de WAL-E, par Citus Data & Yandex
  • Orientation cloud
  • Aussi pour MySQL et SQL Server

Conclusion

  • Des outils pour vous aider !
  • Pratiquer, pratiquer et pratiquer
  • Superviser les sauvegardes !

Quiz

Travaux pratiques

Utilisation de pgBackRest (Optionnel)

Utilisation de barman (Optionnel)

Travaux pratiques (solutions)