IBM Cloud Docs
Verbindungen verwalten

Verbindungen verwalten

Verbindungen zu Ihrem Databases for PostgreSQL verbrauchen Ressourcen, daher ist es wichtig zu überlegen, wie viele Verbindungen Sie benötigen, um die Leistung Ihres Einsatzes zu optimieren. PostgreSQL verwendet eine Einstellung für max_connections, um die Anzahl der Verbindungen (und Ressourcen, die von Verbindungen belegt werden) zu begrenzen und so ein Runaway-Verhalten der Verbindungen zu verhindern, wenn die Ressourcen Ihrer Bereitstellung überfordert sind.

Sie können den Wert für max_connections mit Ihrem admin-Benutzer und psql überprüfen.

ibmclouddb=> SHOW max_connections;
 max_connections
-----------------
 115
(1 row)

Verbindungslimits

Bei der Einrichtung legt Databases for PostgreSQL die maximale Anzahl von Verbindungen zu Ihrer PostgreSQL-Datenbank auf 115 fest. 15 Verbindungen sind für den Superuser reserviert, um den Status und die Integrität Ihrer Datenbank zu erhalten, und für Sie und Ihre Anwendungen stehen 100 Verbindungen zur Verfügung. Wenn die Anzahl der Verbindungen zur Datenbank die Grenze von 100 Verbindungen überschreitet, schlagen neue Verbindungen fehl und geben einen Fehler zurück.

FATAL: remaining connection slots are reserved for
non-replication superuser connections

Das Überschreiten des Verbindungslimits für Ihre Bereitstellung kann dazu führen, dass Ihre Datenbank von Ihren Anwendungen nicht erreicht werden kann.

Sie können die Anzahl der Verbindungen zu Ihrer Bereitstellung mit dem Benutzer "admin", psql und pg_stat_database überprüfen.

SELECT count(distinct(numbackends)) FROM pg_stat_database;

Wenn Sie herausfinden müssen, wohin die Verbindungen verlaufen, können Sie die Verbindungen nach Datenbank aufgliedern.

SELECT datname, numbackends FROM pg_stat_database;

Um die Verbindungen zu einer bestimmten Datenbank genauer zu untersuchen, fragen Sie pg_stat_activity ab.

SELECT * FROM pg_stat_activity WHERE datname='ibmclouddb';

Verbindungen beenden

Ihr Administratorbenutzer hat die Rolle pg_signal_backend. Wenn Sie Verbindungen finden, die zurückgesetzt oder geschlossen werden müssen, kann der Admin-Benutzer sowohl ' pg_cancel_backend und " pg_terminate_backend. Die pid eines Prozesses wird anhand der Tabelle pg_stat_activity ermittelt.

  • pg_cancel_backend bricht die aktuelle Abfrage einer Verbindung ab, ohne die Verbindung zu beenden und ohne weitere Abfragen zu stoppen, die möglicherweise gerade ausgeführt werden.

    SELECT pg_cancel_backend(pid);
    
  • pg_terminate_backend stoppt den gesamten Prozess und schließt die Verbindung.

    SELECT pg_terminate_backend(pid);
    

Der Administratorbenutzer verfügt über die Berechtigung zum Zurücksetzen oder Schließen der Verbindungen für jeden Benutzer in der Bereitstellung mit Ausnahme der Superuser. Achten Sie darauf, dass die Replikationsverbindungen nicht vom Benutzer ibm-replication beendet werden, da dies die hohe Verfügbarkeit Ihrer Bereitstellung beeinträchtigt.

Verbindungen beenden

Wenn Ihre Einrichtung das Verbindungslimit erreicht oder Sie Probleme mit der Verbindung zu Ihrer Einrichtung haben und vermuten, dass eine hohe Anzahl von Verbindungen das Problem ist, trennen Sie alle Verbindungen zu Ihrer Einrichtung.

In der Benutzerschnittstelle gibt es auf der Registerkarte Einstellungen eine Schaltfläche für End connections für Ihre Bereitstellung. Gehen Sie mit Vorsicht vor, da hierbei alle Verbindungen zu Ihrer Bereitstellung unterbrochen werden.

Der CLI-Befehl zum Beenden von Verbindungen zur Bereitstellung lautet:

ibmcloud cdb deployment-kill-connections <DEPLOYMENT_NAME_OR_CRN>

Sie können auch die Cloud Databases API verwenden, um die Operation zum Beenden aller Verbindungen auszuführen.

Verbindungspooling

Eine Möglichkeit, das Überschreiten des Verbindungslimits zu verhindern und sicherzustellen, dass die Verbindungen von Ihren Anwendungen effizient gehandhabt werden, ist das Verbindungspooling. Wenn Sie das IBM Cloud® Databases for PostgreSQL-Verbindungslimit auf mehr als 500 Verbindungen setzen, sollten Sie ernsthaft in Erwägung ziehen, Verbindungspooling zu verwenden oder erneut zu bewerten, wie Verbindungen effizienter genutzt und verwaltet werden können. Das Performance Benchmarking in der PostgreSQL-Community empfiehlt 500 oder weniger Verbindungen für eine optimale Datenbankleistung.

Viele PostgreSQL-Treiberbibliotheken verfügen über Klassen und Funktionen für das Verbindungspooling. In der Dokumentation Ihres Treibers finden Sie Informationen darüber, wie Sie das Verbindungspooling für Ihren Anwendungsfall optimal implementieren. Der Python Psycopg2 verfügt zum Beispiel über Klassen, mit denen Sie das Connection Pooling in Ihrer Anwendung handhaben können. Der Java PostgreSQL JDBC verfügt über Methoden für das Connection Pooling sowohl auf Anwendungs- als auch auf Anwendungsserverebene.

Alternativ können Sie auch ein Drittanbieter-Tool wie PgBouncer verwenden, um die Verbindungen Ihrer Anwendung zu verwalten.

Verbindungslimit erhöhen

PostgreSQL weist pro Verbindung eine gewisse Menge an Speicher zu, typischerweise etwa 5 - 10 MB pro Verbindung. Es ist wichtig, die Gesamtspeicherkapazität zu berücksichtigen, die für Ihre Bereitstellung verfügbar ist, bevor das Verbindungslimit erhöht wird. Wenn Sie das Verbindungslimit erhöhen möchten, sollten Sie zunächst Ihre Bereitstellung skalieren, um sicherzustellen, dass genügend Speicher zur Verfügung steht, um weitere Verbindungen aufzunehmen.

Ändern Sie als Nächstes den Wert von max_connections für Ihre Bereitstellung. Um permanente Änderungen an der PostgreSQL-Konfiguration vorzunehmen, müssen Sie entweder das Cloud Databases CLI-Plug-in oder die API verwenden, um die Änderungen in die Konfigurationsdatei für Ihre Bereitstellung zu schreiben.

Um beispielsweise max_connections auf 215 zu erhöhen, kann es sinnvoll sein, Ihre Bereitstellung auf mindestens 2 GB RAM pro Datenmember zu skalieren, sodass Sie insgesamt 4 GB RAM für Ihre Bereitstellung haben. Nachdem die Skalierungsoperation abgeschlossen ist, legen Sie das Verbindungslimit fest.

  1. Bevor Sie max_connections anpassen, stellen Sie sicher, dass Sie Ihre bevorzugte Region mit einem Befehl wie diesem auswählen:
ibmcloud target -r <REGION>
  1. Erhöhen Sie anschließend die Speicherkapazität, die einer Implementierungsgruppe zur Verfügung steht, mit einem Befehl wie dem folgenden:
ibmcloud cdb deployment-groups-set deployment-example member --memory 4096
  1. Passen Sie schließlich max_connections mit einem Befehl wie dem folgenden an:
ibmcloud cdb deployment-configuration <DEPLOYMENT_NAME_OR_CRN> '{"configuration":{"max_connections":215}}'

Um die Änderungen über die API vorzunehmen, verwenden Sie den folgenden Befehl:

curl -X PATCH `https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/groups/member' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"memory": {
        "allocation_mb": 4096
      }
    }'

curl -X PATCH 'https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/configuration' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"configuration":{
        "max_connections":215
      }
    }'

Einstellungen für Verbindungslimits und TCP/IP-Keepalive

Bei einer Netzwerkverbindung oder einem Failover ist es möglich, dass unterbrochene TCP/IP-Verbindungen in einem halboffenen/geschlossenen Zustand verbleiben, bis die TCP-Keepalive-Timeouts erreicht sind. Zur Vermeidung dieses Szenarios wird empfohlen, die Einstellungen socket_timeout und connection_timeout auch in Ihren speziellen Anwendungstreibern festzulegen. Die korrekten Einstellungen variieren je nach Workload und es ist wichtig, Belastungstests auszuführen, bevor Sie in die Produktion gehen. Ein guter Ausgangspunkt für den " connection_timeout sind 2 - 5 Sekunden. Für den " socket_timeout sind 30 bis 60 Sekunden ein guter Ausgangspunkt.

Außerdem werden auf der Serverseite standardmäßig die folgenden Keepalive-Konfigurationen verwendet.

  • tcp_keepalives_idle ist auf 5 Minuten gesetzt
  • tcp_keepalives_interval-Testintervall ist auf 10 Sekunden gesetzt
  • tcp_keepalives_count ist auf 6 gesetzt

Um zu verhindern, dass halboffene/geschlossene Verbindungen oder sprunghafte Verbindungsversuche Ihren Einsatz überfordern, setzen Sie den Parameter 'max_connections für Postgres auf mindestens das Doppelte der erwarteten Verbindungsanzahl.

Wenn Ihr Verbindungslimit erreicht ist, können Sie sofort Alle Verbindungen beenden .