Vos données sont probablement les actifs les plus précieux de l'entreprise, vous devez donc avoir un plan de reprise après sinistre (DRP) pour éviter la perte de données en cas d'accident ou de panne matérielle. Une sauvegarde est la forme la plus simple de DR. Cela peut ne pas toujours être suffisant pour garantir un objectif de point de récupération (RPO) acceptable, mais c'est une bonne première approche. En outre, vous devez définir un objectif de temps de récupération (RTO) en fonction des besoins de votre entreprise. Il existe de nombreuses façons d'atteindre la valeur RTO, cela dépend des objectifs de l'entreprise.
Dans ce blog, nous verrons comment utiliser pgBackRest pour sauvegarder PostgreSQL et TimescaleDB et comment utiliser l'une des fonctionnalités les plus importantes de cet outil de sauvegarde, la combinaison de sauvegardes complètes, incrémentielles et différentielles, pour minimiser les temps d'arrêt.
Qu'est-ce que pgBackRest ?
Il existe différents types de sauvegardes pour les bases de données :
- Logique :la sauvegarde est stockée dans un format lisible par l'homme comme SQL.
- Physique :la sauvegarde contient des données binaires.
- Complète/Incrémentale/Différentielle :la définition de ces trois types de sauvegardes est implicite dans le nom. La sauvegarde complète est une copie complète de toutes vos données. La sauvegarde incrémentielle ne sauvegarde que les données modifiées depuis la sauvegarde précédente et la sauvegarde différentielle ne contient que les données modifiées depuis la dernière sauvegarde complète exécutée. Les sauvegardes incrémentielles et différentielles ont été introduites pour réduire le temps et l'utilisation de l'espace disque nécessaires pour effectuer une sauvegarde complète.
pgBackRest est un outil de sauvegarde open source qui crée des sauvegardes physiques avec quelques améliorations par rapport à l'outil classique pg_basebackup. Nous pouvons utiliser pgBackRest pour effectuer une copie initiale de la base de données pour la réplication en continu en utilisant une sauvegarde existante, ou nous pouvons utiliser l'option delta pour reconstruire un ancien serveur de secours.
Certaines des fonctionnalités les plus importantes de pgBackRest sont :
- Sauvegarde et restauration parallèles
- Fonctionnement local ou à distance
- Sauvegardes complètes, incrémentielles et différentielles
- Rotation des sauvegardes et expiration des archives
- Vérification de l'intégrité de la sauvegarde
- Reprise de sauvegarde
- Restauration delta
- Chiffrement
Voyons maintenant comment nous pouvons utiliser pgBackRest pour sauvegarder nos bases de données PostgreSQL et TimescaleDB.
Comment utiliser pgBackRest
Pour ce test, nous utiliserons CentOS 7 comme système d'exploitation et PostgreSQL 11 comme serveur de base de données. Nous supposerons que vous avez installé la base de données, sinon vous pouvez suivre ces liens pour déployer PostgreSQL ou TimescaleDB de manière simple en utilisant ClusterControl.
Tout d'abord, nous devons installer le package pgbackrest.
$ yum install pgbackrest
pgBackRest peut être utilisé depuis la ligne de commande, ou depuis un fichier de configuration situé par défaut dans /etc/pgbackrest.conf sur CentOS7. Ce fichier contient les lignes suivantes :
[global]
repo1-path=/var/lib/pgbackrest
#[main]
#pg1-path=/var/lib/pgsql/10/data
Vous pouvez consulter ce lien pour voir quel paramètre nous pouvons ajouter dans ce fichier de configuration.
Nous ajouterons les lignes suivantes :
[testing]
pg1-path=/var/lib/pgsql/11/data
Assurez-vous d'avoir ajouté la configuration suivante dans le fichier postgresql.conf (ces modifications nécessitent un redémarrage du service).
archive_mode = on
archive_command = 'pgbackrest --stanza=testing archive-push %p'
max_wal_senders = 3
wal_level = logical
Maintenant, prenons une sauvegarde de base. Tout d'abord, nous devons créer une "strophe", qui définit la configuration de sauvegarde pour un cluster de bases de données PostgreSQL ou TimescaleDB spécifique. La section de strophe doit définir le chemin d'accès au cluster de base de données et l'hôte/l'utilisateur si le cluster de base de données est distant.
$ pgbackrest --stanza=testing --log-level-console=info stanza-create
2019-04-29 21:46:36.922 P00 INFO: stanza-create command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:46:37.475 P00 INFO: stanza-create command end: completed successfully (554ms)
Et ensuite, nous pouvons lancer la commande check pour valider la configuration.
$ pgbackrest --stanza=testing --log-level-console=info check
2019-04-29 21:51:09.893 P00 INFO: check command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:51:12.090 P00 INFO: WAL segment 000000010000000000000001 successfully stored in the archive at '/var/lib/pgbackrest/archive/testing/11-1/0000000100000000/000000010000000000000001-f29875cffe780f9e9d9debeb0b44d945a5165409.gz'
2019-04-29 21:51:12.090 P00 INFO: check command end: completed successfully (2197ms)
Pour effectuer la sauvegarde, exécutez la commande suivante :
$ pgbackrest --stanza=testing --type=full --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=full
WARN: option repo1-retention-full is not set, the repository may run out of space
HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 15:43:21": backup begins after the next regular checkpoint completes
INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
WARN: aborted backup 20190429-215508F of same type exists, will be cleaned to remove invalid files and resumed
INFO: backup file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: full backup size = 31.8MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000130
INFO: new backup label = 20190429-215508F
INFO: backup command end: completed successfully (12810ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (10ms)
Maintenant, nous avons terminé la sauvegarde avec la sortie "terminée avec succès", alors allons-y pour la restaurer. Nous allons arrêter le service postgresql-11.
$ service postgresql-11 stop
Redirecting to /bin/systemctl stop postgresql-11.service
Et laissez le répertoire de données vide.
$ rm -rf /var/lib/pgsql/11/data/*
Maintenant, exécutez la commande suivante :
$ pgbackrest --stanza=testing --log-level-stderr=info restore
INFO: restore command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
INFO: restore backup set 20190429-215508F
INFO: restore file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: write /var/lib/pgsql/11/data/recovery.conf
INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
INFO: restore command end: completed successfully (10819ms)
Ensuite, démarrez le service postgresql-11.
$ service postgresql-11 stop
Et maintenant, notre base de données est opérationnelle.
$ psql -U app_user world
world=> select * from city limit 5;
id | name | countrycode | district | population
----+----------------+-------------+---------------+------------
1 | Kabul | AFG | Kabol | 1780000
2 | Qandahar | AFG | Qandahar | 237500
3 | Herat | AFG | Herat | 186800
4 | Mazar-e-Sharif | AFG | Balkh | 127800
5 | Amsterdam | NLD | Noord-Holland | 731200
(5 rows)
Voyons maintenant comment effectuer une sauvegarde différentielle.
$ pgbackrest --stanza=testing --type=diff --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=diff
WARN: option repo1-retention-full is not set, the repository may run out of space
HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: last backup label = 20190429-215508F, version = 2.13
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 21:22:58": backup begins after the next regular checkpoint completes
INFO: backup start archive = 00000002000000000000000B, lsn = 0/B000028
WARN: a timeline switch has occurred since the last backup, enabling delta checksum
INFO: backup file /var/lib/pgsql/11/data/base/16429/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/16429/2608 (448KB, 8%) checksum 53bd7995dc4d29226b1ad645995405e0a96a4a7b
. . .
INFO: diff backup size = 40.1MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 00000002000000000000000B, lsn = 0/B000130
INFO: new backup label = 20190429-215508F_20190430-212258D
INFO: backup command end: completed successfully (23982ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (14ms)
Pour des sauvegardes plus complexes, vous pouvez suivre le guide de l'utilisateur de pgBackRest.
Comme nous l'avons mentionné précédemment, vous pouvez utiliser la ligne de commande ou les fichiers de configuration pour gérer vos sauvegardes.
Comment utiliser pgBackRest dans ClusterControl
Depuis la version 1.7.2, ClusterControl a ajouté la prise en charge de pgBackRest pour la sauvegarde des bases de données PostgreSQL et TimescaleDB, voyons donc comment nous pouvons l'utiliser à partir de ClusterControl.
Création d'une sauvegarde
Pour cette tâche, accédez à ClusterControl -> Sélectionnez Cluster -> Sauvegarde -> Créer une sauvegarde.
Nous pouvons créer une nouvelle sauvegarde ou en configurer une planifiée. Pour notre exemple, nous allons créer une seule sauvegarde instantanément.
Nous devons choisir une méthode, le serveur à partir duquel la sauvegarde sera prise et où nous voulons stocker la sauvegarde. Nous pouvons également télécharger notre sauvegarde sur le cloud (AWS, Google ou Azure) en activant le bouton correspondant.
Dans ce cas, nous choisirons la méthode pgbackrestfull pour effectuer une première sauvegarde complète. Lorsque vous sélectionnez cette option, nous verrons la note rouge suivante :
"Lors de la première tentative de sauvegarde de pgBackRest, ClusterControl reconfigurera le nœud (déploye et configure pgBackRest) et après cela, le nœud db doit d'abord être redémarré."
Veuillez donc en tenir compte lors de la première tentative de sauvegarde.
Ensuite, nous spécifions l'utilisation de la compression et le niveau de compression pour notre sauvegarde.
Dans la section de sauvegarde, nous pouvons voir la progression de la sauvegarde et des informations telles que la méthode, la taille, l'emplacement, etc.
Les étapes sont les mêmes pour créer un différentiel de sauvegarde incrémentale. Il suffit de choisir la méthode souhaitée lors de la création de la sauvegarde.
Restauration d'une sauvegarde
Une fois la sauvegarde terminée, nous pouvons la restaurer en utilisant ClusterControl. Pour cela, dans notre section de sauvegarde (ClusterControl -> Select Cluster -> Backup), nous pouvons sélectionner "Restaurer la sauvegarde", ou directement "Restaurer" sur la sauvegarde que nous voulons restaurer.
Nous avons trois options pour restaurer la sauvegarde. Nous pouvons restaurer la sauvegarde dans un nœud de base de données existant, restaurer et vérifier la sauvegarde sur un hôte autonome ou créer un nouveau cluster à partir de la sauvegarde.
Si nous choisissons l'option Restaurer sur le nœud, nous devons spécifier le nœud maître, car c'est le seul accessible en écriture dans le cluster.
Nous pouvons surveiller la progression de notre restauration à partir de la section Activité de notre ClusterControl.
Vérification automatique des sauvegardes
Une sauvegarde n'est pas une sauvegarde si elle n'est pas restaurable. La vérification des sauvegardes est quelque chose qui est généralement négligé par beaucoup. Voyons comment ClusterControl peut automatiser la vérification des sauvegardes PostgreSQL et TimescaleDB et éviter les mauvaises surprises.
Dans ClusterControl, sélectionnez votre cluster et allez dans la section "Sauvegarde", puis, sélectionnez "Créer une sauvegarde".
La fonction de vérification automatique de la sauvegarde est disponible pour les sauvegardes planifiées. Alors, choisissons l'option "Planifier la sauvegarde".
Lors de la planification d'une sauvegarde, en plus de sélectionner les options courantes telles que la méthode ou le stockage, nous devons également spécifier la planification/la fréquence.
À l'étape suivante, nous pouvons compresser notre sauvegarde et activer la fonction "Vérifier la sauvegarde".
Pour utiliser cette fonctionnalité, nous avons besoin d'un hôte dédié (ou VM) qui ne fait pas partie du cluster.
ClusterControl installera le logiciel et restaurera la sauvegarde sur cet hôte. Après la restauration, nous pouvons voir l'icône de vérification dans la section ClusterControl Backup.
Recommandations
Il existe également quelques conseils que nous pouvons prendre en compte lors de la création de nos sauvegardes :
- Stocker la sauvegarde sur un emplacement distant :nous ne devons pas stocker la sauvegarde sur le serveur de base de données. En cas de panne du serveur, nous pourrions perdre la base de données et la sauvegarde en même temps.
- Conserver une copie de la dernière sauvegarde sur le serveur de base de données :cela peut être utile pour une récupération plus rapide.
- Utilisez des sauvegardes incrémentielles/différentielles :pour réduire le temps de récupération des sauvegardes et l'utilisation de l'espace disque.
- Sauvegarder les WAL :si nous devons restaurer une base de données à partir de la dernière sauvegarde, si vous ne faites que la restaurer, vous perdrez les modifications depuis la sauvegarde jusqu'au moment de la restauration, mais si nous avons les WAL, nous pouvons appliquer les changements et nous pouvons utiliser PITR.
- Utilisez à la fois des sauvegardes logiques et physiques :les deux sont nécessaires pour différentes raisons, par exemple, si nous voulons restaurer une seule base de données/table, nous n'avons pas besoin de la sauvegarde physique, nous n'avons besoin que de la sauvegarde logique et elle être encore plus rapide que la restauration de l'intégralité du serveur.
- Effectuez des sauvegardes à partir des nœuds de secours (si c'est possible) :pour éviter une charge supplémentaire sur le nœud principal, il est recommandé d'effectuer la sauvegarde à partir du serveur de secours.
- Testez vos sauvegardes :la confirmation que la sauvegarde est effectuée n'est pas suffisante pour s'assurer que la sauvegarde fonctionne. Nous devrions le restaurer sur un serveur autonome et le tester pour éviter une surprise en cas de panne.
Conclusion
Comme nous avons pu le voir, pgBackRest est une bonne option pour améliorer notre stratégie de sauvegarde. Il vous aide à protéger vos données et il peut être utile d'atteindre le RTO en réduisant les temps d'arrêt en cas de panne. Les sauvegardes incrémentielles peuvent aider à réduire le temps et l'espace de stockage utilisés pour le processus de sauvegarde. ClusterControl peut vous aider à automatiser le processus de sauvegarde de vos bases de données PostgreSQL et TimescaleDB et, en cas d'échec, à les restaurer en quelques clics.