Aller au contenu

Barman

Warning

Cette documentation est un travail en cours

Présentation

Barman (Backup and Recovery Manager) est un outil d’administration open-source pour la reprise après sinistre des serveurs PostgreSQL.

Il est écrit en Python.

Il permet d’effectuer des sauvegardes à distance de plusieurs serveurs dans des environnements critiques pour réduire les risques et aider les administrateurs de bases de données pendant la phase de rétablissement.

Barman possède deux méthodes de sauvegarde :

  • La méthode de sauvegarde rsync.
  • La méthode de sauvegarde streaming (basé sur pg_basebackup).

La méthode rsync/ssh est la méthode traditionnelle. Elle utilise ssh et rsync pour effectuer les sauvegardes à distance.

Celui ci permet de bénéficier de certaines fonctionnalités avancées comme les sauvegardes incrémentales.

La méthode rsync effectue la copie réelle de la sauvegarde à l’aide de l’outil rsync.

Tout d’abord, il copie un tablespace à la fois, puis le répertoire PGDATA (en excluant les tablespaces qui se trouveraient à l’intérieur), et enfin les fichiers de configuration (si en dehors de PGDATA).

La sauvegarde sur rsync était la seule méthode disponible avant la version 2.0, et est actuellement la seule méthode de sauvegarde qui supporte la fonction de sauvegarde incrémentale.

Pour effectuer une sauvegarde à l’aide de rsync, placer ces paramètres dans le fichier de configuration du serveur Barman :

backup_method = rsync
ssh_command = ssh postgres@pg

L’option backup_method active la méthode de sauvegarde rsync, et l’option ssh_command est nécessaire pour créer correctement une connexion SSH du serveur Barman au serveur PostgreSQL.

Il existe deux types de fichiers de configuration dans Barman :

  • un fichier de configuration global (défini par défaut dans /etc/barman.conf) qui contient des options générales telles que répertoire principal, utilisateur système, fichier journal, etc… ;
  • un fichier de configuration serveur (défini généralement dans /etc/barman.d/nom_du_serveur.conf) qui contient des options spécifiques au serveur.

Installation de barman

Une fois le dépôt du PGDG configuré sur votre serveur linux, installer le paquet barman.

RedHat et ses dérivés

yum install barman

Debian et ses dérivés

apt install barman

Mise en place de barman

Contexte

Deux serveurs:

  • barman.lan: serveur barman
  • srv1.lan : serveur PostgreSQL

Au préalable, échanger les clés SSH entre barman.lan et srv1.lan.

Vérifier que les connexions fonctionnent avec les commandes suivantes :

Depuis le serveur barman

ssh postgres@srv1.lan

Depuis le serveur srv1.lan

ssh barman@barman.lan

Mise en place de la sauvegarde et de l’archivage avec Rsync

Installer et configurer PostgreSQL

Depuis le serveur srv1

Installer PostgreSQL 15 :

yum install postgresql15 postgresql15-server

Ajouter la ligne suivante dans le fichier pg_hba.conf :

host    all     all     <barman-ip>/32        scram-sha-256

Dans le fichier postgresql.conf :

listen_addresses = '*'

Créer une base de données avec un jeu de données :

postgres@srv1:~$ psql -c 'CREATE DATABASE mydb;'
postgres@srv1:~$ psql -d mydb -c 'CREATE TABLE t1(c1 int);'
postgres@srv1:~$ psql -d mydb -c 'INSERT INTO t1 SELECT * FROM generate_series(1,1000000);'

Installer Barman

Depuis le serveur barman

Installer au préalable le paquet epel-release pour éviter les erreurs liées aux dépendences python :

yum install epel-release

Installer le paquet barman :

dnf install barman

Configurer la connexion ssh entre les serveurs

Une fois les clés publics échangées, vérifier que le serveur barman accède bien au serveur srv1 (et inversement) avec les commandes suivantes :

Depuis le serveur barman

ssh postgres@srv1.lan

Depuis le serveur srv1

ssh barman@barman.lan

Configuration barman

Depuis le serveur barman

En tant que root, modifier le fichier /etc/barman.conf afin d’avoir les paramètres suivants :

[barman]
barman_user = barman
configuration_files_directory = /etc/barman.d
barman_home = /var/lib/barman
log_file = /var/log/barman/barman.log
immediate_checkpoint = true
  • barman_user = barman1 : nom de l’utilisateur exécutant Barman sur le serveur de sauvegarde
  • configuration_files_directory = /etc/barman.d : spécifie le chemin du répertoire où barman va charger les fichiers de configurations
  • barman_home = /var/lib/barman : spécifie le répertoire home de l’utilisateur barman
  • log_file = /var/log/barman/barman.log : spécifie le chemin des logs barman
  • immediate_checkpoint = true : lorsque ce paramètre est à true, le point de contrôle exécuté par la fonction pg_start_backup() sera immédiat (c’est-à-dire qu’il n’attend pas le point de contrôle prévu).

Créer le fichier /etc/barman.d/srv1.conf avec le contenu suivant :

[root@barman ~]# vim /etc/barman.d/srv1.conf
[srv1]
description =  "Our main PostgreSQL server"
ssh_command = ssh postgres@srv1.lan
conninfo = host=srv1.lan user=postgres dbname=postgres
backup_method = rsync
backup_options = concurrent_backup
parallel_jobs = 1
reuse_backup = link
archiver = on
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

Note

Le rôle utilisé dans la chaine de connexion pour réaliser la sauvegarde doit soit posséder les droits superutilisateurs, soit posséder les droits d’exécution des fonctions de sauvegarde.

Le paramètre backup_method permet de spécifier le type de sauvegarde (Streaming ou rsync), dans cette partie, nous configurons la sauvegarde en mode rsync/ssh.

Le paramètre backup_options est paramétré par défaut à “concurrent_backup” depuis la version 3 de Barman.

Depuis le serveur barman

barman@barman:~$ barman show-server srv1 | grep incoming_wals_directory
    incoming_wals_directory: /var/lib/barman/srv1/incoming

Créer les répertoires s’ils n’existent pas :

barman@barman:~$ mkdir -p /var/lib/barman/srv1/incoming

Depuis le serveur srv1

Modifier les paramètres suivants dans le fichier postgresql.conf

wal_level = replica
archive_mode = on
archive_command = 'rsync -a %p barman@barman.lan:/var/lib/barman/srv1/incoming/'
sudo systemctl restart postgresql-15.service

Depuis le serveur barman

Vérifier que la configuration est fonctionnelle :

barman@barman:~$ barman check srv1
Server srv1:
    PostgreSQL: OK
    superuser or standard user with backup privileges: OK
    wal_level: OK
    directories: OK
    retention policy settings: OK
    backup maximum age: OK (no last_backup_maximum_age provided)
    backup minimum size: OK (0 B)
    wal maximum age: OK (no last_wal_maximum_age provided)
    wal size: OK (0 B)
    compression settings: OK
    failed backups: OK (there are 0 failed backups)
    minimum redundancy requirements: OK (have 0 backups, expected at least 0)
    ssh: OK (PostgreSQL server)
    systemid coherence: OK (no system Id stored on disk)
    archive_mode: OK
    archive_command: OK
    continuous archiving: OK
    archiver errors: OK

Lister les serveurs :

barman@barman:~$ barman list-server
srv1 - Our main PostgreSQL server

Créer un backup :

barman@barman:~$ barman backup srv1
Starting backup using rsync-concurrent method for server srv1 in /var/lib/barman/srv1/base/20230816T124927
Backup start at LSN: 0/B000028 (00000001000000000000000B, 00000028)
This is the first backup for server srv1
WAL segments preceding the current backup have been found:
    000000010000000000000005 from server srv1 has been removed
    000000010000000000000006 from server srv1 has been removed
    000000010000000000000007 from server srv1 has been removed
    000000010000000000000008 from server srv1 has been removed
    000000010000000000000009 from server srv1 has been removed
Starting backup copy via rsync/SSH for 20230816T124927
Copy done (time: 2 seconds)
This is the first backup for server srv1
Asking PostgreSQL server to finalize the backup.
Backup size: 98.4 MiB. Actual size on disk: 98.4 MiB (-0.00% deduplication ratio).
Backup end at LSN: 0/B000138 (00000001000000000000000B, 00000138)
Backup completed (start time: 2023-08-16 12:49:27.645100, elapsed time: 4 seconds)
Processing xlog segments from file archival for srv1
    00000001000000000000000A
    00000001000000000000000B
    00000001000000000000000B.00000028.backup

Lister les backup :

barman@barman:~$ barman list-backup srv1
srv1 20230816T124927 - Wed Aug 16 12:49:31 2023 - Size: 114.4 MiB - WAL Size: 0 B

Récupérer l’ID du backup (20230816T124927).

Vérifier les informations du backup avec la commande barman show-backup:

barman@barman:~$ barman show-backup srv1 20230816T124927
Backup 20230816T124927:
  Server Name            : srv1
  System Id              : 7267890769615684829
  Status                 : DONE
  PostgreSQL Version     : 150004
  PGDATA directory       : /var/lib/pgsql/15/data

  Base backup information:
    Disk usage           : 98.4 MiB (114.4 MiB with WALs)
    Incremental size     : 98.4 MiB (-0.00%)
    Timeline             : 1
    Begin WAL            : 00000001000000000000000B
    End WAL              : 00000001000000000000000B
    WAL number           : 1
    Begin time           : 2023-08-16 12:49:27.523637+00:00
    End time             : 2023-08-16 12:49:31.025359+00:00
    Copy time            : 2 seconds
    Estimated throughput : 44.6 MiB/s
    Begin Offset         : 40
    End Offset           : 312
    Begin LSN            : 0/B000028
    End LSN              : 0/B000138

  WAL information:
    No of files          : 0
    Disk usage           : 0 B
    Last available       : 00000001000000000000000B

  Catalog information:
    Retention Policy     : VALID
    Previous Backup      : - (this is the oldest base backup)
    Next Backup          : - (this is the latest base backup)

Récupérer le End Time (2023-08-16 12:49:31)

La commande barman list-files indique les fichiers nécessaires pour restaurer à partir de cette sauvegarde particulière.

barman@barman:~$ barman list-files srv1

Test du backup

Depuis le serveur srv1

Supprimer les données de la table t1 dans la base de données mydb :

postgres@srv1:~$ psql -d mydb -c 'SELECT * FROM t1;'
   c1
---------
       1
       2
       3
       4
       5
...
postgres@srv1:~$ psql -d mydb -c 'TRUNCATE t1;'
TRUNCATE TABLE
postgres@srv1:~$ psql -d mydb -c 'SELECT * FROM t1;'
 c1
----
(0 rows)

Depuis le serveur srv1

Stopper le serveur PostgreSQL :

[root@srv1 ~]# systemctl stop postgresql-11.service

Depuis le serveur barman

Restaurer la sauvegarde en partant de la date et l’heure souhaité (en partant du End Time 2023-08-16 12:49:31) :

barman@barman:~$ barman recover --target-time "2023-08-16 12:49:32.025359+00:00" --remote-ssh-command "ssh postgres@srv1.lan" srv1 20230816T124927 /var/lib/pgsql/15/data
Starting remote restore for server srv1 using backup 20230816T124927
Destination directory: /var/lib/pgsql/15/data
Remote command: ssh postgres@srv1.lan
Doing PITR. Recovery target time: '2023-08-16 12:49:32.025359+00:00'
Using safe horizon time for smart rsync copy: 2023-08-16 12:49:27.523637+00:00
Copying the base backup.
Copying required WAL segments.
Generating recovery configuration
Identify dangerous settings in destination directory.

IMPORTANT
These settings have been modified to prevent data losses

postgresql.conf line 256: archive_command = false

Recovery completed (start time: 2023-08-16 12:56:37.434681+00:00, elapsed time: 3 seconds)
Your PostgreSQL server has been successfully prepared for recovery!

Démarrer le serveur :

[root@srv1 ~]# systemctl start postgresql-15.service

Vérifier que les données sont réstaurées :

postgres@srv1:~$ psql -d mydb -c 'SELECT * FROM t1;'
postgres@srv1:~$ psql -d mydb -c 'SELECT * FROM t1;'
   c1
---------
       1
       2
       3
       4
       5