Barman : Backup and recovery manager for PostgreSQL

Barman est un outil d’administration développé par 2ndQuadrant, permettant le backup et la restauration PITR d’instances PostgreSQL complètes, comme par exemple démarrer un serveur de test restauré dans l’état d’une date précise, ou encore le montage d’un read replica.

Prérequis :

  • 1 serveur master pgsql
  • 1 serveur de backup (barman)
  • 1 serveur slave pour la restauration
  • Des accès au user postgres et à la replication (en trust ip côté pg_hba) et ssh (avec clef) sont nécessaires pour que barman puisse accéder à PSQL et au filesysteme du serveur. Cela lui permet d’effectuer les backups, et de pousser les wals lors d’une restauration.
  • Le serveur master doit, de son coté, pouvoir se connecter à la machine barman pour l’archivage continu des wals (ssh avec clef également).
  • Les wals stockés sur le serveur de backup sont ensuite compressés, puis réutilisés avec un systeme de liens symboliques afin de reduire l’espace utilisé par l’archivage.

Pour cela il faut ajouter ceci à la configuration de barman :

/etc/barman.conf
compression = gzip
reuse_backup = link
  • Enfin, le serveur de restauration doit avoir la même version majeure de pgsql que le master.

Installation (repo psql officiel) et exemple de configuration

apt-get install postgresql-client-9.5
apt-get install barman
/etc/barman.conf
[barman]
barman_home = /space/barman
barman_user = barman
log_file = /space/logs/barman/barman.log
compression = gzip
reuse_backup = link
minimum_redundancy = 1
immediate_checkpoint = true
basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS
[main]
description = "serveur_master_pgsql"
ssh_command = ssh postgres@serveur_master_pgsql
conninfo = host=serveur_master_pgsql user=postgres
incoming_wals_directory = /space/barman/wal/master
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

Accès

Dans le pg_hba.conf du serveur master :

host all all $IP_machine_barman trust

Archivage des WAL

Dans /etc/postgresql/9.5/main/postgresql.conf sur le master :

postgresql.conf
wal_level = hot_standby # minimal, archive, or hot_standbyh
archive_mode = on # allows archiving to be done
archive_command = 'rsync -a %p barman@barmanpp-01:/space/wal/incoming/%f' # command to use to archive a logfile segment

Une fois le serveur master redémarré avec l’archive_command, celui-ci va la lancer à chaque création de wals.

Check

Une fois la configuration effectuée, il faut checker le bon fonctionnement :

barman@barmanpp-01:~$ barman check main
     Server main:
     PostgreSQL: OK
     superuser: OK
     wal_level: OK
     directories: OK
     retention policy settings: OK
     backup maximum age: OK (interval provided: 1 day, latest backup age: 1 minute)
     compression settings: OK
     failed backups: OK (there are 0 failed backups)
     minimum redundancy requirements: OK (have 1 backups, expected at least 1)
     ssh: OK (PostgreSQL server)
     not in recovery: OK
     archive_mode: OK
     archive_command: OK
     continuous archiving: OK
     archiver errors: OK

Backup

Lancement d’un backup :

barman@barmanpp-01:~$ barman backup main
Starting backup for server main in /var/lib/barman/main/base/20160609T110842
Backup start at xlog location: 0/31000028 (000000010000000000000031, 00000028)
Copying files.
Copy done.
Asking PostgreSQL server to finalize the backup.
Backup size: 301.5 MiB. Actual size on disk: 253.4 MiB (-15.93% deduplication ratio).
Backup end at xlog location: 0/31000130 (000000010000000000000031, 00000130)
Backup completed
Processing xlog segments from file archival for main
000000010000000000000030
000000010000000000000031
000000010000000000000031.00000028.backup
barman@barmanpp-01:~$

Lister les backups :

barman@barmanpp-01:~$ barman list-backup main
main 20160609T110842 - Thu Jun 9 09:08:47 2016 - Size: 301.5 MiB - WAL Size: 0 B
main 20160601T131241 - Wed Jun 1 11:12:43 2016 - Size: 301.5 MiB - WAL Size: 193.5 KiB

Voir le contenu d’un backup, ici le dernier :

barman@barmanpp-01:~$ barman show-backup main latest
Backup 20160609T110842:
    Server Name : main
    Status : DONE
    PostgreSQL Version : 90503
    PGDATA directory : /space/postgresql/9.5/main
Base backup information:
    Disk usage : 301.5 MiB (301.5 MiB with WALs)
    Incremental size : 253.4 MiB (-15.93%)
    Timeline : 1
    Begin WAL : 000000010000000000000031
    End WAL : 000000010000000000000031
    WAL number : 1
    WAL compression ratio: 99.84%
    Begin time : 2016-06-09 09:08:42.303602+00:00
    End time : 2016-06-09 09:08:47.477281+00:00
    Begin Offset : 40
    End Offset : 304
    Begin XLOG : 0/31000028
    End XLOG : 0/31000130
WAL information:
    No of files : 0
    Disk usage : 0 B
    Last available : 000000010000000000000031
Catalog information:
    Retention Policy : VALID
    Previous Backup : 20160601T131241
    Next Backup : - (this is the latest base backup)
barman@barmanpp-01:~$

Il suffit de préciser l’ID du backup à la place de latest pour voir un backup en particulier.

Restauration

Barman se connecte sur la machine cible, effectue un rm de tout le working directory de Postgres, puis y pousse les datas, et les wals nécessaires. La machine cible est soumise aux même prérequis que la machine master au niveau des accès PG et SSH.

La restauration est effectuée avec la commande recover :

barman@barmanpp-01:~$ barman recover --target-time "2016-06-01 11:12:41.338590+00:00" \
--remote-ssh-command "ssh postgres@bddpp-02b" main 20160601T131241 /space/postgresql/9.5/main/

Starting remote restore for server main using backup 20160601T131241
Destination directory: /space/postgresql/9.5/main/
Doing PITR. Recovery target time: '2016-06-01 11:12:41.338590+00:00'
Copying the base backup.
Copying required WAL segments.
Generating recovery.conf
Identify dangerous settings in destination directory.

IMPORTANT
These settings have been modified to prevent data losses postgresql.conf line 192: archive_command = false
WARNING 
You are required to review the following options as potentially dangerous 
postgresql.conf line 42: data_directory = '/space/postgresql/9.5/main' # use data in another directory
postgresql.conf line 44: hba_file = '/etc/postgresql/9.5/main/pg_hba.conf' # host-based authentication file
postgresql.conf line 46: ident_file = '/etc/postgresql/9.5/main/pg_ident.conf' # ident configuration file
postgresql.conf line 50: external_pid_file = '/var/run/postgresql/9.5-main.pid' # write an extra PID file
postgresql.conf line 87: ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem' # (change requires restart)
postgresql.conf line 88: ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key' # (change requires restart)
Your PostgreSQL server has been successfully prepared for recovery!

Barman récupère, copie et renomme les fichiers de configuration en place sur la machine à restaurer, puis les scan, et remonte des warnings sur les options non standards, qu’il faut maintenant vérifier :

-rw-r--r-- 1 postgres postgres 21K Jun 29 13:07 postgresql.conf
-rw-r--r-- 1 postgres postgres 21K Jun 29 12:56 postgresql.conf.origin

Si tout est correct, il suffit de redémarrer pgsql, le recovery.conf est joué, pgsql démarre, c’est opérationnel.

Le recovery.conf est également généré, il sera exécuté au restart du service PostgreSQL :

restore_command = 'cp barman_xlog/%f %p'
recovery_end_command = 'rm -fr barman_xlog'
recovery_target_time = '2016-06-01 11:12:41.338590+00:00'

Ce fichier est ensuite renommé en recovery.done une fois exécuté.

En modifiant le recovery.conf, il est possible de remonter la réplication directement au démarrage de pgsql :

standby_mode = 'on'
primary_conninfo = 'user=user_replication password=passwor_replication host=master_pgsql \
 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
trigger_file = '/tmp/postgresql.trigger'
restore_command = 'ssh barman@barmanpp-01 barman get-wal bddpp-02a %f > %p'

Cela permet le montage très rapide d’un ou plusieurs read replica, en récupérant le delta de wals manquants pour le montage de la réplication depuis le serveur d’archivage.

Conclusion

Barman est un outil vraiment pratique, avec une vraie politique de gestions des archives, et qui permet, en plus, de ne pas repasser par un pg_base_backup en cas de failover pour remonter un cluster master-slave.

Il peut également restaurer un serveur dans son état à une date et heure précise, ce qui est impossible avec un pg_dump sans rejouer les wals à la main.

Son intégration est prévue dans une des prochaines releases de PostgreSQL.

 

Pour aller plus loin : Documentation officielle de Barman

Article rédigé par Arnaud Bazin – Architecte Sénior .