web-dev-qa-db-fra.com

PostgreSQL: Puis-je faire pg_start_backup () sur un DB en direct et exécuté sous charge?

Notre réplication établie a cassé ("Le segment WAL demandé a déjà été supprimé" pendant les temps d'arrêt), nous ne pouvons plus facilement arrêter le maître.

Pouvons-nous

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

... tandis que le maître PostgreSQL est toujours sous charge complète? (Ou la volonté pg_start_backup() conduire à

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

En d'autres termes, pg_start_backup() affecte notre application?

19
Daniel

pg_start_backup effectuera un point de contrôle, comme Dezso Notes. Cela a un impact, mais votre base de données effectue des points de contrôle assez régulièrement, et doit le faire pour fonctionner, de sorte qu'ils ne sont 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 d'un point de contrôle de pg_start_backup sera un impact plus faible que la normale.

Où vous devez vous inquiéter est le RSYNC ou l'équivalent pg_basebackup étape. Les E/S de ce type ne seront pas trop mauvais, car il est séquentiel, mais cela fera probablement de manière significative la performance d'E/S de votre base de données, et il aura également tendance à appuyer sur les données chaudes de RAM Cache en faveur des données moins utilisées, provoquant la rotation du cache car les données plus nécessaires sont ensuite relues dans.

Vous pouvez utiliser Nice et ionice _ pour limiter l'impact d'E/S (mais pas l'impact de la cache); Cependant, il y a un coût à cela. La sauvegarde prendra plus de temps et jusqu'à ce que vous achetiez la sauvegarde et courez pg_stop_backup Votre système est - comme je le comprends - accumuler le WAL, il ne peut pas supprimer, accumuler une dette de point de contrôle pour un gros point de contrôle à la fin de la balance de sauvegarde et accumule la table et l'index de bloat car il ne peut pas nettoyer les lignes mortes. Donc, vous ne pouvez vraiment pas vous permettre d'avoir la sauvegarde à prendre pour toujours, surtout si vous avez des tables de baratte très élevées.

En fin de compte, il est difficile de dire si vous pouvez utiliser en toute sécurité pg_start_backup et pg_stop_backup Pour des sauvegardes chaudes dans votre environnement. La plupart des gens peuvent, mais si vous êtes proche du bord de ce que votre matériel peut faire, avoir des exigences de chronométrage strictes, ne peut pas permettre le risque de stalle et avoir des tables de baratte très élevées ainsi que de très grandes tables, cela pourrait être gênant .

Malheureusement, vous avez à peu près besoin de le tester et de voir.

Si vous le pouvez, il peut être utile d'émettre un CHECKPOINT puis de prendre un instantané atomique du volume Votre base de données est à la place à l'aide de LVM, de vos outils de votre San, d'ESB ou de tout ce que vous êtes activé. Si vous pouvez le faire, vous pouvez ensuite copier l'instantané à votre guise. Cette approche ne convient pas à une sauvegarde de base pour la veille piticul/chaude, mais elle est parfaitement bonne pour une copie de sauvegarde statique et est un impact beaucoup plus faible sur le système. Vous ne pouvez le faire que si vos instantanés sont atomiques et que toute votre base de données, y compris WAL, est cependant sur un seul volume.

Une possibilité que je n'ai pas encore enquêté, c'est combiner les deux approches. Il me semble que cela pourrait éventuellement ( non testé et éventuellement mauvais et dangereux, je ne sais pas encore):

  • pg_start_backup
  • Instantanés de déclenchement de tous les espaces de table, le Datadir principal et le volume XLOG
  • pg_stop_backup
  • Copier Wal jusqu'à l'archive finale de pg_stop_backup
  • Copier les données des volumes d'instantané

L'idée est essentiellement de réduire combien de temps la DB doit retarder ses points de contrôle en prenant un point à temps de chaque volume que vous pouvez copier à votre guise.

11
Craig Ringer

C'est une grave creuser mais je dois corriger quelque chose ici.

La réponse précédente indique:

Vous pouvez utiliser Nice et Ionice pour aider à limiter l'impact des E/S (mais pas l'impact de la cache); Cependant, il y a un coût à cela. La sauvegarde prendra plus de temps et jusqu'à ce que vous complétiez la sauvegarde et exécutera pg_stop_backup, votre système est - comme je le comprends - accumuler le WAL, il ne peut pas supprimer, accumuler des dettes de point de contrôle pour un gros point de contrôle à la fin de L'exécution de la sauvegarde, et accumule la table et l'index de bloat car il ne peut pas nettoyer les rangées mortes. Donc, vous ne pouvez vraiment pas vous permettre d'avoir la sauvegarde à prendre pour toujours, surtout si vous avez des tables de baratte 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_keeke_seégments

Imaginons cette affaire:

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

ensuite, après avoir initié "pg_start_backup ()", vos fichiers WAL pivoteront pendant votre sauvegarde. Lorsque votre sauvegarde sera terminée, vous allez ensuite essayer de le restaurer sur un autre moteur de base de données. Le moteur au lancement demandera au moins au moins Le fichier wal généré lorsque vous avez émis "pg_start_backup ()".

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

La base de données n'acceptera pas de démarrer jusqu'à ce que vous fournisiez un fichier wal "0000000x0000000B000000D0" (où x est votre timineID ). Ce fichier wal est le nu minimum pour le système de démarrage. Bien sûr, avec seulement ce fichier, vous perdrez des données, car le reste des données est situé dans les fichiers WAL, vous n'avez pas, mais au moins, vous aurez un moteur de base de données de travail.

Donc, vous devez faire un archivage WAL, ou vous devez enregistrer les fichiers WAL nécessaires vous-même, mais PostgreSQL ne le fera pas pour vous.

7
sterfield

Quant à mon expérience avec PostgreSQL, il s'agit d'une opération relativement sûre à moins que vous n'ayez un impact très important sur ce moment-là. Si vous en avez, il est préférable de faire une pause temporaire de tous vos clients.

Je n'avais qu'un seul cas critique lors de la synchronisation de mon maître d'esclave sous charge et que c'était causé par Oom Killer (oui, vous devriez vraiment désactiver complètement Oom Killer sur les nœuds de la base de données, je ne connaissais pas ce jour-là).

J'ai donc restauré la base de données de la sauvegarde nocturne et a donné à Postgres tous les segments Wal du répertoire PG_Archive pour la lecture (juste les copié dans le dossier PG_XLOG). Tout s'est bien passé, mais l'arrêt était inévitable, bien sûr.

4
Riki_tiki_tavi