web-dev-qa-db-fra.com

Exécuter pg_dump sur un serveur de secours automatique?

Avertissement: Je n'ai certes pas encore essayé, mais je ne suis pas sûr de savoir si cela ne fonctionnait pas correctement, alors je voulais demander.

Je souhaite exécuter un travail de sauvegarde nocturne (via pg_dumpall) à partir d'un serveur de secours automatique exécutant la réplication en continu, pour éviter de placer cette charge sur le serveur principal. J'ai seulement vu la mention de quelques pièges que les gens ont rencontrés, par exemple ici et ici , mais très peu de conseils. Ce n'est pas grave si la sauvegarde est légèrement en retard sur le serveur principal, tant qu'elle est cohérente (ce qu'elle devrait être).

Mes questions sont:

  1. Est-ce que je veux vraiment faire cela, ou la sauvegarde doit-elle être effectuée sur le serveur principal? Pourquoi?

  2. Lors d'un vidage en mode veille, de quels paramètres ai-je besoin et quelle procédure dois-je utiliser pour le faire correctement? par exemple. dois-je arrêter la réplication pendant la durée de la sauvegarde?

22
jberryman

AFAIK, exécutant pg_dump sur une redondance d'UC est l'un des principaux atouts du standby. Il est parfaitement sûr, bien qu'il ne soit pas parfaitement fiable - les vidages peuvent échouer si le serveur de secours interrompt la transaction lorsqu'elle est trop loin derrière le maître.

La seule chose que vous devez vraiment surveiller est de vous assurer que le mode veille est à jour et se maintient. Si la veille a perdu sa connexion avec le maître et a pris trop de retard, vous ne voulez pas sauvegarder joyeusement une veille obsolète de trois semaines.

Vous devrez permettre au standby de se placer assez loin derrière le master pendant la sauvegarde, car il devra sinon annuler votre pg_dump transaction afin de continuer à rejouer WAL. Voir la documentation sur la redondance d'UC , en particulier la section "Gestion des conflits de requêtes" et la section max_standby_archive_delay et max_standby_streaming_delay paramètres.

Notez que le maître doit être disposé à conserver suffisamment d'archives WAL pour permettre à l'esclave de rattraper son retard.

22
Craig Ringer
  1. Nous faisons de la sauvegarde en veille, c'est très bien.
  2. Pour éviter un conflit d'instructions annulé pendant la sauvegarde sur le système de secours, vous devez suspendre la réplication en veille à l'aide de SELECT pg_xlog_replay_pause();, puis exécuter votre sauvegarde, une fois qu'elle est terminée, exécuter SELECT pg_xlog_replay_resume(); pour reprendre la réplication. Gardez à l'esprit que l'exécution des commandes ci-dessus entraînera un retard de récupération sur l'esclave, qui peut être assez important, selon la taille de votre base de données. Tenez également compte de l'espace que prendront les segments WAL, car ils ne seront pas rejoués sur l'esclave pendant la pause.

Vous pouvez trouver d'autres fonctions d'administration utiles dans documentation . Par exemple, vérifiez si le serveur est réellement en cours de récupération, avant de l'interrompre: SELECT pg_is_in_recovery().

12
Ruslan Kabalin

Si vous suspendez la réplication pendant la sauvegarde ((c'est une bonne idée pour préserver l'intégrité et la cohérence), vous pouvez modifier certaines lignes dans votre postgresql principal:

Combien de temps retarde habituellement votre sauvegarde. Assurez-vous que le nœud maître conserve tous les fichiers x_log nécessaires pour reprendre la réplication. Vous pouvez le faire dans l'édition postgresql.conf

wal_keep_segments = 32      # in logfile segments, 16MB each; 0 disables

Si vous ne modifiez pas cela et que votre processus de sauvegarde est trop long, c'est probablement que le nœud maître efface les fichiers xlog avant de les envoyer à l'esclave.

0
Pablo Luna