Sauvegarde distante
Une architecture simple et efficace
Cette page détaille la mise en place d'une sauvegarde locale d'un cluster PostgreSQL avec Barman mais cet outil sous licence GPL édité par 2ndQuadrant est plutôt conçu pour crééer un environnement de sauvegarde centralisé et donc réaliser des sauvegardes distantes.
Nous allons reprendre cette architecture proposée par la documentation barman :
Différence par rapport à la sauvegarde locale, nous disposons cette fois de 2 serveurs :
- pgpr10 est un serveur Debian 10 Buster avec un cluster PostgreSQL 10
- bapr est également un serveur Debian Buster, il servira de serveur Barman version 2.3
Tout d'abord, installation de barman-cli, barman et échange de clés ssh entre les utilisateurs barman et postgres :
-- serveur pgpr10
id
uid=0(root) gid=0(root) groupes=0(root)
passwd postgres
apt-get install barman-cli
-- serveur bapr
id
uid=0(root) gid=0(root) groupes=0(root)
apt-get install barman
passwd barman
su - barman
ssh-keygen
ssh-copy-id postgres@pgpr10
-- serveur pgpr10
su - postgres
ssh-keygen
ssh-copy-id barman@bapr
-- serveur pgpr10
id
uid=0(root) gid=0(root) groupes=0(root)
passwd -d postgres
-- serveur bapr
id
uid=0(root) gid=0(root) groupes=0(root)
passwd -d barman
A présent, paramétrage du streaming et de l'archivage des WAL :
-- serveur pgpr10
id
uid=108(postgres) gid=114(postgres) groupes=114(postgres),113(ssl-cert)
psql
select version();
version
--------------------------------------------------------------------------------------------------------
PostgreSQL 10.2 (Debian 10.2-1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 7.3.0-1) 7.3.0, 64-bit
(1 ligne)
show wal_level;
wal_level
-----------
replica
(1 ligne)
show max_replication_slots;
max_replication_slots
-----------------------
10
(1 ligne)
show max_wal_senders;
max_wal_senders
-----------------
10
(1 ligne)
show archive_command;
archive_command
-----------------
(disabled)
(1 ligne)
alter system set archive_command = 'rsync -a %p barman@bapr:/var/lib/barman/apptra001/incoming/%f';
ALTER SYSTEM
show archive_mode;
archive_mode
--------------
off
(1 ligne)
alter system set archive_mode=on;
ALTER SYSTEM
show listen_addresses;
listen_addresses
------------------
localhost
(1 ligne)
alter system set listen_addresses='192.168.56.220';
ALTER SYSTEM
\q
exit
pg_ctlcluster 10 apptra001 restart
En dehors de archive_command envoyant les fichiers WAL archivés vers bapr au lieu de localhost et de l'écoute sur l'adressse IPv4 logique de la machine, rien à signaler par rapport à la sauvegarde locale.
Il faut disposer d'un superutilisateur autorisé notamment à transmettre les informations WAL. Nous pourrions utiliser postgres mais nous allons créer un utilisateur dédié appelé remotesuper en musclant sa méthode d'authentification au passage :
-- serveur pgpr10
su - postgres
psql
set password_encryption='SCRAM-SHA-256';
SET
create role remotesuper with login superuser password 'RJoindaAimablDefndersmyHckgrp98';
CREATE ROLE
\du
Liste des rôles
Nom du rôle | Attributs | Membre de
-------------+---------------------------------------------------------------------------------+-----------
postgres | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}
remotesuper | Superutilisateur
Autorisation des connexions de l'utilisateur remotesuper à la base postgres et pour la réplication après authentification par mot de passe (uniquement par la méthode scram-sha-256) depuis le serveur bapr (adresse ipv4 logique 192.168.56.222) dans /etc/postgresql/10/apptra001/pg_hba.conf :
-- serveur pgpr10
vi /etc/postgresql/10/apptra001/pg_hba.conf
host postgres remotesuper 192.168.56.222/32 scram-sha-256
host replication remotesuper 192.168.56.222/32 scram-sha-256
pg_ctlcluster 10 apptra001 reload
C'est fini pour la partie "postgres". À présent la partie "barman" en commançant par le stockage du mot de passe de remotesuper dans un fichier dédié à l'accès restreint:
-- serveur bapr
id
uid=108(barman) gid=113(barman) groupes=113(barman)
vi /var/lib/barman/.pgpass
pgpr10:5432:postgres:remotesuper:RJoindaAimablDefndersmyHckgrp98
pgpr10:5432:replication:remotesuper:RJoindaAimablDefndersmyHckgrp98
chmod 600 /var/lib/barman/.pgpass
Place à présent à la configuration de barman. Le fichier de configuraiton va être renseigné de manière à garantir une fenêtre de recover de 5 jours, c'est à dire qu'il sera toujours possible de faire revenir les bases du cluster en arrière de 5 jours avec ce que contient l’espace Barman. Avec une sauvegarde planifiée de manière hebdomadaire, le nombre de sauvegardes présentes en ligne sera au maximum de 2 :
-- serveur bapr
id
uid=0(root) gid=0(root) groupes=0(root)
vi /etc/barman.d/01-apptra001.conf
[apptra001]
description = "Sauvegarde apptra001"
ssh_command = ssh postgres@pgpr10
retention_policy = RECOVERY WINDOW OF 5 days
compression = gzip
reuse_backup = link
minimum_redundancy = 1
last_backup_maximum_age = '8 days'
recovery_options = 'get-wal'
conninfo = port=5432 host=pgpr10 user=remotesuper dbname=postgres
archiver = on
streaming_conninfo = port=5432 host=pgpr10 user=remotesuper
streaming_archiver = on
streaming_archiver_name = barman_receive_wal
slot_name = barman
chown barman /etc/barman.d/01-apptra001.conf
su - barman
barman receive-wal --create-slot apptra001
Creating physical replication slot 'barman' on server 'apptra001'
Replication slot 'barman' created
barman check apptra001
...
barman backup apptra001
barman check apptra001
Server apptra001:
PostgreSQL: OK
is_superuser: OK
PostgreSQL streaming: OK
wal_level: OK
replication slot: OK
directories: OK
retention policy settings: OK
backup maximum age: OK (interval provided: 8 days, latest backup age: 56 seconds)
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
pg_receivexlog: OK
pg_receivexlog compatible: OK
receive-wal running: OK
archiver errors: OK
crontab -e
0 20 * * 0 barman backup all 2>&1 > /dev/null
Tout est OK. En fait, le slot n'est pas réellement nécessaire puisque nous archivons de toute façon chaque WAL via rsync/ssh mais il ne fait pas de mal.
Le RPO (recovery point objective, perte de données maximale admissible) avec une telle architecture est proche de 0. Nous pouvons toujours perdre quelques transactions validées car nous n'attendons pas la confirmation par Barman qu'il a bien pris en compte une information de journalisation pour considérer qu'elle est validée.
Il serait possible d'imposer le streaming WAL synchrone vers Barman afin de passer à un RPO de 0 mais je le déconseille pour l'instant. Il est en effet préférable de disposer d'au moins 2 destinations pour le streaming WAL synchrone sous peine de compromettre la disponibilité. De plus, activer le streaming WAL synchrone peut avoir un impact sur les performances donc il faut évaluer le besoin et les moyens à attribuer au cas par cas.
Mise à jour : 13/02/2018