Heute Morgen war ich an der Aktualisierung einer PostgreSQL-Datenbank auf AWS RDS beteiligt. Wir wollten von Version 9.3.3 auf Version 9.4.4 umsteigen. Wir haben das Upgrade für eine Staging-Datenbank "getestet", aber die Staging-Datenbank ist viel kleiner und verwendet Multi-AZ nicht. Es stellte sich heraus, dass dieser Test ziemlich unzureichend war.
Unsere Produktionsdatenbank verwendet Multi-AZ. In der Vergangenheit haben wir kleinere Versions-Upgrades durchgeführt. In diesen Fällen aktualisiert RDS zuerst den Standby-Modus und befördert ihn dann zum Master. Die einzige Ausfallzeit während des Failovers beträgt daher ~ 60 Sekunden.
Wir gingen davon aus, dass dies auch für das Hauptversions-Upgrade passieren würde, aber wie falsch wir waren.
Einige Details zu unserem Setup:
- db.m3.large
- Bereitgestelltes IOPS (SSD)
- 300 GB Speicher, davon 139 GB
- Wir hatten ausstehende RDS-Betriebssystem-Upgrades. Wir wollten dieses Upgrade stapelweise ausführen, um Ausfallzeiten zu minimieren
Hier sind die RDS-Ereignisse, die während des Upgrades protokolliert wurden:
Die CPU der Datenbank wurde zwischen 08:44 und 10:27 Uhr ausgelastet. Ein Großteil dieser Zeit schien mit der Erstellung eines Pre-Upgrade- und Post-Upgrade-Snapshots durch RDS belegt zu sein.
Die AWS-Dokumente warnen nicht vor solchen Auswirkungen, obwohl es nach dem Lesen klar ist, dass ein offensichtlicher Fehler in unserem Ansatz darin besteht, dass wir im Multi-AZ-Setup keine Kopie der Produktionsdatenbank erstellt und versucht haben, sie als zu aktualisieren ein Probelauf
Im Allgemeinen war es sehr frustrierend, weil RDS uns nur sehr wenige Informationen darüber gab, was es tat und wie lange es wahrscheinlich dauern würde. (Auch hier hätte ein Probelauf geholfen ...)
Abgesehen davon möchten wir aus diesem Vorfall lernen. Hier sind unsere Fragen:
- Ist dies normal, wenn Sie ein Hauptversions-Upgrade für RDS durchführen?
- Wie würden wir vorgehen, wenn wir in Zukunft ein größeres Versions-Upgrade mit minimalen Ausfallzeiten durchführen möchten? Gibt es eine clevere Möglichkeit, die Replikation nahtloser zu gestalten?
quelle
ANALYZE
zur Aktualisierung der Statistiken löste es. Wenn jemand einen Einblick darüber hat, wäre das auch großartig.Antworten:
Dies ist eine gute Frage,
denn die Arbeit in einer Cloud-Umgebung ist manchmal schwierig.
Sie können einen
pg_dumpall -f dump.sql
Befehl verwenden, mit dem Ihre gesamte Datenbank in ein SQL-Dateiformat gesichert wird. Auf diese Weise können Sie sie von Grund auf neu erstellen und auf einen anderen Endpunkt verweisen. Verwenden Siepsql -h endpoint-host.com.br -f dump.sql
für kurze.Dazu benötigen Sie jedoch eine EC2-Instanz mit ausreichend Speicherplatz auf der Festplatte (passend für Ihren Datenbank-Dump). Außerdem müssen Sie installieren
yum install postgresql94.x86_64
, um Sicherungs- und Wiederherstellungsbefehle ausführen zu können.Siehe Beispiele bei PG Dumpall DOC .
Denken Sie daran, dass es zur Wahrung der Integrität Ihrer Daten empfohlen wird (in einigen Fällen ist dies obligatorisch), die Systeme, die eine Verbindung zur Datenbank herstellen, während dieses Wartungsfensters herunterzufahren.
Wenn Sie Dinge beschleunigen müssen, ziehen Sie
pg_dump
stattdessen die Verwendung in Betracht , indem Sie den Parameterpg_dumpall
parallelism (-j njobs
) nutzen, wenn Sie die Anzahl der am Prozess beteiligten CPUs bestimmen, die beispielsweise-j 8
bis zu 8 CPUs verwenden. In der Standardeinstellung das Verhaltenpg_dumpall
oderpg_dump
ist die Verwendung nur 1. Der einzige Vorteil durch die Verwendungpg_dump
stattdessenpg_dumpall
ist , dass Sie den Befehl für jede Datenbank ausgeführt werden müssen , dass Sie haben, und Dump auch die Rollen (Gruppen und Benutzer) getrennt.Siehe Beispiele unter PG Dump DOC und PG Restore DOC .
quelle
pg_dump -h host -U user -W pass -Fc -f output_file.dmp -j 8 database_name
pg_restore -h host -d database_name -U user -W pass -C -Fc -j 8 output_file.dmp