1

Meine Anwendung auf einen MySQL 5.6 Failover-Cluster aus zwei verbindet (eigentlich Amazon Aurora) Instanzen. Der aktive Knoten ist immer schreibbar, während der passive im Modus read_only läuft (dies unterscheidet sich vom kanonischen MySQL Failover-Cluster, in dem standardmäßig alle Slave-Knoten schreibbar sind). Amazon RDS stellt einen symbolischen DNS-Namen zur Verfügung, der immer auf die IP-Adresse des aktiven Knotens MySQL verweist.Das Entfernen Verbindungen zu einem Nur-Lese-Knoten in einem Cluster aus dem Verbindungspool

Während des Failover-Prozesses wird der vorherige Master im read_only-Modus neu gestartet, während der vorherige passive Knoten schreibbar wird und zum Master hochgestuft wird. Außerdem werden die DNS-Einträge geändert, sodass der DNS-Name eines Clusters jetzt auf den neuen Hauptknoten verweist.

Auch wenn ich völlig deaktivieren DNS-Caching auf Java-Seite (via sun.net.inetaddr.ttl oder networkaddress.cache.ttl), OS-spezifischen DNS-Caching noch wirksam ist, so, nachdem die Datenbank-Failover-I vollen Verbindungen zum Lesen meines DBCP Pool am Ende mit -only MySQL Instanz. Diese Verbindungen sind valid, d. e. sie wurden erhalten nach der Failover abgeschlossen, aber vor der DNS-Cache abgelaufen. Darüber hinaus hat keine dieser Verbindungen readOnly Flag gesetzt, so kann ich nicht sagen, ob ich mit einer schreibgeschützten Instanz sprechen, bis ich einige DML ausführen, die ER_OPTION_PREVENTS_STATEMENT kommt in seiner ganzen Pracht ist. Auch wenn ich explizit eine Verbindung zu einem Lese-Schreib-Modus durch Aufruf von setReadOnly(false) setze und das Flag readOnlyPropagatesToServer setze, führt dies nur dazu, dass ein Treiber SET SESSION TRANSACTION READ WRITE an den Server sendet, was zu keiner Ausnahme führt.

Ich möchte dieses Problem mit so wenig Anwendungslogik wie möglich lösen. Dies könnte erreicht werden, wenn es eine Möglichkeit gäbe, eine Verbindung zu einer schreibgeschützten Instanz als eine ungültige/geschlossene Verbindung zu behandeln (dh sie aus dem Pool zu entfernen).

Kann ich eine validation query wie SHOW GLOBAL VARIABLES LIKE 'read_only' mit einer zusätzlichen Logik verbunden haben? Ist es möglich, das Verhalten des Pools w.r.t eine Verbindung zu beeinflussen, basierend auf welchem ​​skalaren Wert die Validierungsabfrage zurückgibt?

+1

Wie wäre es mit 'select @@ read_only als col1;' – Drew

+0

@Drew Ja, das hat den gleichen Effekt wie 'SHOW GLOBAL VARIABLES LIKE 'read_only'', aber wie erzwinge ich, dass der Pool eine Verbindung löscht, wenn' read_only' ist "ON"? – Bass

Antwort

2

Die folgende Validierungs Abfrage verwendet werden kann:

select case when @@read_only = 0 then 1 else (select table_name from information_schema.tables) end as `1` 

Wenn die Datenbank im schreibgeschützten Modus ausgeführt wird, wird die Abfrage mit

ERROR 1242 (21000): Subquery returns more than 1 row 

Seit Amazon Aurora Sets innodb_read_only scheitert aber nicht read_only auf dem Leserendpunkt in einem Cluster, kann die Validierungsabfrage als

umgeschrieben werden

Inspiriert von this beantworten.

Verwandte Themen