• 27 juillet 2016

    Barman : Backup And Recovery Manager for PostgreSQL

    logo1

    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 chez Oxalide.

     

Newsletter

Inscrivez-vous et tenez vous au courant de l’actualité Oxalide