Instantanés de stockage pour une sauvegarde cohérente de postgresql - différents volumes de données et de journaux

11

Nous exécutons de nombreuses machines virtuelles Linux dans un environnement de stockage partagé / vmware, chacune exécutant sa propre instance de postgreSQL (un mélange de 9.0 et 9.3). Actuellement, la machine virtuelle entière se trouve sur une seule partition / volume racine, et nous avons eu beaucoup de succès (~ 8 ans) en utilisant des instantanés basés sur le stockage des volumes VMFS sous-jacents pour le processus de sauvegarde / restauration (et la réplication sur notre site DR).

En raison de l'architecture de notre stockage, il serait avantageux de séparer les fichiers WAL postgres en un volume non mis en cache, principalement en écriture, afin de réduire le taux de désabonnement du cache du côté du stockage. Avec notre stockage (Nimble Storage), nous pouvons affecter les deux volumes à un seul groupe de protection / snapshot, mais je n'ai pas été en mesure de demander à notre fournisseur que les snapshots se produiront EXACTEMENT en même temps sur tous les volumes du groupe de protection - il le fera probablement, mais il y a toujours cette chance que ses millisecondes se séparent.

À cette fin, nous avons effectué quelques expériences, tout en écrivant des données dans la base de données aussi rapidement que possible à l'aide de pg_bench. Après les expériences, nous avons restauré nos volumes instantanés et démarré les postgres VM +

  • Instantané des volumes de données et de journaux presque simultanément - résultat: DB récupéré
  • Premier volume de données de cliché, volume de journal ~ 1 minute plus tard - résultat: DB récupéré
  • Premier volume de journal d'instantané, volume de données ~ 1 minute plus tard - résultat: DB récupéré
  • Volume du journal d'instantané en premier, volume de données ~ 3 minutes plus tard, après qu'un point de contrôle WAL a écrit de nouvelles données dans les fichiers de données: résultat: DB récupéré

Les tests semblent donc nous dire tant que les deux instantanés sont cohérents au niveau du volume et relativement proches, vous obtenez une copie cohérente de la base de données, en fonction de l'heure de l'instantané du volume WAL / Log.

Ma question: est-ce sûr? Quels sont les cas d'angle qui nous manquent dans nos tests, et qu'est-ce qui pourrait mal tourner?

Le document de Postgres indique que ce n'est pas sûr, mais les tests semblent indiquer sa robustesse: http://www.postgresql.org/docs/9.1/static/backup-file.html

Si votre base de données est répartie sur plusieurs systèmes de fichiers, il se peut qu'il n'y ait aucun moyen d'obtenir des instantanés figés exactement simultanés de tous les volumes. Par exemple, si vos fichiers de données et votre journal WAL se trouvent sur des disques différents, ou si les espaces disque logiques se trouvent sur des systèmes de fichiers différents, il peut ne pas être possible d'utiliser la sauvegarde de clichés car les clichés doivent être simultanés. Lisez très attentivement la documentation de votre système de fichiers avant de faire confiance à la technique de prise de vue cohérente dans de telles situations.

REMARQUE: Oui, nous connaissons d'autres options pour nous assurer qu'elles sont cohérentes, comme mettre PostgreSQL en mode de sauvegarde à chaud ou utiliser l'intégration VMware de notre stockage pour suspendre les machines virtuelles elles-mêmes, mais nous recherchons une solution de stockage uniquement pour la vitesse, la commodité, et aucun impact sur nos clients.

Steve R.
la source
2
Une mise à jour - notre fournisseur de stockage, Nimble Storage, est revenu aujourd'hui affirmant sans équivoque que les instantanés pris dans le cadre d'un groupe de protection sont en effet cohérents entre les volumes / pris au même moment dans le temps, donc ma question est vraiment théorique à ce stade. Cependant - je serais toujours intéressé si quelqu'un avait des commentaires, car dans nos tests, Postgres semble suffisamment robuste pour survivre à des instantanés non pris en même temps.
Steve R.
Que voulez-vous dire lorsque vous dites "volume de données de cliché en premier, volume de journal ~ 1 minute plus tard", si les données et le volume de journal se trouvent dans le même groupe de clichés, cela se fera en même temps. placez les données et le volume de journaux dans un groupe d'instantanés et effectuez l'instantané, puis restaurez la base de données à partir de cet instantané, c'est comme une récupération après incident. J'ai déjà testé la sauvegarde basée sur le stockage EMC avec la technologie d'instantané pour Oracle. C'est très fiable.
fairybetty

Réponses:

2

La documentation que vous avez citée en dit long, mais je ne vous en voudrais pas si vous voulez essayer de vérifier les affirmations du vendeur concernant les instantanés pris en même temps. Peut-être qu'un moyen de découvrir quelque chose pourrait être de tester plus précisément le système WAL .

Par exemple, en plus de vos tests basés sur pgbench, essayez d'ajouter des appels aléatoires pg_switch_xlog()pour forcer la rotation du journal, des intervalles de points de contrôle plus courts et plus longs (raccourcissement et allongement checkpoint_timeoutet checkpoint_timeout) et même en utilisant des tailles de fichier wal petites ou grandes.

À moins que quelque chose me manque, pour vos instantanés non pris en même temps, j'attribuerais peut-être vos bases de données récupérées à un peu de chance. Dans ce dernier cas, imaginez que vous avez pris votre instantané de journal tandis que l'emplacement actuel xlog était, par exemple, 0/A1C0FFEE. Ensuite, vous avez 3 minutes de charge particulièrement lourde sur le système, ce qui provoque un cycle complet à travers les fichiers WAL, et votre base de données est maintenant au 0/DEADBEEFmoment où l'instantané de données est pris. Lorsque vous essayez de restaurer, les fichiers WAL en cours d'écriture au moment de l'instantané de données ont disparu depuis longtemps et la récupération échouera.

atomic77
la source