Wie kann eine RDS-Produktionsinstanz optimal aktualisiert werden?

33

Ich habe eine kleine MySQL-RDS-Instanz als Teil meines Produktionssystems und möchte sie mit bereitgestelltem IOPS auf eine mittlere Instanz aktualisieren.

Als DBA der alten Schule ist mir die Methode "Slave hinzufügen, zum Master heraufstufen, Clients wechseln" bekannt, aber AWS verspricht, einen magischen Ein-Klick-Upgrade-Pfad bereitzustellen, dh "Upgrade-Instanz", "Bereitgestelltes IOPS hinzufügen".

Versucht dies auf Test-RDS-Instanz, Ausfallzeit ist zu lang, IMHO: ca. 5 Minuten für kleine-> mittlere Upgrade und 30 Minuten (!!!) für den Wechsel zu bereitgestellten IOPS.

  • Ist das normales Verhalten?
  • Gibt es eine Möglichkeit, ein Upgrade für Produktions-RDS ohne Ausfallzeit durchzuführen?
  • Empfehlen Sie die Methode "Anhalten; Erstellen eines Snapshots; Wiederherstellen eines Snapshots auf einer größeren Instanz"?
Vitaly
quelle

Antworten:

37

Ein Upgrade einer Instanz in RDS bedeutet, dass RDS die Datenbank physisch auf eine neue Instanz migriert, wahrscheinlich auf einen anderen physischen Host, sodass Ausfallzeiten nicht vermieden werden können. Die Migration auf bereitgestelltes IOPS würde wahrscheinlich bedeuten, dass Ihre Daten auf ein neues EBS-Volume migriert werden (und der Server könnte mit dieser Änderung auch auf eine neue Instanz migriert werden, je nachdem, ob es sich intern um Computer handelt, die mit bereitgestelltem IOPS auf EBS-Volumes zugreifen können physisch von Maschinen getrennt, die sich nicht auf einer anderen Klasse von Netzwerkhardware befinden, so dass wiederum Ausfallzeiten unvermeidlich wären.

Es scheint einen Weg zu geben, um diese Störung zu vermeiden: Eine Multi-AZ-Bereitstellung, die ein unsichtbares und für Sie nicht zugängliches Replikat in einer anderen Verfügbarkeitszone innerhalb der Region erstellt.

Bei Systemaktualisierungen wie dem Patchen von Betriebssystemen oder der Skalierung von DB-Instanzen werden diese Vorgänge vor dem automatischen Failover zuerst im Standby-Modus ausgeführt. Infolgedessen ist Ihre Auswirkung auf die Verfügbarkeit nur auf die Zeit begrenzt, die für den Abschluss des automatischen Failovers erforderlich ist.

- http://aws.amazon.com/rds/multi-az/

Das soll eine schnelle und nahtlose Migration bieten, obwohl ich nicht Gelegenheit hatte diese Fähigkeit zu testen. In der Konsole wird "Ändern" angezeigt, damit Sie eine Instanz in Multi-AZ konvertieren können. Vermutlich würde dies zu einem kurzen Einfrieren der E / A führen, wenn die Instanz geklont wird. Daher würde ich natürlich empfehlen, alle diese Funktionen zu testen, bevor Sie sie ausprobieren.

Alternativ unterstützt RDS einen internen Mechanismus, mit dem Sie den Vorgang "Slave hinzufügen, zum Master heraufstufen, Clients wechseln" emulieren und auf diese Weise eine Ausfallzeitkonvertierung nahe Null erzielen können:

  • Erstellen Sie ein tatsächliches RDS-Lesereplikat Ihrer Datenbank mit der gewünschten Instanzklasse
  • Warten Sie, bis das Replikat online ist und mit dem Master synchronisiert wurde
  • Ändern Sie die Konfiguration des Replikats, um Provisioned IOPS hinzuzufügen
  • Warten Sie, bis das Replikat online ist und mit dem Master synchronisiert wurde
  • Stellen Sie mit Tools von Drittanbietern sicher, dass beide Systeme über identische Daten verfügen
  • Trennen Sie Ihre Anwendung vom alten Master
  • Überprüfen Sie die übereinstimmenden Binlog-Koordinaten auf Master und Replikat, um sicherzustellen, dass alle Anwendungsschreibvorgänge repliziert wurden
  • Teilen Sie die Systeme mit "Read Replica heraufstufen" auf dem neuen Replikat in RDS auf
  • Verbinden Sie Ihre Anwendung mit dem neuen Master

http://aws.amazon.com/about-aws/whats-new/2012/10/11/amazon-rds-mysql-rr-promotion/

Michael - sqlbot
quelle
Michael, vielen Dank für die ausführliche Antwort! Vitaly
Vitaly
Das Heraufstufen eines Lesereplikats zum Master führt zu Ausfallzeiten (die Instanz muss dies melden).
Mahmoud Khateeb
@ MahmoudKhateeb Danke. Das ist richtig. Obwohl es keinen technischen Grund dafür gibt, startet RDS eine Instanz neu, wenn Sie sie zum Master heraufstufen. In der Tat habe ich in den fast 4 Jahren (!?), Seit ich es ursprünglich geschrieben habe, viel mehr über die Funktionsweise von RDS gelernt. Ich werde Änderungen vornehmen.
Michael - sqlbot
Ich mache das am Montag in der Produktion, also könnte ich ein paar Sachen hinzufügen. Ich werde das Replikat im Grunde so ändern, dass es Lese- / Schreibzugriff hat, dann werde ich alle meine Dienste darauf richten und dann den Master aktualisieren.
Mahmoud Khateeb
@MahmoudKhateeb Mit RDS wird beim Heraufstufen einer Replik die Verbindung zum Master dauerhaft getrennt. Sie können den alten Master nicht wieder als Master verwenden. Die alte Replik ist jetzt ein Meister und muss so bleiben. Erstellen Sie jetzt ein Replikat des vorhandenen Replikats (RDS unterstützt Kaskaden). Aktualisieren Sie dann das neue Replikat und das alte Replikat nach Bedarf. Beginnen Sie dann, das neue Replikat als Produktionsreplikat zu verwenden. Bewerben Sie dann Ihr ursprüngliches Replikat und benutze es als neuen Master. Wirf den alten Meister weg.
Michael - sqlbot
4

Selbst in einer Multi-AZ-Umgebung kommt es zu einem Ausfall von 60 bis 120 Sekunden. Dies war der Fall, als ich wiederholt auf unsere RDS-Instanzen traf, während ich ein Upgrade von einem PostgreSQL-db.m3.medium auf ein db.m3.large durchführte.

Wayn E
quelle
2

Es ist auch MÖGLICH, während des Upgrades Ausfallzeiten zu vermeiden. Sie können dies tun, indem Sie einen neuen RDS über einen Snapshot eines gelesenen Replikats kurz starten und ihn als Active / Active-Master-zu-Master-Replikation konfigurieren. Sobald es konfiguriert ist, können Sie den Anwendungsdatenverkehr ohne Ausfallzeit auf jeweils einen APP-Server umschalten. Wir wenden diesen Ansatz jedes Mal an, wenn AWS RDS-Wartungen ankündigt, um Ausfallzeiten sowie planmäßige Wartungen zu vermeiden.

https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2

Hier sind die Details:

M1 - Ursprünglicher Meister

R1 - Replikat der M1 lesen

SNAP1 - Schnappschuss des R1

M2 - Neuer Meister

M2 Erstellungsreihenfolge: M1 → R1 → SNAP1 → M2

  • Da wir das SUPER-Privileg nicht für RDS verwenden können, verwenden wir mysqldump with — master_data2option auf dem M1 nicht. Stattdessen starten wir R1, um die Binlog-Position des M1 zu ermitteln . Erstellen Sie dann einen Snapshot (SNAP1) vom R1 und starten Sie M2 vom SNAP1.

  • Erstellen Sie zwei separate RDS-Parametergruppen mit den folgenden Offsets, um PK-Konflikte zu vermeiden:

    M1: auto_increment_ increment = 4 and auto_increment_offset = 1

    M2: auto_increment_ increment = 4 and auto_increment_offset = 2

  • Erstellen Sie einen Replikationsbenutzer auf M1

    GRANT EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl’@’%’ IDENTIFIED BY PASSWORD <secret>;

1. Erstelle R1 aus M1

-- Connect to the R1 and stop replication
   CALL mysql.rds_stop_replication;
-- Obtain M1’s (!!) current binlog file and position 
        `mysql> show slave status\G
             Master_Log_File: mysql-bin.000622
             Exec_Master_Log_Pos: 9135555

2. Erstellen Sie SNAP1 aus R1

  • Erstellen Sie M2 aus dem SNAP1 mit den von M1 erhaltenen Attributen

  • Weisen Sie M2 eine Parametergruppe mit einem anderen auto_increment_offset als M1 zu, um Konflikte mit M / M-Replikationsschlüsseln zu vermeiden

4. Richten Sie die M / M-Replikation ein

-- Configure M2 as a slave of M1
CALL mysql.rds_set_external_master (‘m1.xyxy24.us-east-1.rds.amazonaws.com’, 3306, repl’, mypassword’, mysql-bin.000622, 9135555, 0);
CALL mysql.rds_start_replication;
-- Connect to M2 and obtain its current binlog file and position
         mysql> show master status\G
            File: mysql-bin.004444
            Position: 6666622
-- Connect to M1 and configure it to be a slave of the M2
CALL mysql.rds_set_external_master (‘m2.xyxy24.us-east-1.rds.amazonaws.com’, 3306 , repl’, mypassword’, mysql-bin.004444, 6666622, 0);
CALL mysql.rds_start_replication;

5. Löschen Sie R1 und SNAP1, da sie nicht mehr benötigt werden

6. Aktualisieren Sie M2 über die AWS Console

Verwenden Sie die Standardprozedur, um die Instanz gemäß Ihren Anforderungen zu ändern.

7. Führen Sie eine ordnungsgemäße Umschaltung auf M2 durch

Da die M / M-Replikation erfolgreich eingerichtet wurde, können wir die DB-Wartung ohne Ausfallzeiten fortsetzen, indem wir jeweils einen App-Server ordnungsgemäß wechseln.

Hier erfahren Sie mehr darüber, wie es funktioniert.

https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2

Dmitriy Royzenberg
quelle
1

Dies würde funktionieren, Sie müssen jedoch sicherstellen, dass die Endpunkte der RDS-Instanz in Ihrer Anwendung nicht als statischer Eintrag konfiguriert sind. Durch Tauschen von RDS werden die Endpunkte geändert.

Anup Singh
quelle
1
Bitte geben Sie Ihrer Antwort mehr Substanz, wie zum Beispiel einige Verweise, um Ihre Antwort und / oder erweiterte Argumentation zu unterstützen.
Erik