PostgreSQL: Kann ich pg_start_backup () in einer laufenden Datenbank unter Last ausführen?

19

Unsere eingerichtete Replikation ist unterbrochen ("angefordertes WAL-Segment wurde bereits entfernt" während der Ausfallzeit). Der Master kann nicht einfach wieder angehalten werden.

Können wir

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ meister zum sklaven,
  3. pg_stop_backup()

... während der Master-Postgresql noch unter Volllast ist? (Oder wird dazu pg_start_backup()führen,

  • Tischschlösser,
  • E / A-Blöcke,
  • inkonsistenzen,
  • Feueralarm,
  • langsame db Antwort

Mit anderen Worten, wird sich dies pg_start_backup()auf unsere Bewerbung auswirken?

Daniel
quelle
Haben Sie die Dokumente überprüft ? Er sagt , „standardmäßig pg_start_backup eine lange Zeit bis zum Ende nehmen. Das ist , weil es einen Kontrollpunkt durchführt, und das I / O , die für den Kontrollpunkt wird über einen längeren Zeitraum verteilt wird aus, die standardmäßig die Hälfte Ihres inter-checkpoint interval (siehe den Konfigurationsparameter checkpoint_completion_target). Dies ist normalerweise das, was Sie möchten, da es die Auswirkungen auf die Abfrageverarbeitung minimiert. " Was dies in der Praxis (und in Ihrem Fall) bedeutet, ist jedoch nicht ganz klar.
Dezso

Antworten:

11

pg_start_backupführt einen Checkpoint durch, wie dezso feststellt. Dies hat zwar Auswirkungen, aber Ihre Datenbank führt Checkpoints ohnehin regelmäßig durch und muss dies auch tun, um zu funktionieren. Sie sind also eindeutig kein Problem für Sie. Ein früher Checkpoint bedeutet, dass weniger Daten gesammelt wurden, was bedeutet, dass ein Checkpoint von pg_start_backupgeringerer Auswirkung als normal ist.

Wenn Sie sich Sorgen machen müssen, ist der rsync oder ein gleichwertiger pg_basebackupSchritt. Die Lese-E / A-Vorgänge hiervon werden nicht allzu schlecht sein, da sie sequentiell ablaufen. Wahrscheinlich beeinträchtigt sie jedoch die E / A-Leistung Ihrer Datenbank erheblich. Außerdem werden heiße Daten aus dem RAM-Cache eher zugunsten von weniger gedrängt -verwendete Daten, wodurch der Cache überlastet wird, wenn die benötigten Daten wieder eingelesen werden.

Sie können niceund verwenden ionice, um die Auswirkungen der E / A zu begrenzen (jedoch nicht die Auswirkungen auf den Cache). Dies ist jedoch mit Kosten verbunden. Die Sicherung dauert länger, und bis Sie die Sicherung abgeschlossen und pg_stop_backupIhr System ausgeführt haben, sammelt sich - so wie ich es verstehe - die WAL an, die nicht gelöscht werden kann, und es sammelt sich die Prüfpunktverschuldung für einen BIG-Prüfpunkt am Ende des Sicherungslaufs an. Außerdem werden Tabelle und Index angesammelt Aufblähen, weil es tote Reihen nicht aufräumen kann. Sie können es sich also wirklich nicht leisten, das Backup für immer dauern zu lassen, besonders wenn Sie sehr hohe Churn-Tabellen haben.

Letztendlich ist es schwer zu sagen, ob Sie in Ihrer Umgebung gefahrlos pg_start_backupund pg_stop_backupfür Hot-Backups verwenden können. Die meisten Leute können, aber wenn Sie sich dem nähern, was Ihre Hardware leisten kann, enge Timing-Anforderungen haben, sich das Risiko eines Stalls nicht leisten können und sowohl sehr hohe Churn-Tische als auch sehr große Tische haben, kann dies problematisch sein .

Leider müssen Sie es so ziemlich testen und sehen.

Wenn möglich, ist es möglicherweise sinnvoll CHECKPOINT, einen atomaren Snapshot des Volumes zu erstellen, auf dem sich Ihre Datenbank befindet. Verwenden Sie stattdessen LVM, die Tools Ihres SAN, EBS oder was auch immer Sie gerade verwenden. In diesem Fall können Sie den Schnappschuss nach Belieben kopieren. Dieser Ansatz eignet sich nicht für eine Basissicherung für PITR / Warm-Standby / Hot-Standby, eignet sich jedoch perfekt für eine statische Sicherungskopie und hat eine wesentlich geringere Auswirkung auf das System. Sie können dies jedoch nur tun, wenn Ihre Snapshots atomar sind und sich Ihre gesamte Datenbank einschließlich WAL auf einem einzigen Volume befindet.

Eine Möglichkeit, die ich noch nicht untersucht habe, ist die Kombination der beiden Ansätze. Mir fällt ein, dass man möglicherweise ( ungetestet und möglicherweise falsch und unsicher , ich weiß es noch nicht):

  • pg_start_backup
  • Löst Snapshots aller Tablespaces, des Hauptdatenverzeichnisses und des xlog-Volumes aus
  • pg_stop_backup
  • Kopieren Sie WAL bis zum endgültigen Archiv von pg_stop_backup
  • Kopieren Sie die Daten von den Snapshot-Volumes

Im Wesentlichen besteht die Idee darin, die Verzögerungszeit der DB für die Checkpoints zu verringern, indem Sie einen Zeitpunkt für jedes Volume festlegen, das Sie nach Belieben kopieren können.

Craig Ringer
quelle
Nachdem wir verstanden haben, dass es sich bei pg_start_backup () hauptsächlich um "kontrolliertes Checkpointing" handelt, haben wir uns das Vertrauen erarbeitet, es einfach zu versuchen und zu sehen. Es scheint, dass die Auswirkungen auf die laufende Anwendung vernachlässigbar waren. (master main datadir on SSD) :-) Die "ungetestete und möglicherweise unsichere" Idee, die Sie vorgeschlagen haben, liegt etwas über unserem Kompetenzniveau und unserer Abenteuerlust.
Daniel
Oh, und wir haben den Rsync beim ersten Versuch nicht ausgelöst. Weil wir eigentlich die zusätzliche Belastung des Masters sehen wollten. Da wir nie einen zweiten Rsync-Lauf benötigten, ist alles in Ordnung. Daraus haben wir etwas gelernt.
Daniel
7

Dies ist ein Grab, aber ich muss hier etwas korrigieren.

Die vorherige Antwort lautet:

Sie können nice and ionice verwenden, um die Auswirkungen der E / A zu begrenzen (nicht jedoch die Auswirkungen auf den Cache). Dies ist jedoch mit Kosten verbunden. Die Sicherung dauert länger, und bis Sie die Sicherung abgeschlossen haben und pg_stop_backup ausführen, sammelt Ihr System - so wie ich es verstehe - WAL, das nicht gelöscht werden kann, Checkpoint-Schulden für einen BIG-Checkpoint am Ende des Sicherungslaufs an und Tabelle und index aufblähen, weil es tote Zeilen nicht bereinigen kann. Sie können es sich also wirklich nicht leisten, das Backup für immer dauern zu lassen, besonders wenn Sie sehr hohe Churn-Tabellen haben.

Das ist nicht wahr. Das System behält die in Ihrer Konfiguration angegebene WAL-Nummer (siehe Online-Dokumentation ). Der höhere Wert zwischen:

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

Stellen wir uns diesen Fall vor:

  • Ihre Sicherung nimmt viel Zeit in Anspruch, da Sie Hunderte von Auftritten kopieren müssen
  • Sie haben eine kleine WAL-Aufbewahrung (checkpoint_segments bis 3, zum Beispiel)
  • Sie haben die WAL-Archivierung nicht eingerichtet

Nach dem Start von "pg_start_backup ()" werden Ihre WAL-Dateien während der Sicherung rotieren. Wenn Ihre Sicherung abgeschlossen ist, versuchen Sie, sie auf einem anderen Datenbankmodul wiederherzustellen. Die Engine fragt beim Start nach mindestens der WAL-Datei, die bei der Ausgabe von "pg_start_backup ()" generiert wurde.

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

Die Datenbank akzeptiert das Booten erst, wenn Sie die WAL-Datei "0000000x0000000B000000D0" (wobei x Ihre TimelineID ist ) bereitstellen . Diese WAL-Datei ist das absolute Minimum für den Systemstart. Natürlich verlieren Sie nur mit dieser Datei Daten, da sich der Rest der Daten in den WAL-Dateien befindet, die Sie nicht haben, aber zumindest haben Sie eine funktionierende Datenbank-Engine.

Entweder müssen Sie die WAL-Archivierung durchführen oder Sie müssen die benötigten WAL-Dateien selbst speichern, Postgresql erledigt dies jedoch nicht für Sie.

Sterfield
quelle
3
Sehr gute Beobachtung. Dies kann jedoch vermieden werden, pg_basebackup --xlog-method=streamwenn ich mich nicht irre.
morgen,
2
Ja, seit PG 9.2 können Sie die WAL mit der Basissicherung streamen. Es wird ein zweiter Stream geöffnet, daher müssen Sie ein max_wal_sendersMinimum von 2 festlegen. Dies ist eine gute Möglichkeit, um das "fehlende WAL" -Problem am Ende des Backups zu vermeiden.
Sterfield
4

Was meine Erfahrungen mit PostgreSQL betrifft, ist es ein relativ sicherer Betrieb, es sei denn, Sie haben in diesem Moment einen großen Einfluss auf die Leistung. Wenn Sie es haben, ist es besser, das Schreiben aller Ihrer Kunden vorübergehend anzuhalten.

Ich hatte nur einen kritischen Fall, als ich meinen Master mit dem Slave unter Last synchronisierte, und dies wurde durch OOM Killer verursacht (ja, Sie sollten OOM Killer auf Datenbankknoten wirklich VOLLSTÄNDIG deaktivieren, ich wusste es an diesem Tag nicht).

Also habe ich die Datenbank von der nächtlichen Sicherung wiederhergestellt und alle WAL-Segmente aus dem Verzeichnis pg_archive zur Wiedergabe an postgres übergeben (einfach in den Ordner pg_xlog kopiert). Alles lief gut, aber Ausfallzeiten waren natürlich unvermeidlich.

Riki_tiki_tavi
quelle