Warum erhalte ich nach einem Failover eines Aurora MySQL-kompatiblen DB-Clusters einen schreibgeschützten Fehler?
Ich möchte wissen, warum ich eine schreibgeschützte Fehlermeldung erhalte, wenn mein Amazon Aurora MySQL-kompatibles Edition-DB-Cluster einen Failover durchführt.
Kurzbeschreibung
Wenn bei einem Aurora MySQL-kompatiblen DB-Cluster ein Multi-AZ-Failover auftritt, werden die Cluster-Endpunkte automatisch aktualisiert. Der alte Writer wird neu gestartet und in den schreibgeschützten Modus versetzt, und dann stuft Aurora ein vorhandenes Replikat zu einem Writer hoch. Die Endpunkte spiegeln diese Veränderung wider und weisen auf die neuen Rollen von Writern und Readern hin.
Möglicherweise erhältst du eine schreibgeschützte Fehlermeldung, wenn du die Writer-Rolle verwendest, um eine der folgenden Operationen über einen vorhandenen Knoten auszuführen:
- Data Definition Language (DDL)-Vorgang
- Data Manipulation Language (DML)-Vorgang
- Data Control Language (DCL)-Vorgang
Lösung
Überprüfe, ob die Rolle schreibgeschützt ist
Um zu überprüfen, ob die Rolle schreibgeschützt ist, verwende die Variable innodb_read_only.
Beispielausgabe:
mysql> show variables where variable_name='innodb_read_only';+------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | ON | +------------------+-------+ 1 row in set (0.01 sec)
Den Cluster-Writer-Endpunkt verwenden
Die Rolle einer DB-Instance in einem Aurora MySQL-Cluster kann sich ändern. Es hat sich bewährt, den Cluster-Writer-Endpunkt zu verwenden, um sicherzustellen, dass du immer auf den neuesten Writer verweist. Wenn du einen DB-Instance-Endpunkt oder eine direkte IP-Adresse verwendest, weißt du möglicherweise nicht, dass ein Failover stattfindet. Wenn du erneut eine Verbindung mit demselben Host herstellst, erhältst du einen schreibgeschützten Fehler und du kannst keine DDL- oder DML-Änderungen vornehmen.
DNS nicht übermäßig zwischenspeichern
Wenn du keinen intelligenten Treiber verwendest, bist du darauf angewiesen, dass die DNS-Einträge aktualisiert und weitergegeben werden, nachdem ein Failover-Ereignis eingetreten ist. Aurora MySQL-DNS-Zonen verwenden eine kurze Time-to-Live (TTL) von 5 Sekunden. Deine Netzwerk- und Client-Konfigurationen dürfen die TTL nicht erhöhen. DNS-Caching erfolgt auf mehreren Ebenen einer Architektur, z. B. auf dem Betriebssystem (OS), der Netzwerkebene oder dem Anwendungscontainer. Wenn das DNS-Caching länger als 5 Sekunden unbeabsichtigt erfolgt, stelle nach einem Failover möglicherweise wieder eine Verbindung zum alten Writer her.
Java Virtual Machines (JVM) können DNS übermäßig zwischenspeichern. Wenn die JVM einen Hostnamen in eine IP-Adresse auflöst, speichert sie die IP-Adresse für einen bestimmten Zeitraum im Cache. In einigen Konfigurationen aktualisiert die JVM-Standard-TTL DNS-Einträge nur, wenn die JVM neu gestartet wird, und kann nach einem Failover zu schreibgeschützten Fehlern führen. Um dieses Problem zu beheben, lege manuell eine kleine TTL fest, sodass die DNS-Einträge regelmäßig aktualisiert werden.
Verwende den AWS Advanced JDBC-Treiber
Aurora MySQL-DB-Cluster-Endpunkte übertragen DNS-Datensatzaktualisierungen automatisch. Wenn ein Ereignis in der Datenbank auftritt, kann es zu einer Verzögerung bei der Aktualisierung des DNS-Eintrags kommen. In diesem Fall verarbeitet die Anwendung das Ereignis.
Der AWS Advanced JDBC (Java Database Connectivity) Wrapper-Treiber verwendet die DB-Cluster-Topographie über die Metadatentabelle INFORMATION_SCHEMA.REPLICA_HOST_STATUS. Da sich die Tabelle nahezu in Echtzeit befindet, leitet der AWS Advanced JDBC Wrapper-Treiber Verbindungen an die entsprechende Rolle weiter. Es wird auch ein Lastenausgleich zwischen den vorhandenen Replikaten durchgeführt. Verwende das Proxy-Muster in Java, um den AWS Advanced JDBC Wrapper zu implementieren. Du musst die nativen Aurora MySQL-Treiber als Abhängigkeiten hinzufügen. Weitere Informationen findest du unter Proxy-Muster in Java auf der Baeldung-Website. Du kannst den AWS Advanced JDBC Wrapper von der GitHub-Website herunterladen.
Weitere Informationen findest du unter Eine Ausfallzeit von einer Sekunde oder weniger erzielen mit dem Advanced JDBC Wrapper-Treiber beim Upgrade von Amazon RDS Multi-AZ-DB-Clustern.
Hinweis: Übermäßiges DNS-Caching kann sich auf den AWS Advanced JDBC Wrapper-Treiber auswirken. Weitere Informationen findest du unter Verbessern der Anwendungsverfügbarkeit auf Amazon Aurora.
Teste die Instance, mit der du verbunden bist
Wenn du keinen intelligenten Treiber verwendest, teste die Instance, nachdem du eine neue Verbindung hergestellt hast. Um zu testen, ob du mit der Writer-Instance verbunden bist, verwende die Variable @@innodb_read_only. Wenn du den Wert 0 erhältst, bist du mit dem Writer verbunden.
Beispielausgabe:
mysql> select @@innodb_read_only;+--------------------+ | @@innodb_read_only | +--------------------+ | 0 | +--------------------+ 1 row in set (0.00 sec)
Ähnliche Informationen
- Tags
- Aurora MySQL
- Sprache
- Deutsch
