Sauvegardes incrémentielles postgresql avec pgbackrest - un cours pour les jeunes combattants du développeur

Clause de non-responsabilité

Je suis dĂ©veloppeur. J'Ă©cris du code, j'interagis avec la base de donnĂ©es uniquement en tant qu'utilisateur. En aucun cas je ne prĂ©tends ĂȘtre administrateur systĂšme et surtout dba. Mais ...

Il s'est donc avĂ©rĂ© que j'avais besoin d'organiser une sauvegarde de la base de donnĂ©es postgresql. Pas de nuages ​​- conservez SSH et faites-le fonctionner sans demander d'argent. Que faisons-nous dans de tels cas? C'est vrai, nous poussons pgdump dans cron, chaque jour nous sauvegardons tout dans l'archive, et si nous sommes complĂštement dispersĂ©s, nous envoyons cette archive quelque part en enfer.

Cette fois, la difficulté était que selon les plans, la base était supposée croßtre d'environ + - 100 Mo par jour. Bien sûr, dans quelques semaines, le désir de tout sauvegarder avec pgdump disparaßtra. Ici, les sauvegardes incrémentielles viennent à la rescousse.

Intéressant? Bienvenue au chat.

La sauvegarde incrémentielle est un type de sauvegarde lorsque tous les fichiers source ne sont pas sauvegardés, mais uniquement nouveaux et modifiés depuis la création de la sauvegarde précédente.
Comme tout développeur, ne voulant PAS TOTALEMENT (à l'époque) comprendre les subtilités des postgres, j'ai voulu trouver un bouton vert. Eh bien, vous savez, comme dans AWS, DigitalOcean: cliqué sur un bouton - obtenu la réplication, cliqué sur le deuxiÚme - mis en place des sauvegardes, le troisiÚme - il a été annulé il y a quelques heures. Des boutons et un bel outil GUI que je n'ai pas trouvé. Si vous le savez (gratuit ou pas cher) - écrivez-le dans les commentaires.

Googler, j'ai trouvĂ© deux outils pgbarman et pgbackrest . Je n’ai simplement pas eu de problĂšme avec le premier (trĂšs mauvaise documentation, j’ai essayĂ© de tout faire selon les anciens manuels), mais le second s’est avĂ©rĂ© ĂȘtre au niveau, mais pas sans dĂ©fauts. Pour simplifier le travail pour ceux qui sont confrontĂ©s Ă  une tĂąche similaire et cet article a Ă©tĂ© Ă©crit.
AprÚs avoir lu cet article, vous apprendrez comment effectuer des sauvegardes incrémentielles, les enregistrer sur un serveur distant (un référentiel avec des sauvegardes) et les restaurer en cas de perte de données ou d'autres problÚmes sur le serveur principal.

La préparation


Pour jouer le manuel, vous aurez besoin de deux VPS. Le premier sera le rĂ©fĂ©rentiel (le rĂ©fĂ©rentiel sur lequel reposeront les sauvegardes), et le second, en fait, le serveur lui-mĂȘme avec postgres (dans mon cas, la version 11 de postgres).

Il est supposĂ© que sur le serveur avec postgres, vous avez root, utilisateur sudo, utilisateur postgres et postgres lui-mĂȘme est installĂ© (l'utilisateur postgres est crĂ©Ă© automatiquement lorsque postgresql est installĂ©), et sur le serveur de rĂ©fĂ©rentiel, il y a root et utilisateur sudo (le nom d'utilisateur pgbackrest sera utilisĂ© dans le manuel) .

Pour que vous ayez moins de problĂšmes lors de la reproduction des instructions - en italique j'Ă©cris oĂč, par quel utilisateur et avec quels droits j'ai exĂ©cutĂ© la commande lors de l'Ă©criture et de la vĂ©rification de l'article.

Installer pgbackrest


Référentiel (utilisateur pgbackrest):

1. Téléchargez l'archive avec pgbackrest et transférez son contenu dans le dossier / build:

sudo mkdir /build sudo wget -q -O - \ https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \ sudo tar zx -C /build 

2. Installez les dépendances nécessaires à l'assemblage:

 sudo apt-get update sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \ libpq-dev 

3. Nous collectons pgbackrest:

 cd /build/pgbackrest-release-2.18/src && sudo ./configure sudo make -s -C /build/pgbackrest-release-2.18/src 

4. Copiez le fichier exécutable dans le répertoire / usr / bin:

 sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin sudo chmod 755 /usr/bin/pgbackrest 

5. Pgbackrest nécessite perl. Installer:

 sudo apt-get install perl 

6. Créez des répertoires pour les journaux, donnez-leur des droits spécifiques:

 sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo mkdir -p /etc/pgbackrest sudo mkdir -p /etc/pgbackrest/conf.d sudo touch /etc/pgbackrest/pgbackrest.conf sudo chmod 640 /etc/pgbackrest/pgbackrest.conf sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

7. VĂ©rifiez:

 pgbackrest version 

Serveur Postgres (utilisateur sudo ou root):

Le processus d'installation de pgbackrest sur un serveur avec postgres est similaire au processus d'installation sur un rĂ©fĂ©rentiel (oui, pgbackrest devrait ĂȘtre sur les deux serveurs), mais dans le 6Ăšme paragraphe, la deuxiĂšme et derniĂšre commande:

 sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

remplacer par:

 sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf 

Configuration de la communication entre les serveurs via SSH sans mot de passe


Pour que pgbackrest fonctionne correctement, vous devez configurer l'interaction entre le serveur postgres et le référentiel à l'aide du fichier de clés.

Référentiel (utilisateur pgbackrest):

Créez une paire de clés:

 mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Attention! Nous exécutons les commandes ci-dessus sans sudo.

Serveur Postgres (utilisateur sudo ou root):

Créez une paire de clés:

 sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Référentiel (utilisateur sudo):

Copiez la clé publique du serveur postgres sur le serveur de référentiel:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | \ sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys 

À cette Ă©tape, demandera le mot de passe de l'utilisateur root. Vous devez saisir le mot de passe root de l'utilisateur du serveur postgres!

Serveur Postgres (utilisateur sudo):

Copiez la clé publique du référentiel sur le serveur avec postgres:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | \ sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys 

À cette Ă©tape, demandera le mot de passe de l'utilisateur root. Vous devez entrer le mot de passe root de l'utilisateur du rĂ©fĂ©rentiel!

Nous vérifions:

Référentiel (utilisateur root, pour la pureté de l'expérience):

 sudo -u pgbackrest ssh postgres@<postgres_server_ip> 

Serveur Postgres (root, pour la pureté de l'expérience):

 sudo -u postgres ssh pgbackrest@<repository_server_ip> 

Nous nous assurons d'avoir accĂšs sans problĂšme.

Configuration du serveur PostgreSQL



Serveur Postgres (utilisateur sudo ou root):

1. «Frappons» sur le serveur postgres depuis une adresse IP externe. Pour ce faire, modifiez le fichier postgresql.conf (situé dans le dossier / etc / postgresql / 11 / main), en y ajoutant la ligne:

 listen_addresses = '*' 

Si une telle ligne existe déjà, décommentez-la ou définissez la valeur du paramÚtre sur '*'.

Dans le fichier pg_hba.conf (également situé dans le dossier / etc / postgresql / 11 / main ), ajoutez les lignes suivantes:

 hostssl all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 md5 

oĂč:

 hostssl/host -   SSL ( ) all -      all -  ,    () 0.0.0.0/0 -       md5 -    

2. Nous effectuerons les réglages nécessaires dans postgresql.conf (il se trouve dans le dossier / etc / postgresql / 11 / main ) pour que pgbackrest fonctionne:

 archive_command = 'pgbackrest --stanza=main archive-push %p' #  main -  .   postgres    main. archive_mode = on max_wal_senders = 3 wal_level = replica 

3. Effectuez les réglages nécessaires dans le fichier de configuration de pgbackrest (/etc/pgbackrest/pgbackrest.conf):

 [main] pg1-path=/var/lib/postgresql/11/main [global] log-level-file=detail repo1-host=<repository_server_ip> 

4. Redémarrez postgresql:

 sudo service postgresql restart 

Configuration d'un serveur de référentiel


Référentiel (utilisateur pgbackrest):

Effectuez les réglages nécessaires dans le fichier de configuration pgbackrest
( /etc/pgbackrest/pgbackrest.conf ):

 [main] pg1-host=<postgres_server_ip> pg1-path=/var/lib/postgresql/11/main [global] repo1-path=/var/lib/pgbackrest repo1-retention-full=2 # ,     . ..            -       . start-fast=y #    ,       https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving 

Création de stockage


Référentiel (utilisateur pgbackrest):

Créez un nouveau stockage pour le cluster principal :

 sudo mkdir -m 770 /var/lib/pgbackrest sudo chown -R pgbackrest /var/lib/pgbackrest/ sudo -u pgbackrest pgbackrest --stanza=main stanza-create 

VĂ©rifier


Serveur Postgres (utilisateur sudo ou root):

VĂ©rifiez sur le serveur postgres:

 sudo -u postgres pgbackrest --stanza=main --log-level-console=info check 

Référentiel (utilisateur pgbackrest):

Vérifiez sur le serveur de référentiel:

 sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check 

Nous nous assurons que dans la sortie, nous voyons la ligne «vérifier la fin de la commande: terminée avec succÚs».

Êtes-vous fatiguĂ©? Nous passons au plus intĂ©ressant.

Faire une sauvegarde


Référentiel (utilisateur pgbackrest):


1. Nous effectuons des sauvegardes:

 sudo -u pgbackrest pgbackrest --stanza=main backup 

2. Nous nous assurons que la sauvegarde a été créée:

 ls /var/lib/pgbackrest/backup/main/ 

Pgbackrest créera la premiÚre sauvegarde complÚte. Si vous le souhaitez, vous pouvez réexécuter la commande de sauvegarde et vous assurer que le systÚme crée une sauvegarde incrémentielle.

Si vous souhaitez effectuer une nouvelle sauvegarde complÚte, spécifiez un indicateur supplémentaire:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full backup 

Si vous souhaitez une sortie détaillée sur la console, spécifiez également:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup 

Restaurer la sauvegarde


Serveur Postgres (utilisateur sudo ou root):

1. ArrĂȘtez le cluster de travail:

 sudo pg_ctlcluster 11 main stop 

2. Nous récupérons de la sauvegarde:

 sudo -u postgres pgbackrest --stanza=main --delta restore 

3. Exécutez le cluster:

 sudo pg_ctlcluster 11 main start 

AprÚs avoir restauré la sauvegarde, nous devons effectuer une deuxiÚme sauvegarde:

Référentiel (utilisateur pgbackrest):

 sudo pgbackrest --stanza=main backup 

C’est tout. En conclusion, je tiens Ă  vous rappeler qu'en aucun cas je n'essaie de me construire un dba senior et, Ă  la moindre occasion, j'utiliserai des nuages. Actuellement, je commence moi-mĂȘme Ă  Ă©tudier divers sujets tels que la sauvegarde, la rĂ©plication, la surveillance, etc. et j'Ă©cris de petits rapports sur les rĂ©sultats afin d'apporter une petite contribution Ă  la communautĂ© et de me laisser de petits berceaux.

Dans les articles suivants, je vais essayer de parler de fonctionnalités supplémentaires - récupération de données sur un cluster propre, chiffrement des sauvegardes et publication sur S3, sauvegardes via rsync.

Source: https://habr.com/ru/post/fr476206/


All Articles