Wie kann ich die maximale Anzahl der Verbindungen meiner Instance in Amazon RDS für MySQL oder Amazon RDS für PostgreSQL erhöhen?

Lesedauer: 8 Minute
0

Ich möchte die maximale Anzahl der Verbindungen für meine DB-Instance im Amazon Relational Database Service (Amazon RDS) für MySQL oder Amazon RDS für PostgreSQL erhöhen.

Lösung

Den aktuellen Wert von max_connections anzeigen

In Amazon RDS für MySQL überwacht die Metrik max_connections die festgelegte maximale Anzahl (erlaubter) gleichzeitiger Client-Verbindungen.

Standardmäßig basiert der Parameter max_connections auf der folgenden Formel in Amazon RDS für MySQL (berechnet aus dem Wert DBInstanceClassMemory):

max_connections = DBInstanceClassMemory/12582880

Um den aktuellen Wert von max_connections zu überprüfen, führen Sie den folgenden Befehl aus, nachdem Sie eine Verbindung zu Ihrer Instance in Amazon RDS für MySQL hergestellt haben:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

In Amazon RDS für PostgreSQL überwacht die Metrik max_connections die festgelegte maximale Anzahl gleichzeitiger Verbindungen. Standardmäßig basiert der Parameter max_connections auf der folgenden Formel in Amazon RDS für PostgreSQL (berechnet aus dem Wert DBInstanceClassMemory):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

Um den aktuellen Wert von max_connections zu überprüfen, führen Sie den folgenden Befehl aus, nachdem Sie eine Verbindung zu Ihrer Instance in Amazon RDS für PostgreSQL hergestellt haben:

postgres=> show max_connections;

Der Standardwert von max_connections für RDS für MySQL und RDS für PostgreSQL hängt von der Instance-Klasse der Amazon-RDS-Instance ab. Eine DB-Instance-Klasse mit mehr verfügbarem Speicher unterstützt eine größere Anzahl von Datenbankverbindungen.

Beachten Sie, dass die mit der Formel berechnete Standardanzahl von max_connections geringfügig von der Anzahl der Standardverbindungen abweichen kann, die vom vorherigen Befehl zurückgegeben wurden. Dies liegt daran, dass ein Teil des Speichers aus dem gesamten DBInstanceClassMemory für die zugrunde liegenden Betriebssystemoperationen reserviert ist. Der vorhergehende Befehl berücksichtigt nur den Speicher, der für die PostgreSQL-Engine reserviert ist und nicht für das zugrunde liegende Host-Betriebssystem.

Gründe für zu viele Verbindungen überprüfen

Wenn die Anzahl der Client-Verbindungen den Wert max_connections überschreitet, erhalten Sie Fehlermeldungen folgender Art:

Die folgenden Faktoren könnten dazu führen, dass Ihre Datenbankverbindungen den Wert max_connections überschreiten:

Erhöhung der Anzahl der Client- oder Anwendungsverbindungen zur DB-Instance: Dies wird durch eine erhöhte Workload oder Sperrung auf Tabellen-/Zeilenebene verursacht.

Unsachgemäßes Schließen einer Client- oder Anwendungsverbindung nach dem Ende eines Vorgangs: Wenn eine Serververbindung nicht ordnungsgemäß geschlossen wird, öffnet die Client-Anwendung eine neue Verbindung. Im Laufe der Zeit können diese neuen Serververbindungen dazu führen, dass Ihre Instance den Wert max_connections überschreitet. Um alle aktiven Verbindungen für Ihre DB-Instance in RDS für MySQL aufzulisten, führen Sie den folgenden Befehl aus:

SHOW FULL PROCESSLIST

Um die Verbindungen für jede Datenbank für Ihre Instance in RDS für PostgreSQL anzuzeigen, führen Sie den folgenden Befehl aus:

SELECT datname, numbackends FROM pg_stat_database;

Schlafende Verbindungen: Schlafende Verbindungen, die auch als inaktive offene Verbindungen bezeichnet werden, werden verursacht, wenn Sie höhere Werte für Verbindungstimeout-Parameter wie wait_timeout oder interactive_timeout in MySQL festlegen. Wenn Sie ein sehr hohes Verbindungslimit konfigurieren, kann es zu einer höheren Speicherauslastung kommen, auch wenn diese Verbindungen nicht verwendet werden. Wenn der Anwendungsserver versucht, alle Client-Verbindungen zur Datenbank zu öffnen, werden diese Verbindungen möglicherweise abgelehnt. Um eine schlafende Verbindung in einer DB-Instance in RDS für MySQL zu beenden, führen Sie den folgenden Befehl aus:

CALL mysql.rds_kill(example-pid);

Inaktive Verbindungen: Sie können die inaktiven Verbindungen einer Instance in RDS für PostgreSQL anzeigen, indem Sie die folgende Abfrage ausführen. Diese Abfrage zeigt Informationen zu Backend-Prozessen mit einem der folgenden Status für mehr als 15 Minuten an: „inaktiv“, „inaktiv in Transaktion“, „inaktiv in Transaktion (abgebrochen)“ und „deaktiviert“.

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Um eine inaktive Verbindung in einer Instance in RDS für PostgreSQL zu beenden, führen Sie den folgenden Befehl aus:

SELECT pg_terminate_backend(example-pid)

Tipp: Es empfiehlt sich, nur die aktiven Verbindungen zu konfigurieren, die für die Anwendungsleistung erforderlich sind. Sie könnten auch ein Upgrade auf eine größere Amazon-RDS-DB-Instance-Klasse in Betracht ziehen.

Wert von max_connections erhöhen

Sie können die maximale Anzahl von Verbindungen zu Ihrer DB-Instance in RDS für MySQL oder RDS für PostgresSQL mithilfe der folgenden Methoden erhöhen:

  • Legen Sie mithilfe einer benutzerdefinierten Parametergruppe auf Instance-Ebene einen größeren Wert für den Parameter max_connections fest. Das Erhöhen des Parameters max_connections verursacht keinen Ausfall. Obwohl Sie den Wert von max_connections über den Standardwert hinaus erhöhen können, ist dies keine bewährte Methode. Dies liegt daran, dass bei der Instance Probleme auftreten können, wenn die Workload zunimmt und mehr Speicher benötigt wird. Eine Erhöhung der Anzahl der Verbindungen kann den Speicherverbrauch erhöhen. Instances mit wenig Arbeitsspeicher können abstürzen. Dies gilt insbesondere für kleinere Instances. Wenn Sie den Wert von max_connections erhöhen, achten Sie darauf, die Ressourcennutzung zu überwachen. Erkundigen Sie sich auch bei Ihrem DBA über die Erhöhung. Es empfiehlt sich, den Standardwert beizubehalten oder auf eine größere Instance-Klasse hochzuskalieren, wenn mehr Verbindungen erforderlich sind.
  • Wenn Ihre DB-Instance eine Standardparametergruppe verwendet, ändern Sie die Parametergruppe in eine benutzerdefinierte Parametergruppe. Stellen Sie sicher, dass Sie die benutzerdefinierte DB-Parametergruppe mit Ihrer Amazon-RDS-Instance verknüpfen und die Instance neu starten. Nachdem die neue benutzerdefinierte Parametergruppe Ihrer DB-Instance zugeordnet wurde, können Sie den Parameterwert max_connections ändern. Weitere Informationen finden Sie unter Wie ändere ich die Werte einer Amazon-RDS-DB-Parametergruppe?
    Hinweis: Das Ändern der Parametergruppe kann zu einem Ausfall führen. Weitere Informationen finden Sie unter Arbeiten mit DB-Parametergruppen.
  • Skalieren Sie Ihre DB-Instance auf eine DB-Instance-Klasse mit mehr Speicher. Beachten Sie, dass die Skalierung von RDS-Instances die Abrechnung des Kontos beeinflusst. Weitere Informationen finden Sie unter Abrechnung von DB-Instances für Amazon RDS.
    Warnung: Ausfallzeiten treten auf, wenn Sie eine Amazon-RDS-DB-Instance ändern.

Bewährte Methoden für die Konfiguration des Parameters max_connections verwenden

Beachten Sie unbedingt die folgenden bewährten Methoden, wenn Sie mit dem Parameter max_connections für Ihre DB-Instance arbeiten:

  • Die Standardverbindungslimits sind für Systeme optimiert, die die Standardwerte für andere wichtige Speicherverbraucher verwenden, z. B. den Pufferpool. Es empfiehlt sich, die Instance-Klasse hochzuskalieren, anstatt den Wert der Instance-Klasse zu ändern. Wenn Ihre Instances jedoch über viel freien Speicher verfügen, können Sie diesen Parameter manuell ändern. Bevor Sie diese Einstellungen für Ihre DB-Instance ändern, sollten Sie das Verbindungslimit anpassen, um der Zunahme oder Verringerung des verfügbaren Speichers auf den DB-Instances Rechnung zu tragen.
  • Legen Sie den Wert max_connections auf etwas über die maximale Anzahl von Verbindungen fest, die Sie voraussichtlich auf jeder DB-Instance öffnen werden.
  • Wenn Sie bei einer RDS-für-MySQL-Instance das Leistungsschema aktiviert haben, achten Sie genau auf die Parametereinstellung max_connections. Die Speicherstrukturen des Leistungsschemas werden automatisch basierend auf Serverkonfigurationsvariablen dimensioniert. Je höher Sie die Variable setzen, desto mehr Speicher verbraucht das Leistungsschema. In extremen Fällen kann dies bei kleineren Instance-Typen wie T2 und T3 zu Problemen mit unzureichendem Arbeitsspeicher führen. Wenn Sie das Leistungsschema verwenden, empfiehlt es sich, die Einstellung max_connections auf dem Standardwert zu belassen. Wenn Sie vorhaben, den Wert max_connections deutlich zu erhöhen (auf einen höheren Wert als den Standardwert), sollten Sie das Leistungsschema deaktivieren.
    Hinweis: Wenn Sie Performance Insights für eine DB-Instance in Amazon RDS für MySQL aktivieren, wird auch das Leistungsschema automatisch aktiviert.
  • Überprüfen Sie bei einer RDS-für-MySQL-Instance beim Optimieren des Parameters max_connections unbedingt die folgenden verbindungsbezogenen MySQL-Parameter: wait_timeout: Anzahl der Sekunden, die der Server bei einer nicht interaktiven TCP/IP- oder Unix-Dateiverbindung auf Aktivitäten wartet, bevor die Verbindung geschlossen wird
    interactive_timeout: Anzahl der Sekunden, die der Server in einer interaktiven Verbindung auf Aktivitäten wartet, bevor die Verbindung geschlossen wird
    net_read_timeout: Anzahl der Sekunden, die auf weitere Daten von einer TCP/IP-Verbindung gewartet werden muss, bevor die Leseaktivität unterbrochen wird
    net_write_timeout: Anzahl der Sekunden, die bei TCP/IP-Verbindungen auf das Schreiben eines Blocks gewartet werden müssen, bevor die Schreibaktivität unterbrochen wird
    max_execution_time: Ausführungs-Timeout für SELECT-Anweisungen, in Millisekunden
    max_connect_errors: Ein Host wird für weitere Verbindungen gesperrt, wenn es mehr als diese Anzahl an unterbrochenen Verbindungen gibt
    max_user_connections: Maximale Anzahl gleichzeitiger Verbindungen, die zu einem bestimmten MySQL-Konto erlaubt sind
  • Achten Sie bei einer RDS-für-PostgreSQL-Instance beim Optimieren des Parameters max_connections darauf, auch die folgenden PostgreSQL-Verbindungsparameter zu überprüfen:
    idle_in_transaction_session_timeout: Beendet jede Sitzung mit einer offenen Transaktion, die länger als die angegebene Dauer in Millisekunden inaktiv war. Dadurch können alle von dieser Sitzung gehaltenen Sperren freigegeben und der Verbindungssteckplatz wiederverwendet werden. Außerdem werden die Tupel, die nur für diese Transaktion sichtbar sind, bereinigt.
    tcp_keepalives_idle: Anzahl der Sekunden der Inaktivität, nach der das Betriebssystem eine TCP-Keepalive-Nachricht an den Client sendet
    tcp_keepalives_interval: Anzahl der Sekunden, nach denen eine TCP-Keepalive-Nachricht, die nicht vom Client bestätigt wurde, erneut übertragen wird
    tcp_keepalives_count: Anzahl der TCP-Keepalives, die verloren gehen können, bevor die Verbindung des Servers zum Client als tot betrachtet wird.

Hinweis: Dieser Artikel enthält keine empfohlenen Werte für die aufgelisteten Parameter, da diese Werte je nach Anwendungsfall variieren.