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
pg_start_backup()
,rsync ${PGDATA}/
maître à esclave,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?
postgresql
replication
Daniel
la source
la source
Réponses:
pg_start_backup
effectuera 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ôlepg_start_backup
aura 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
nice
etionice
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écutiezpg_stop_backup
votre 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_backup
etpg_stop_backup
pour 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
CHECKPOINT
puis 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
pg_stop_backup
pg_stop_backup
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.
la source
C'est un grave creusage mais je dois corriger quelque chose ici.
La réponse précédente dit:
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:
Imaginons ce cas:
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 ()".
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.
la source
pg_basebackup --xlog-method=stream
si je ne me trompe pas.max_wal_senders
minimum défini à 2. C'est un bon moyen d'éviter le problème de "WAL manquant" à la fin de la sauvegarde.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.
la source