background success stories

Barman: sauvegarde/restauration des bases PostgreSQL

Description

  • BARMAN (Backup and Recovery Manager) est un outil open-source pour la gestion des sauvegardes et des restaurations des bases PostgreSQL.
  • L’outil permet de gérer à distance la sauvegarde de plusieurs serveurs de bases de données PostgreSQL.
  • La documentation de l’outil se trouve ici: http://docs.pgbarman.org/release/2.1/.

Architecture

  • BARMAN est généralement installé sur un serveur dédié, à partir duquel on effectue les sauvegardes des serveurs de bases de données distants.
  • BARMAN peut être configuré en mode streaming ou en mode rsync/ssh.
    • Le mode rsync/ssh est le mode traditionnel, qui utilise ssh et rsync pour effectuer les sauvegardes à distance.
    • Le mode streaming s’appuie sur le mécanisme de streaming replication de PostgreSQL, via pg_basebackup.
    • Seul le mode rsync/ssh permet à ce jour de bénéficier des fonctionnalités avancées de barman type sauvegardes incrémentales et compression réseau.
  • BARMAN gère aussi l’archivage des WAL:
    • soit via la méthode traditionnelle, en s’appuyant sur le paramètre PostgreSQL archive_command.
    • soit via le WAL streaming, qui permet de réduire considérablement le RPO.

Ci-dessous des graphes d’architecture possible:

  • Backup via streaming protocol
  • Backup via rsync/ssh
  • Backup via rsync/ssh avec wal streaming en plus

 Installation

Pour une installation sur Linux Red Hat, il faut, en étant connecté root:

  • installer le rpm Extra Packages Enterprise Linux (EPEL) repository.
  • installer le rpm barman; cela va notamment créer un user « barman » sur le serveur de backup.

Configuration

Il existe deux types de fichiers de configuration Barman.

  • Le fichier de configuration principal /etc/barman.conf, qui contient des paramètres généraux.
  • Les fichiers de configuration qui contiennent des paramètres spécifiques à chaque serveur PostgreSQL sauvegardé par Barman; ils sont stockés dans /etc/barman.d et se nomment <nomDeServeur>.conf.
  • Il est également possible de stocker les paramètres spécifiques à chaque serveur dans le fichier de configuration principal /etc/barman.conf.

Exemple complet de sauvegarde via rsync/ssh

  • Le serveur barman se trouve sur le serveur vs-ol6-lpgsql01
  • Le serveur PostgreSQL se trouve sur le serveur vs-ol6-pgsql02

 

Connexion

  • Pour la connexion entre le serveur barman et le serveur PostgreSQL, on crée sur l’instance PostgreSQL un compte barman:
postgres@vs-ol6-pgsql02:POSTGRESQL-5432 /pgsql/9.3>createuser -s -P barman"
Enter password for new role:
  • Côté serveur barman, on ajoute dans le fichier .pgpass une entrée pour le compte barman, au format: « hostname:port:database:username:password« :
-bash-4.1$ cat ~barman/.pgpass
vs-ol6-pgsql02:5432:postgres:barman:barman
-bash-4.1$ chmod 600 ~barman/.pgpass
  • Côté serveur PostgreSQL, on ajoute la bonne entrée dans le fichier pg_hba.conf, puis on redémarre l’instance.
postgres@vs-ol6-pgsql02:POSTGRESQL-5432 /pgsql/9.3/inst01/data>grep barman /pgsql/9.3/inst01/data/pg_hba.conf
host    all             barman          10.72.11.21/32          md5
postgres@vs-ol6-pgsql02:POSTGRESQL-5432 /pgsql/9.3/inst01/data>pg_restart
waiting for server to shut down.... done
server stopped
server starting

 

Echange de clés ssh

On configure l’échange de clés ssh entre le serveur barman (pour le compte barman) et le serveur PostgreSQL (pour le compte postgres), pour pouvoir se connecter via ssh sans mot de passe, dans les deux sens.

 

Fichiers de configuration

  • Sur le serveur barman, on crée le fichier de configuration avec les bons paramètres:
[root@vs-ol6-lpgsql01 vs-ol6-pgsql02]# cat /etc/barman.d/vs-ol6-pgsql02.conf
[vs-ol6-pgsql02]
description =  "PostgreSQL server 02"
conninfo = host=vs-ol6-pgsql02 user=barman dbname=postgres
backup_method = rsync
ssh_command = ssh postgres@vs-ol6-pgsql02
  • On vérifie que le paramètre configuration_files_directory est décommenté dans /etc/barman.conf:
-bash-4.1$ grep configuration_files_directory /etc/barman.conf
configuration_files_directory = /etc/barman.d

 

Sauvegarde des WAL

  • Sur le serveur barman, on vérifie quel est le répertoire destinataire des WAL.
-bash-4.1$ barman show-server vs-ol6-pgsql02 |grep incoming_wals_directory
        incoming_wals_directory: /var/lib/barman/vs-ol6-pgsql02/incoming
  • Sur le serveur PostgreSQL, on modifie le paramètre archive_command en conséquence et on redémarre pour prise en compte.
postgres@vs-ol6-pgsql02:POSTGRESQL-5432 /pgsql/9.3>grep archive_command /pgsql/9.3/inst01/data/postgresql.conf
archive_command = 'rsync -a %p barman@vs-ol6-lpgsql01:/var/lib/barman/vs-ol6-pgsql02/incoming/%f'
postgres@vs-ol6-pgsql02:POSTGRESQL-5432 /pgsql/9.3/inst01/data>pg_restart
waiting for server to shut down.... done
server stopped
server starting
  • Sur le serveur barman, on teste un switch de WAL.
-bash-4.1$ barman switch-xlog --force vs-ol6-pgsql02
Switch to 00000001000000010000003E for server 'vs-ol6-pgsql02'
-bash-4.1$ ls -l /var/lib/barman/vs-ol6-pgsql02/incoming/
total 16384
-rw------- 1 barman barman 16777216 Feb 24 14:42 00000001000000010000003D

 

Sauvegarde de l’instance

  • Sur le serveur barman, on vérifie que la configuration est opérationnelle.
-bash-4.1$ barman check vs-ol6-pgsql02
Server vs-ol6-pgsql02:
        PostgreSQL: OK
        superuser: OK
        wal_level: OK
        directories: OK
        retention policy settings: OK
        backup maximum age: OK (no last_backup_maximum_age provided)
        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)
        not in recovery: OK
        archive_mode: OK
        archive_command: OK
        archiver errors: OK
  • Sur le serveur barman, on lance un backup complet.
-bash-4.1$ barman backup vs-ol6-pgsql02
Starting backup for server vs-ol6-pgsql02 in /var/lib/barman/vs-ol6-pgsql02/base/20170224T144343
Backup start at xlog location: 1/3E000028 (00000001000000010000003E, 00000028)
This is the first backup for server vs-ol6-pgsql02
WAL segments preceding the current backup have been found:
        00000001000000010000003A from server vs-ol6-pgsql02 has been removed
        00000001000000010000003B from server vs-ol6-pgsql02 has been removed
        00000001000000010000003C from server vs-ol6-pgsql02 has been removed
        00000001000000010000003D from server vs-ol6-pgsql02 has been removed
Copying files.
Copy done.
Asking PostgreSQL server to finalize the backup.
Backup size: 177.8 MiB
Backup end at xlog location: 1/3E0000F0 (00000001000000010000003E, 000000F0)
Backup completed
Processing xlog segments from file archival for vs-ol6-pgsql02
        00000001000000010000003E
        00000001000000010000003E.00000028.backup