PostgreSQL: Puis-je faire pg_start_backup () sur une base de données en cours d'exécution sous charge?

19

Notre réplication établie est rompue («le segment WAL demandé a déjà été supprimé» pendant les temps d'arrêt) Nous ne pouvons pas facilement arrêter à nouveau le maître.

Pouvons-nous

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ maître à esclave,
  3. pg_stop_backup()

... alors que le postgresql maître est toujours en pleine charge? (Ou pg_start_backup()conduira à

  • serrures de table,
  • Blocs d'E / S,
  • incohérences,
  • alarme incendie,
  • réponse db lente

En d'autres termes, cela pg_start_backup()affectera-t-il notre application?

Daniel
la source
Avez-vous vérifié les documents ? Il indique: "Par défaut, pg_start_backup peut prendre beaucoup de temps pour se terminer. En effet, il effectue un point de contrôle et les E / S requises pour le point de contrôle seront réparties sur une période de temps importante, par défaut la moitié de votre point de contrôle inter-points de contrôle. intervalle (voir le paramètre de configuration checkpoint_completion_target). C'est généralement ce que vous voulez, car cela minimise l'impact sur le traitement des requêtes. " Cependant, ce que cela signifie dans la pratique (et dans votre cas) n'est pas tout à fait clair.
dezso

Réponses:

11

pg_start_backupeffectuera un point de contrôle, comme le note dezso. Cela a un impact, mais votre base de données effectue des points de contrôle assez régulièrement de toute façon, et doit le faire pour fonctionner, donc ce n'est clairement pas un problème pour vous. Un point de contrôle précoce signifie que moins de données ont été accumulées, ce qui signifie que, si quelque chose, un point de contrôle pg_start_backupaura un impact moindre que la normale.

Où vous devez vous inquiéter est la rsync ou l' pg_basebackupétape équivalente . Les E / S de lecture à partir de cela ne seront pas trop mauvaises car elles sont séquentielles, mais cela affectera probablement encore considérablement les performances d'E / S de votre base de données, et cela aura également tendance à pousser les données chaudes hors du cache RAM au profit de moins -utilisé les données, provoquant la destruction du cache car les données les plus nécessaires sont ensuite relues.

Vous pouvez utiliser niceet ionicepour aider à limiter l'impact des E / S (mais pas l'impact du cache); cependant, cela a un coût. La sauvegarde prendra plus de temps, et jusqu'à ce que vous terminiez la sauvegarde et exécutiez pg_stop_backupvotre système est - si je comprends bien - accumulant des WAL qu'il ne peut pas supprimer, accumulant la dette du point de contrôle pour un GRAND point de contrôle à la fin de la sauvegarde, et accumulant la table et l'index ballonnement car il ne peut pas nettoyer les lignes mortes. Vous ne pouvez donc vraiment pas vous permettre que la sauvegarde prenne une éternité, surtout si vous avez des tables de désabonnement très élevées.

En fin de compte, il est difficile de dire si vous pouvez utiliser en toute sécurité pg_start_backupet pg_stop_backuppour des sauvegardes à chaud dans votre environnement. La plupart des gens le peuvent, mais si vous êtes proche de ce que votre matériel peut faire, que vous avez des contraintes de temps serrées, que vous ne pouvez pas courir le risque d'un décrochage et que vous avez des tables de désabonnement très élevées ainsi que de très grandes tables, cela peut être gênant. .

Malheureusement, vous devez à peu près le tester et voir.

Si vous le pouvez, il peut être utile d'émettre un CHECKPOINTpuis de prendre un instantané atomique du volume sur lequel se trouve votre base de données à l'aide de LVM, des outils de votre SAN, d'EBS ou de tout ce que vous utilisez. Si vous pouvez le faire, vous pouvez ensuite copier l'instantané à votre guise. Cette approche ne convient pas pour effectuer une sauvegarde de base pour PITR / redondance d'UC / redondance d'UC, mais elle est parfaitement adaptée à une copie de sauvegarde statique et a un impact beaucoup plus faible sur le système. Cependant, vous ne pouvez le faire que si vos instantanés sont atomiques et que votre base de données entière, y compris WAL, est sur un seul volume.

Une possibilité que je n'ai pas encore étudiée consiste à combiner les deux approches. Il me semble que l'on pourrait éventuellement ( non testé et peut-être faux et dangereux , je ne sais pas encore):

  • pg_start_backup
  • Déclenchez des instantanés de tous les espaces disque logiques, du datadir principal et du volume xlog
  • pg_stop_backup
  • Copiez WAL dans l'archive finale de pg_stop_backup
  • Copiez les données des volumes instantanés

Essentiellement, l'idée est de réduire la durée pendant laquelle la base de données doit retarder ses points de contrôle en prenant un point dans le temps de chaque volume que vous pouvez copier à votre guise.

Craig Ringer
la source
Après avoir compris que pg_start_backup () est principalement "une chose de contrôle contrôlé", nous avons gagné la confiance pour simplement essayer de voir. Il semble que l'impact sur l'application en cours d'exécution était négligeable. (maître principal datadir sur SSD) :-) L'idée "non testée et peut-être dangereuse" que vous avez proposée est un peu au-dessus de notre niveau de compétence et de soif d'aventure.
Daniel
Oh, et nous n'avons pas ionisé le rsync du premier coup. Parce que nous voulions en fait voir la charge supplémentaire sur le maître. Comme nous n'avons jamais eu besoin d'une deuxième exécution de rsync, tout va bien. Nous avons appris quelque chose de cela.
Daniel
7

C'est un grave creusage mais je dois corriger quelque chose ici.

La réponse précédente dit:

Vous pouvez utiliser nice et ionice pour aider à limiter l'impact des E / S (mais pas l'impact du cache); cependant, cela a un coût. La sauvegarde prendra plus de temps, et jusqu'à ce que vous terminiez la sauvegarde et exécutiez pg_stop_backup, votre système accumule - si je comprends bien - du WAL qu'il ne peut pas supprimer, accumule des dettes de point de contrôle pour un GRAND point de contrôle à la fin de la sauvegarde, et accumule la table et index ballonnement car il ne peut pas nettoyer les lignes mortes. Vous ne pouvez donc vraiment pas vous permettre que la sauvegarde prenne une éternité, surtout si vous avez des tables de désabonnement très élevées.

Ce n'est pas vrai. Le système conservera le nombre de WAL indiqué dans votre configuration (cf la documentation en ligne ). Donc, fondamentalement, la valeur la plus élevée entre:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Imaginons ce cas:

  • votre sauvegarde prend beaucoup de temps, car il y a des centaines de concerts à copier
  • vous avez une petite rétention WAL (checkpoint_segments à 3, par exemple)
  • vous n'avez pas configuré l'archivage WAL

puis après avoir lancé "pg_start_backup ()", vos fichiers WAL tourneront pendant votre sauvegarde. Une fois votre sauvegarde terminée, vous essayez de la restaurer sur un autre moteur de base de données. Le moteur au lancement demandera au moins le fichier WAL généré lors de l'émission de "pg_start_backup ()".

pg_start_backup 
-----------------
B/D0020F18
(1 row)

La base de données n'acceptera pas de démarrer tant que vous n'aurez pas fourni le fichier WAL "0000000x0000000B000000D0" (où x est votre TimelineID ). Ce fichier WAL est le strict minimum pour le démarrage du système. Bien sûr, avec seulement ce fichier, vous perdrez des données, car le reste des données se trouve dans les fichiers WAL que vous n'avez pas, mais au moins, vous aurez un moteur de base de données fonctionnel.

Vous devez donc soit archiver WAL, soit enregistrer vous-même les fichiers WAL nécessaires, mais Postgresql ne le fera pas pour vous.

sterfield
la source
3
Très bonne observation. Cela peut être évité pg_basebackup --xlog-method=streamsi je ne me trompe pas.
tomorrow__
2
Oui, depuis PG 9.2, vous pouvez diffuser le WAL avec la sauvegarde de base. Il ouvrira un deuxième flux, vous devez donc avoir un max_wal_sendersminimum défini à 2. C'est un bon moyen d'éviter le problème de "WAL manquant" à la fin de la sauvegarde.
sterfield
4

Quant à mon expérience avec PostgreSQL, c'est un fonctionnement relativement sûr, sauf si vous avez un impact très important sur les performances à ce moment-là. Si vous l'avez, il est préférable de suspendre temporairement l'écriture de tous vos clients.

Je n'ai eu qu'un seul cas critique lors de la synchronisation de mon maître à l'esclave sous charge et cela a été causé par OOM Killer (oui, vous devriez vraiment désactiver COMPLÈTEMENT OOM Killer sur les nœuds de base de données, je ne le savais pas ce jour-là).

J'ai donc restauré la base de données à partir de la sauvegarde nocturne et donné à postgres tous les segments WAL du répertoire pg_archive pour les relire (il suffit de les copier dans le dossier pg_xlog). Tout s'est bien passé, mais les temps d'arrêt étaient inévitables, bien sûr.

Riki_tiki_tavi
la source