Meine RDS-Instanz wird von meiner EC2-Instanz überflutet, aber meine EC2-Instanz läuft reibungslos

Meine RDS-Instanz wird von meiner EC2-Instanz überflutet, aber meine EC2-Instanz läuft reibungslos

Ich habe ein ziemlich kompliziertes Setup in meiner AWS-Konsole.

  1. Ich habe eine EC2-Instanz in Region A mit installiertem LAMP für das, was ich mein CRM nennen werde.
  2. Ich habe für mein CRM ein RDS in derselben Region A, das die Informationen zu meinen Bestellungen/Kunden enthält.
  3. Ich habe eine EC2-Instanz in Region B mit installiertem LAMP, die ich meinen „Warenkorb“ nennen werde.
  4. Ich habe einen RDS in der gleichen Region B mit der Datenbank für meinen Einkaufswagen.
  5. Ein eher unwichtiges Detail (glaube ich): Ich habe zwei weitere EC2-Instanzen in den Regionen C und D mit installiertem LAMP, die sekundäre „Einkaufswagen“ sind. Sie haben auch ihre eigenen RDS-Instanzen.

Die beiden primären EC2-Server sind über CURL-Aufrufe miteinander verbunden. Wenn also eine Bestellung auf meinem EC2-Server B eingeht, wird ein Curl-Aufruf an meinen EC2-Server A gesendet, um die Bestellung einzugeben, Kundeninformationen hinzuzufügen usw. Außerdem kann mein Server A CURL-Aufrufe an meinen Server B senden, um Preise zu aktualisieren usw. Server B kann CURL-Aufrufe an Server A senden, um aktuelle Versandpreise in eine Stadt abzurufen.

Mein Problem ist, dass meine RDS B-Instanz gestern gegen 4 Uhr morgens mit Verbindungen überflutet wurde und ihr Limit von 50 gleichzeitigen Verbindungen überschritten hat. Ich habe also von t2.small auf t2.medium aktualisiert und habe jetzt 90 gleichzeitige Verbindungen, aber das Problem besteht weiterhin und ich erreiche ständig das Limit von 90 Verbindungen, und zwar alle paar Minuten bis hin zu einer halben Stunde.

Ich habe auch meine EC2 A-Instanz aktualisiert, aber auch das ändert nichts. Wenn ich Folgendes auf meiner RDS B-Instanz ausführe, erhalte ich normalerweise 6-10 Threads, aber gelegentlich kommt es zu Spitzen, und wenn das passiert, erreicht es normalerweise innerhalb von ein oder zwei Minuten 90 Verbindungen.

Status anzeigen wie „Threads_connected“;

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 6     |
+-------------------+-------+
1 row in set (0.01 sec)

Das Ausführen des folgenden Befehls auf meiner RDS B-Instanz zeigt, dass Verbindungen getrennt werden, wenn ich das Limit von 90 gleichzeitigen Verbindungen erreiche:

Status wie „Conn%“ anzeigen;

+-----------------------------------+--------+
| Variable_name                     | Value  |
+-----------------------------------+--------+
| Connection_errors_accept          | 0      |
| Connection_errors_internal        | 0      |
| Connection_errors_max_connections | 6856   |
| Connection_errors_peer_address    | 0      |
| Connection_errors_select          | 0      |
| Connection_errors_tcpwrap         | 0      |
| Connections                       | 123258 |
+-----------------------------------+--------+
7 rows in set (0.03 sec)

Immer wenn ich 90 Verbindungen auf RDS B erreiche, wird meine EC2 A-Instanz immer langsamer und die Verbindungen auf der RDS A-Instanz spitzen sich zu. Und meine EC2 B-Instanz sendet HTTP 500-Fehler, weil die MySQLI-Verbindung aufgrund zu vieler Verbindungen fehlgeschlagen ist.

Wenn ich schließlich Folgendes auf RDS A- oder RDS B-Instanzen ausführe, sehe ichvielevon schlafenden Befehlen, aber kaum jemals eine Abfrage:

VOLLSTÄNDIGE PROZESSLISTE ANZEIGEN;

Die vorübergehende „Lösung“, die ich gefunden habe, besteht darin, den Apache-Dienst auf der EC2 A-Instanz neu zu starten. Sobald ich das mache, werden alle Prozesse auf RDS A und B innerhalb weniger Sekunden gelöscht.

Ich verstehe nicht, wie das plötzlich passieren konnte, und wie es auch nach der Leistungssteigerung meiner Instanzen weiterhin passieren kann. Ich weiß nicht, wo ich als nächstes suchen soll. Das einzige „Problem“, das ich meines Wissens habe, ist, dass mein RDS-Verbindungslimit erreicht wird. Die durchschnittliche EC2-Last ist sehr gut (derzeit 0,02). Soweit ich mich erinnern kann, habe ich in der letzten Woche keinen Code geändert.

Antwort1

Nach ungefähr 8 Stunden Suche habe ich dieses Problem endlich gefunden. Ein Freelancer hatte auf einer meiner Websites einen fehlerhaften Code eingeschleust, der MySQL-Verbindungen nicht schließen konnte.

Hoffentlich hilft das jemand anderem weiter. Wenn Sie in einer ähnlichen Situation sind, suchen Sie auf dem Server nach kürzlich geänderten Dateien mit:

find . -type f -mtime -$n

Dabei $nist eine Ganzzahl, die die Anzahl der Tage angibt, seit denen die Probleme aufgetreten sind. Führen Sie diesen Befehl in dem Verzeichnis aus, in dem die Änderung vermutlich stattgefunden hat.

verwandte Informationen