Bonjour, je suis Alexander Nikitin, administrateur système en chef du groupe BARS. Dans cet article, je souhaite vous présenter l'outil pg_probackup .
Pg_probackup est un développement de Postgres Professional qui permet de faire des copies de sauvegarde du SGBD PostgreSQL. Contrairement à l'utilitaire standard pg_basebackup, cet outil vous permet de créer des sauvegardes incrémentielles au niveau du bloc de données (8 Ko par défaut), de valider les sauvegardes et le SGBD, de définir des politiques de stockage, et bien plus encore.
Dans cet article, je n'ai pas l'intention de décrire tous les aspects possibles de l'utilisation de pg_probackup, je veux juste expliquer comment vous pouvez utiliser cet outil dans votre travail.
Les cas d'utilisation suivants seront considérés:
- wal-
1
Étant donné: Nous avons deux serveurs (OS CentOS 7), sur le premier nous avons notre base de données (hostname srv_db1, user postgres, PostgreSQL 12.4 installé), et sur le second nous stockerons des sauvegardes (hostname srv_bkp, user backup_user).
Vous devez configurer la sauvegarde pour que les copies du cluster PostgreSQL soient stockées sur le serveur srv_bkp.
Solution:
pg_probackup peut fonctionner via ssh, en lançant des agents sur un hôte distant qui utilisent une connexion ssh comme canal de communication et de transport. Par conséquent, vous devez vous assurer que l'utilisateur de sauvegarde sur l'hôte srv_bkp peut se connecter à l'utilisateur postgres sur l'hôte srv_db1.
1) Connectez-vous à srv_bkp avec backup_user et exécutez les commandes suivantes:
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
Activez le mode paranoïaque et éditez le fichier ~ / .ssh / allowed_keys sur le serveur srv_db1
Avant la ligne avec les clés, insérez ce qui suit:
command="pg_probackup-12 agent"
Vous devriez donc vous retrouver avec quelque chose comme ça:
command="pg_probackup-12 agent" ssh-rsa AAAA....
Par cela, nous disons que rien d'autre que "l'agent pg_probackup-12" ne peut être lancé via SSH (vous pouvez en savoir plus ici ).
2) Nous installons pg_probackup sur les deux machines (dans l'exemple, nous travaillons sur CentOS, mais pour les autres distributions, le processus d'installation est décrit dans la documentation ):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
La dernière version disponible de pg_probackup sera installée au moment de la rédaction de cet article - 2.4.2.
3) créez un alias sur srv_bkp (ce n'est pas nécessaire, mais c'est plus pratique) et définissez une variable contenant le chemin vers le répertoire avec les sauvegardes (après avoir créé ce répertoire):
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
charger le profil
. .bash_profile
4) sur srv_bkp, initialisez le répertoire de sauvegarde et ajoutez une nouvelle instance:
pg_probackup init
Ajoutez l'instance PostgreSQL au répertoire, donnez-lui le nom db1, spécifiez les paramètres de connexion ssh - hôte, nom d'utilisateur et chemin vers PGDATA.
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
Si la ligne apparaît
INFO: Instance 'db1' successfully inited
L'initialisation a donc réussi.
Définissons une politique de rétention des sauvegardes:
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
La politique qui en résulte se résume à ce qui suit:
il est nécessaire de conserver toutes les sauvegardes sous 7 jours,
tandis que le nombre de sauvegardes complètes doit être d'au moins deux
5) Pour créer des sauvegardes, vous devez vous connecter au SGBD, nous créons donc une base de données dans le cluster PostgreSQL à laquelle la connexion aura lieu pour gérer le processus de sauvegarde (d'un point de vue sécurité, c'est mieux que de se connecter à une base de données produit), et aussi modifier les paramètres de la base de données:
$ createdb backupdb
rejoindre une nouvelle base de données
psql -d backupdb
créer un rôle de base de données au nom duquel le processus de sauvegarde sera géré:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
Faisons attention au paramètre listen_addresses:
show listen_addresses;
si localhost, changez en *
alter system set listen_addresses='*';
Si vous avez changé listen_addresses, PostgreSQL doit être redémarré.
Voyons où nous avons localisé le fichier pg_hba.conf
psql –c 'show hba_file'
Ajoutez les règles suivantes à pg_hba.conf:
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
Nous relisons la configuration:
psql -c 'select pg_reload_conf()'
Nous vérifions s'il y a eu des fautes de frappe:
psql -c 'select * from pg_hba_file_rules'
Sur srv_bkp, dans le répertoire personnel de l'utilisateur backup_user, créez un fichier dans lequel nous écrivons le nom du serveur ou son adresse IP, port, nom de base de données, nom d'utilisateur et mot de passe. Ce fichier est nécessaire pour que le mot de passe soit automatiquement saisi lors de la création d'une copie de sauvegarde.
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
Définissez les droits d'accès nécessaires à ce fichier
chmod 600 ~/.pgpass
Et créez la première sauvegarde:
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
Si nous avons tout fait correctement, quelque chose comme celui-ci apparaîtra à l'écran:
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
Faites attention à l'avertissement émis par pg_probackup - la vérification de la somme de contrôle n'est pas activée sur notre cluster, il ne peut donc pas vérifier l'exactitude des blocs de données. En d'autres termes, vous n'êtes pas protégé du fait que de mauvais blocs de données n'entrent pas dans la sauvegarde.
Voyons les paramètres actuels:
pg_probackup show-config --instance db1
Maintenant, raccourcissons la commande de création de sauvegardes - nous écrirons certains des paramètres dans la configuration de l'instance db1:
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
Comparons: comment c'était et comment c'est devenu
pg_probackup show-config --instance db1
C'était | Est devenu |
---|---|
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Paramètres de compression compress-algorithm = none compress-level = 1 # Paramètres d'accès à distance remote-proto = ssh remote-host = srv_db1 remote-user = postgres |
Faisons une copie incrémentielle en mode DELTA sans spécifier les paramètres définis dans la configuration:
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
Voyons ce que nous avons
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
Il y a beaucoup d'informations, une description détaillée peut être trouvée dans la documentation , néanmoins, attardons-nous sur certains points:
Temps de récupération - le temps minimum pour lequel vous pouvez récupérer en utilisant ce
mode de sauvegarde - le mode dans lequel la copie a été faite, actuellement 4 sont disponibles modes - un mode WAL complet (FULL) et trois incrémental (PAGE, DELTA et PTRACK)
- les options suivantes sont possibles ici - STREAM et ARCHIVE. Les copies créées en mode STREAM contiennent tous les fichiers nécessaires à la restauration à un état WAL cohérent. Pour que ce mode fonctionne, il était nécessaire de donner le rôle REPLICATION à notre utilisateur de sauvegarde. Le mode ARCHIVE suppose que nous avons configuré l'archivage WAL, puis les fichiers WAL nécessaires seront situés dans le chemin connu de pg_probackup.
Statut - il y a beaucoup de statuts, tous sont décrits dans la documentation, mais si nous voyons quelque chose de différent de OK, alors il est logique d'aller dans la documentation et de voir ce qui ne va pas.
Comme vous l'avez peut-être deviné, nous pouvons analyser la sortie de la commande pg_probackup show et obtenir le statut de la dernière sauvegarde effectuée, la traiter et l'envoyer au système de surveillance, et là, nous pouvons déjà définir les règles par lesquelles la notification des employés responsables du SGBD sera déclenchée.
Créons un script bkp_base.sh qui démarrera la sauvegarde et enverra le résultat au système de surveillance:
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
Nous écrivons un appel au script résultant dans crontab, par exemple, vous pouvez définir le calendrier suivant:
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
Ceci termine la solution de la première tâche - nous avons configuré la sauvegarde, défini la politique de rétention de copie. Nous envoyons également l'état des sauvegardes au système de surveillance.
Dans la partie suivante , nous examinerons la création d'une archive de fichiers wal et la création de sauvegardes d'archives.