Snowflake Postgres-Verbindungspooling

Ein Verbindungspool ist ein Cache von Datenbankverbindungen, die wiederverwendet werden können. Wenn eine Anforderung von einem Client eingeht, wird für diese Anforderung oder Transaktion eine verfügbare Verbindung aus dem Pool angegeben.

Im Gegensatz dazu muss der Client ohne Verbindungspooling auf die Datenbank zugreifen, um eine Verbindung herzustellen. Das Öffnen neuer Verbindungen kann sich auf die Verfügbarkeit und Leistung auswirken – in PostgreSQL „spaltet“ sich der Server auf (Fork) oder erstellt einen neuen Prozess, was verfügbare Ressourcen verbrauchen und verhindern könnte, dass neue Verbindungen hergestellt werden. Verbindungspooling hilft, diese Probleme zu mindern und sicherzustellen, dass Ihre Anwendungen skaliert werden können.

Benötige ich Verbindungspooling?

Verbindungspooling ist besonders hilfreich, wenn Sie eine große Anzahl von Verbindungen von Ihrer Anwendung aus nutzen können, häufig über einen clientseitigen Pool oder über mehrere Threads/Prozesse von Ihrem Webserver aus.

Sie können die folgende Abfrage auf Ihrer Snowflake Postgres-Instanz ausführen, um festzustellen, ob Sie vom Verbindungspooling profitieren würden:

SELECT count(*),
       state
FROM pg_stat_activity
GROUP BY 2;
Copy
 count |             state
-------+-------------------------------
     7 | active
    69 | idle
    26 | idle in transaction
    11 | idle in transaction (aborted)
(4 rows)

Wenn Sie eine große Anzahl von inaktiven Verbindungen im Verhältnis zu den aktiven Verbindungen feststellen, ist die Verwendung von Verbindungspooling dringend empfohlen.

Verbindungspooling mit PgBouncer

Snowflake Postgres verwendet pgBouncer für das Verbindungspooling. PgBouncer wird standardmäßig für alle Snowflake Postgres-Instanzen zur Verfügung gestellt, um die Verbindungsverwaltung zu vereinfachen, indem native Postgres-Verbindungen über seine eigenen „virtuellen“ Verbindungen bereitgestellt werden. Standardmäßig werden PgBouncer-Instanzen auf Snowflake Postgres im Transaktionspooling-Modus ausgeführt.

Um jedoch den PgBouncer-Service nutzen zu können, müssen Sie für jede Datenbank, auf der Sie ihn verwenden möchten, einen zusätzlichen Schritt ausführen, indem Sie die snowflake_pooler-Erweiterung installieren.

Aktivieren von PgBouncer mit der snowflake_pooler-Erweiterung

snowflake_admin-Postgres-Benutzende führen Folgendes in der Datenbank aus, um die snowflake_pooler-Erweiterung zu installieren:

CREATE EXTENSION snowflake_pooler;
Copy

Was ist snowflake_pooler?

snowflake_pooler ist eine einfache Erweiterung, die den Benutzer snowflake_pooler erstellt. Dieser Benutzer hat lediglich auf die Funktion user_lookup Zugriff, die PgBouncer die Authentifizierung eingehender Verbindungen erlaubt. So kann, wenn ein Client eine Verbindung zu PgBouncer herstellt, geprüft werden, ob die Anmeldeinformationen des Clients gültig sind, indem der kanonische Benutzerspeicher von Postgres abgefragt wird.

Bemerkung

Die snowflake_pooler-Erweiterung muss einzeln in jeder Datenbank installiert werden, in der Sie eine Verbindung über PgBouncer herstellen möchten. Wenn snowflake_pooler nicht installiert wurde, erhalten Sie möglicherweise eine Fehlermeldung wie die folgende:

failed: FATAL: bouncer config error

Um den Fehler zu beheben, stellen Sie eine Verbindung zur Datenbank her und führen Sie Folgendes aus: CREATE EXTENSION snowflake_pooler;.

Herstellen einer Verbindung zu PgBouncer

Clients verbinden sich mit PgBouncer mit derselben Verbindungszeichenfolge, die sie für die Postgres-Hauptdatenbank verwenden, außer für Port 5431 anstelle des üblichen 5432:

psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Copy

Nur Rollen ohne Superuser- oder Replikationsberechtigungen können sich über PgBouncer verbinden. Sie können sich dafür entscheiden, eine Verbindung zu PgBouncer unter Verwendung der application-Rolle (eine einzelne Benutzerrolle, die für Teammitglieder erstellt wurde) oder kundenspezifische Benutzerrollen, die Sie möglicherweise erstellt haben (z. B. mit dem Postgres-Befehl CREATE ROLE) herstellen. Die user_lookup-Funktion, die von snowflake_pooler erstellt wurde, verweigert Lookups von Superusers und Replikationsrollen. Weitere Informationen zu Postgres-Benutzenden und -Rollen in Snowflake Postgres finden Sie unter Snowflake Postgres-Rollen.

Tipp

Die Begriffe „Benutzer“ und „Rolle“ sind in Postgres weitgehend synonym. Ein kleiner Unterschied besteht darin, dass CREATE USER (im Gegensatz zu CREATE ROLE) das LOGIN-Attribut impliziert, z. B CREATE ROLE myuser LOGIN;.

Pooling-Modus

PgBouncer unterstützt drei verschiedene Pooling-Modi: Transaktion, Sitzung und Anweisung. Alle Möglichkeiten werden im Folgenden kurz und unter in der `PgBouncer-Dokumentation<https://www.pgbouncer.org/features.html>`_ näher erläutert.

Transaktion

Snowflake Postgres-Instanzen führen PgBouncer standardmäßig im Transaktionspooling-Modus aus, da dies der Modus ist, den wir den meisten Personen empfehlen.

Bemerkung

Wenn sich PgBouncer im Transaktionspooling-Modus befindet, funktionieren auf SQL-Ebene mit PREPARE vorbereitete und mit EXECUTE ausgeführte Anweisungen in verschiedenen Transaktionen nicht, da sie möglicherweise auf unterschiedlichen Serververbindungen ausgeführt werden. PgBouncer unterstützt jedoch auf Protokollebene vorbereitete Transaktionen, wenn der Postgres-Treiber der Anwendung diese unterstützt. Weitere Details dazu, wie PgBouncer dies verarbeitet, finden Sie in der Dokumentation `max_prepared_statements<https://www.pgbouncer.org/config.html>`_.

Um die PgBouncer-Unterstützung für auf Protokollebene vorbereitete Anweisungen zu verwenden, muss die PgBouncer-Einstellung max_prepared_statements auf einen Wert größer als 0 gesetzt werden. Die Standardeinstellung für Snowflake Postgres ist 250, aber Sie können bei Bedarf auch einen anderen Wert festlegen.

Sitzung

Der Sitzungspooling-Modus wird bei Snowflake Postgres unterstützt, wenn Sie dies benötigen. Um diesen Pooling-Modus zu verwenden, stellen Sie die Einstellung „pool_mode“ für Ihren Cluster auf session.

Statement

Der Modus für das Anweisungspooling ist ebenfalls verfügbar. Beachten Sie jedoch, dass Transaktionen mit mehreren Anweisungen Fehler auslösen. Um diesen Pooling-Modus zu verwenden, stellen Sie die Einstellung „pool_mode“ für Ihren Cluster auf statement.

Deaktivieren von PgBouncer

Das Löschen der snowflake_pooler-Erweiterung aus einer Datenbank deaktiviert praktisch PgBouncer, da eine Authentifizierung nicht mehr möglich ist:

DROP EXTENSION snowflake_pooler;
Copy