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 .