Configurer des sauvegardes incrémentales avec PostgreSql - Mise en place (Partie 2)

Trinité ZINSOUTrinité ZINSOU
10 min read

🧭 Introduction

Dans la première partie, on a posé les bases : comprendre les différents types de sauvegardes, le rôle crucial des fichiers WAL et ce que propose Barman. Maintenant, il est temps de passer à l’action.

Dans ce guide pratique, on va configurer PostgreSQL et Barman pas à pas pour mettre en place un système de sauvegarde incrémentale robuste et automatisé. L’objectif est simple : que tu puisses le reproduire dans ton propre environnement.

ℹ️ L'environnement de référence utilisé dans cet article est Ubuntu

Dans la suite nous utiliserons deux serveurs Ubuntu 22, qu’on appellera pg et barman pour postgres et barman respectivements et d’ip respectifs 192.168.58.11 et 192.168.58.12

Prêt ? On entre dans le vif du sujet. 👇

🤔 Quelle stratégie de sauvegarde choisir avec Barman ?

Le choix de la stratégie de sauvegarde est un élément crucial dans la mise en place d’un système fiable. Barman prend en charge deux grandes méthodes :

  • Via rsync : une méthode classique utilisant SSH pour transférer les fichiers du serveur PostgreSQL vers le serveur Barman.

  • Via pg_basebackup : une méthode moderne qui s’appuie sur le protocole de réplication en streaming natif de PostgreSQL.

Le streaming via pg_basebackup ne permet les sauvegardes incrémentales qu’à partir de la version 17 de Postgres, nous allons donc dans la suite voir comment faire nos configurations pour effectuer nos sauvegardes via rsync.

La figure ci dessous illustre comment mettre en place les sauvegardes incrémentales avec rsync.

Il nous faut donc pour réussir notre configuration:

  • Une connexion standard à PostgreSQL (1)
    Utilisée par Barman pour les opérations de gestion, de coordination et de supervision. Cette connexion se fait généralement via un accès réseau classique au port PostgreSQL, souvent en TCP/IP.

  • Connexion SSH pour les sauvegardes de base (2)
    Puisque nous avons décidé d’utiliser rsync, Barman doit pouvoir utiliser SSH pour se connecter au serveur PostgreSQL. L’utilisateur barman (sur le serveur Barman) doit se connecter en tant que postgres (sur le serveur PostgreSQL) et accéder aux fichiers nécessaires à la sauvegarde.

  • Connexion SSH pour l’archivage des fichiers WAL (3)
    Pour l’archivage des WALs, une configuration appelée archive_command de postgresql est activé(on en parle dans la suite 😉), et là le serveur PostgreSQL doit initier une connexion SSH. L’utilisateur postgres (du serveur PostgreSQL) va se connecter en SSH au serveur Barman, en tant qu’utilisateur barman, afin d’envoyer les fichiers WAL au bon endroit.

🔑 Configurations SSH entre Barman et PostgreSQL

Pour permettre à Barman et PostgreSQL de communiquer de manière sécurisée et automatisée, il est essentiel de configurer une authentification par clé SSH entre les deux serveurs. Cette étape garantit des transferts fiables, sans mot de passe, pour les sauvegardes et l’archivage des fichiers WAL.

On va donc générer des paires de clés ssh en tant qu’utilisateurs postgres et barman à échanger entre nos différents serveurs.

  • Sur le serveur postgres:
su postgres
ssh-keygen -t rsa -b 2048
# fichier généré par default => /var/lib/postgresql/.ssh/id_rsa
ssh-copy-id -i /var/lib/postgresql/.ssh/id_rsa barman@192.168.58.12
  • Sur le serveur barman:
su barman
ssh-keygen -t rsa -b 2048
# fichier généré par default => /var/lib/barman/.ssh/id_rsa
ssh-copy-id -i /var/lib/barman/.ssh/id_rsa postgres@192.168.58.11

Cette étape nécessite de définir en amont pour les utilsateurs postgres et barman des mots de passe robustes.

🔧 Configuration détaillée de PostgreSQL pour les sauvegardes incrémentales (avec rsync)

Avant que Barman ne puisse faire son travail, il faut préparer PostgreSQL pour lui fournir ce dont il a besoin : les fichiers WAL (Write-Ahead Logs). Ces fichiers contenus dans le dossier /var/lib/postgresql/<version>/main/pg_wal/ contiennent un historique clair de toutes les écritures sur la base de données et sont essentiels pour effectuer des sauvegardes incrémentales.

Nous allons donc commencer par activer l’archivage WAL au niveau de notre serveur PostgreSQL.

🗂️ Activer l’archivage WAL dans postgresql.conf

Ouvre ton fichier postgresql.conf, généralement situé dans le répertoire principal de PostgreSQL (/etc/postgresql/<version>/main), et recherche la ligne

include_dir = 'conf.d' # include files ending in '.conf' from.

Grace à cette ligne, on peut créer dans le dossier conf.d du répertoire principal, un fichier archivage.conf pour porter nos configurations. Une fois le fichier crée ajoute ce contenu :

listen_addresses = '*'
wal_level = replica
archive_mode = on
archive_command = 'rsync -a %p barman@192.168.58.12:/var/lib/barman/pg/incoming/%f'
max_wal_senders = 3

Explications :

  • wal_level = replica : definit le niveau de journalisation minimal pour permettre les sauvegardes incrémentales.

  • archive_mode = on : active l’archivage des WAL.

  • archive_command : commande à exécuter à chaque rotation de logs expliqué dans la première partie de la série; ici on indique à PostgreSQL comment transférer chaque fichier WAL vers le serveur Barman en utilisant rsync.

  • max_wal_senders : nombre maximum de connexions pour envoyer des WAL à des clients (comme Barman).

Astuce : Vérifie que la commande rsync fonctionne en testant manuellement la copie d’un fichier entre les serveurs.

🔐 Autoriser les connexions Barman dans pg_hba.conf

Dans le fichier /etc/postgresql/<version>/main/pg_hba.conf, ajoute cette ligne pour autoriser l’utilisateur Barman à se connecter :

# Connexion pour les sauvegardes
host    replication     barman     192.168.58.12/32      md5

Ensuite assure-toi que l’utilisateur barman existe dans PostgreSQL, avec un mot de passe sécurisé :

createuser --superuser --replication -P barman

🚀 Redémarrer PostgreSQL

Une fois ces modifications faites, redémarre PostgreSQL pour qu’elles prennent effet :

sudo systemctl restart postgresql

🛠️ Configuration de Barman pour les sauvegardes incrémentales

Une fois PostgreSQL prêt à envoyer ses WAL, il est temps de préparer Barman pour recevoir, stocker et gérer les sauvegardes; notamment les incrémentales.

📁 Configuration du répertoire de sauvegarde

Par défaut, Barman stocke ses données dans le répertoire /var/lib/barman. Il faut créer un sous-répertoire pour chaque serveur PostgreSQL à sauvegarder.
Puisqu’on a deja installé barman sur le serveur exécute donc :

sudo mkdir -p /var/lib/barman/pg
sudo chown -R barman:barman /var/lib/barman/pg

Tu peux aussi personnaliser l’emplacement via le fichier de configuration.

🧾 Fichier de configuration barman.conf

Le fichier global est/etc/barman.conf et chaque serveur pourra avoir sa propre configuration dans /etc/barman.d/.

Voici un exemple de configuration minimale pour notre serveur nommé pg :

# fichier pg.conf
[pg]
description = "Serveur PostgreSQL principal"
conninfo = host=192.168.58.11 user=barman dbname=test_db
ssh_command = ssh postgres@192.168.58.11
backup_method = rsync
streaming_archiver = on
slot_name = barman

📌 Explications des options importantes :

  • conninfo : comment se connecter à PostgreSQL.

  • ssh_command : connexion SSH utilisée par rsync.

  • backup_method : rsync.

  • streaming_archiver = on : permet de récupérer les WAL en continu.

  • slot_name : nom du slot de réplication utilisé par Barman pour les WAL.

⚙️ Paramètres avancés utiles

Tu peux adapter la configuration à ton usage :

reuse_backup = link
retention_policy = RECOVERY WINDOW OF 7 DAYS
compression = gzip
  • reuse_backup = link : évite les duplications de fichiers lors des backups incrémentaux.

  • retention_policy : conserve les sauvegardes nécessaires pour restaurer jusqu’à 7 jours en arrière.

  • compression : compresse les sauvegardes pour gagner de l’espace disque.

Toutes les options de configuration sont détaillées sur la documentation officielle de Barmn

Afin que barman puisse se connecter via l'utilisateur spécifié à la base de données, nous devons ajouter le mot de passe que nous avons spécifié à la création de l’utilisateur barman au fichier .pgpass.

su barman
cat <<'EOF' >>~/.pgpass
mon_serveur:5432:test_db:barman:password
EOF
chmod 0600 ~/.pgpass

Chaque ligne de ce fichier doit etre au format

[db_hote]:[db_port]:[db_nom]:[db_user]:[db_password]

✅ Vérifier que tout fonctionne

Avant de lancer un backup, vérifie la connexion entre Barman et PostgreSQL; à cette étape tous les voyants doivent etre au vert 🕺💃 et tu dois avoir:

$ barman check pg
Server pg:
    PostgreSQL: OK
    is_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)
    systemid coherence: OK
    archive_mode: OK
    archive_command: OK
    continuous archiving: OK
    archiver errors: OK

Tu peux aussi à présent lancer ton premier test de sauvegarde, si tout se passe bien tu dois avoir:

$ barman backup pg
Starting the backup using the rsync-concurrent method for the pg server in /var/lib/barman/pg/base/20250413T113210
Backup start at LSN: 0/12000060 (000000010000000000000012, 00000060)
This is the first backup for the pg server
The WAL segments preceding the current backup were found:
        000000010000000000000000F from pg server has been removed
        0000000100000000000000010 from server pg has been removed
Starting backup via rsync/SSH for 20250413T113210
Completed copy (duration: 3 seconds)
This is the first backup for the server pg
Asking the PostgreSQL server to finalize the backup.
Backup size: 38.8 MiB. Actual disk size: 38.8 MiB (-0.00% deduplication ratio).
Backup end at LSN: 0/12000138 (00000001000000000000012, 00000138)
Backup completed (start time: 2025-04-13 11:32:10.136973, time elapsed: 5 seconds)
Processing xlog segments from file archiving for pg
        000000010000000000000011
        000000010000000000000012
        000000010000000000000012.00000060.backup

🔁 Automatiser les sauvegardes incrémentales avec Barman

Une fois Barman et PostgreSQL correctement configurés, il est essentiel d’automatiser les sauvegardes pour garantir la protection continue de vos données. Heureusement, Barman s’intègre facilement avec les outils classiques de planification de tâches, comme cron.

🕒 Planifier les sauvegardes avec cron

Pour déclencher automatiquement une sauvegarde, il suffit d’ajouter une tâche cron sur le serveur Barman. Par exemple, pour lancer une sauvegarde complète tous les jours à 2h du matin :

  1. Se connecter en tant que barman :
sudo -u barman crontab -e
  1. Ajouter la tâche cron dans cette crontab :
0 2 * * * barman backup pg

💡 Pensez à tester votre commande manuellement avant de l’automatiser, pour vérifier que tout fonctionne comme prévu.

📉 Astuces pour optimiser l’espace disque

Voici quelques conseils pour conserver vos sauvegardes tout en maîtrisant l’utilisation du stockage :

  • 🗃️ Compression des sauvegardes : Barman propose la compression automatique des fichiers; possible avec compression = gzip utilisée plus haut dans nos configurations:

  • 🧹 Suppression automatique des anciennes sauvegardes : utilisez la politique de rétention pour ne conserver que les sauvegardes nécessaires; possible avec retention_policy = RECOVERY WINDOW OF 7 DAYS aussi utilisé dans notre fichier pg.conf .

🔍 Surveillance et gestion des sauvegardes avec Barman

Une fois les sauvegardes en place, il est crucial de les surveiller et de gérer leur cycle de vie pour garantir leur efficacité. Barman fournit plusieurs outils pour cela, directement utilisables en ligne de commande.

✅ Vérifier l’état des sauvegardes

Barman dispose de plusieurs commandes utiles pour suivre l'état de vos sauvegardes et de vos serveurs.

🔧 Lister les sauvegardes disponibles

$ barman list-backup pg
pg 20250415T201754 - Tue Apr 15 20:17:58 2025 - Size: 54.9 MiB - WAL Size: 16.0 MiB
pg 20250415T201516 - Tue Apr 15 20:15:19 2025 - Size: 54.9 MiB - WAL Size: 48.0 MiB
pg 20250413T113210 - Sun Apr 13 11:32:14 2025 - Size: 54.8 MiB - WAL Size: 32.0 MiB

Cette commande affiche entre autre :

  • l’ID de chaque sauvegarde,

  • la date

  • le point de récupération possible (PITR)

📊 Vérifier l’état général du serveur

$ barman check nom_du_serveur

Cette commande fait un diagnostic complet de la configuration : connexions SSH, configuration PostgreSQL, accès aux répertoires de sauvegarde, etc.

Obtenir des détails sur une sauvegarde spécifique

barman show-backup nom_du_serveur ID_sauvegarde

Utile pour voir entre autre:

  • les chemins utilisés,

  • la taille de la sauvegarde,

  • les fichiers WAL associés,

  • les options activées.

🧯 Et en cas de problème ?

En cas d’échec de sauvegarde :

  • Lance barman check pour diagnostiquer.

  • Consulte les logs postgres et barman dans respectivement /var/log/postgresql et /var/log/barman/.

🏁 Conclusion : Garder le contrôle sur vos sauvegardes PostgreSQL

Dans cette seconde partie, nous avons plongé dans les aspects techniques essentiels pour éléborer une stratégie de sauvegarde incrémentale fiable avec Barman. De la configuration fine de PostgreSQL, à la mise en place des connexions sécurisées en passant par l’automatisation via cron et la surveillance proactive, chaque étape renforce la robustesse et la résilience de votre base de données.

Grâce à Barman, vous disposez d’un outil puissant, souple et open source, capable de répondre aux besoins des environnements de production les plus exigeants. Mais la maîtrise des sauvegardes ne s’arrête pas là.

Dans la prochaine partie, nous verrons comment restaurer efficacement une base de données PostgreSQL, notamment via le Point In Time Recovery (PITR), ainsi que des cas pratiques pour tester vos sauvegardes.

👉 Restez connectés pour aller jusqu’au bout de votre stratégie de sauvegarde PostgreSQL !

0
Subscribe to my newsletter

Read articles from Trinité ZINSOU directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Trinité ZINSOU
Trinité ZINSOU

I'm a Software Engineer, with +5 years of professional experience, I specialize in building software focusing on quality , improving integration and deployment, creating product documentation. I'm working currently in Bénin using, Js/React, Python/Django, DevOps skills and others, this list is not exhaustive