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é surpg_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 :
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¶
Debian et ses dérivés¶
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¶
Depuis le serveur srv1.lan¶
Mise en place de la sauvegarde et de l’archivage avec Rsync¶
Installer et configurer PostgreSQL¶
Depuis le serveur srv1¶
Installer PostgreSQL 15 :
Ajouter la ligne suivante dans le fichier pg_hba.conf
:
Dans le fichier postgresql.conf
:
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 :
Installer le paquet 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¶
Depuis le serveur srv1¶
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 sauvegardeconfiguration_files_directory = /etc/barman.d
: spécifie le chemin du répertoire où barman va charger les fichiers de configurationsbarman_home = /var/lib/barman
: spécifie le répertoire home de l’utilisateur barmanlog_file = /var/log/barman/barman.log
: spécifie le chemin des logs barmanimmediate_checkpoint = true
: lorsque ce paramètre est à true, le point de contrôle exécuté par la fonctionpg_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 :
[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 :
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/'
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 :
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
:
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.
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 'TRUNCATE t1;'
TRUNCATE TABLE
postgres@srv1:~$ psql -d mydb -c 'SELECT * FROM t1;'
c1
----
(0 rows)
Depuis le serveur srv1¶
Stopper le serveur PostgreSQL :
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 :
Vérifier que les données sont réstaurées :