Wie kann ich die Hauptversion einer AWS RDS-Postgres-Datenbank nahtlos aktualisieren?


13

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:

Bildbeschreibung hier eingeben

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?

Nach dem Upgrade ist uns aufgefallen, dass postgres versucht hat, einige Tabellen mit Millionen von Datensätzen nacheinander zu durchsuchen, wobei stattdessen ein Index hätte verwendet werden müssen (wodurch unser Abfragezeitlimit überschritten wurde). Ein Handbuch ANALYZEzur Aktualisierung der Statistiken löste es. Wenn jemand einen Einblick darüber hat, wäre das auch großartig.
Jonleighton

Antworten:


4

Dies ist eine gute Frage,
denn die Arbeit in einer Cloud-Umgebung ist manchmal schwierig.

Sie können einen pg_dumpall -f dump.sqlBefehl 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 Sie psql -h endpoint-host.com.br -f dump.sqlfü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_dumpstattdessen die Verwendung in Betracht , indem Sie den Parameter pg_dumpallparallelism ( -j njobs) nutzen, wenn Sie die Anzahl der am Prozess beteiligten CPUs bestimmen, die beispielsweise -j 8bis zu 8 CPUs verwenden. In der Standardeinstellung das Verhalten pg_dumpalloder pg_dumpist die Verwendung nur 1. Der einzige Vorteil durch die Verwendung pg_dumpstattdessen pg_dumpallist , 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 .


Um die parallele Funktion nutzen zu können, benötigen Sie:pg_dump -h host -U user -W pass -Fc -f output_file.dmp -j 8 database_name
Vinnix

... und mit Parallelität wiederherstellen:pg_restore -h host -d database_name -U user -W pass -C -Fc -j 8 output_file.dmp
Vinnix

Können Sie nicht einfach eine neue rds-Instanz aus einem Snapshot Ihrer Produktionsumgebung erstellen?
Anfänger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.