Verbindungspooling mit PgBouncer
PgBouncer ist ein schlanker Verbindungspooler für PostgreSQL. Es unterhält nur eine geringe Anzahl von Datenbankverbindungen und teilt diese auf viele Anwendungsclients auf. Dies unterstützt Ihre Bereitstellung innerhalb des Verbindungslimits und vermeidet den Mehraufwand, für jeden Client eine neue Verbindung zu öffnen.
IBM Cloud® Databases for PostgreSQL Die Bereitstellungen umfassen integrierte Unterstützung für die Authentifizierung auth_query über PgBouncer's.
Jede Bereitstellung verfügt über eine public.pgbouncer_lookup Funktion und eine pgbouncer_auth Rolle, sodass eine von Ihnen betriebene PgBouncer-Instanz Datenbankbenutzer direkt anhand Ihrer Bereitstellung validieren
kann. Sie verwalten keine lokale Passwortliste für Ihre Datenbankbenutzer, und Passwortänderungen werden sofort wirksam, ohne dass ein Neustart oder ein Neuladen von PgBouncer erforderlich ist.
Databases for PostgreSQL PgBouncer wird nicht von [Name] gehostet oder betrieben. Sie installieren, betreiben, sichern und aktualisieren PgBouncer auf Ihrer eigenen Infrastruktur, beispielsweise auf einem virtuellen Server, in einem Kubernetes-Cluster oder als Sidecar-Anwendung. Weitere Informationen zur Verbindungsverwaltung finden Sie unter Verbindungen verwalten.
Vorbereitende Schritte
Sie benötigen Folgendes:
- Eine Databases for PostgreSQL-Bereitstellung mit festgelegtem Administratorpasswort.
- Ein Datenbankbenutzer für Ihre Anwendung, der über die Benutzeroberfläche, die Befehlszeilenschnittstelle(CLI)oder die API angelegt wurde.
- PgBouncer 1.11.0 oder höher, das die SCRAM-Authentifizierung unterstützt, installiert auf einer Infrastruktur, die Sie selbst verwalten. Wenn Sie vorhaben, vorbereitete Anweisungen auf Protokollebene im Transaktions-Pooling-Modus zu verwenden, nutzen Sie PgBouncer ( 1.21.0 ) oder eine neuere Version.
- Ein Kunde
psql. - Ihre Verbindungsdaten für die Bereitstellung:
- Hostname und Port aus den [Verbindungszeichenfolgen]...
- CA-Zertifikat, abgerufen mit
ibmcloud cdb deployment-cacert.
Die Unterstützung für pgbouncer_lookup wird derzeit in allen Bereitstellungen eingeführt. Um zu überprüfen, ob Ihre Bereitstellung über die Funktion verfügt, stellen Sie eine Verbindung mit als psql her admin und führen Sie aus \df public.pgbouncer_lookup. Wenn das Ergebnis leer ist, erhält Ihre Bereitstellung die Funktion mit einem bevorstehenden Wartungsupdate.
Erstellen eines dedizierten Authentifizierungsbenutzers
PgBouncer wird auth_query als eine bestimmte Anmelderolle ausgeführt, deren auth_user. Erstellen Sie eine Rolle, die ausschließlich für diesen Zweck verwendet wird. Eine dedizierte Rolle, die keine Daten verwaltet und
keine anderen Prozesse ausführt, ist die Lösung mit den geringsten Berechtigungen.
Melden Sie sich psql als Benutzer admin an, erstellen Sie dann die Rolle und weisen Sie ihr folgende Berechtigungen zu pgbouncer_auth:
CREATE ROLE pool_auth WITH LOGIN PASSWORD '<POOL_AUTH_PASSWORD>';
GRANT pgbouncer_auth TO pool_auth;
Die Rolle pgbouncer_auth verfügt über eine einzige Berechtigung: die Erlaubnis, die Funktion pgbouncer_lookup auszuführen. Der Benutzer admin verfügt pgbouncer_auth über die Administratorrechte,
sodass Sie die Mitgliedschaft selbst gewähren und widerrufen können. Sie können den Benutzer auch mit anlegen, wenn ibmcloud cdb user-create er in Ihren Service-Anmeldedaten erscheinen soll. Allerdings gehören auf diese Weise angelegte Benutzer zur Gruppe ibm-cloud-base-user und können Benutzer und Datenbanken anlegen – was über die Anforderungen des Authentifizierungsbenutzers hinausgeht.
Erteilen Sie die Berechtigung ausschließlich pgbouncer_auth dem dafür vorgesehenen autorisierten Benutzer. Jedes Mitglied dieser Rolle kann die gespeicherten Passwort-Verifizierer Ihrer anderen Datenbankbenutzer einsehen, sodass
jedes weitere Mitglied die Auswirkungen einer kompromittierten Anmeldeinformation vergrößert.
Um einen Authentifizierungsbenutzer zu deaktivieren, widerrufen Sie dessen Mitgliedschaft:
REVOKE pgbouncer_auth FROM pool_auth;
PgBouncer konfigurieren
Die folgenden PgBouncer-Einstellungen sind erforderlich, wenn eine Verbindung zu einer Databases for PostgreSQL-Bereitstellung hergestellt wird:
auth_type = scram-sha-256, da in den Bereitstellungen Passwortprüfer für SCRAM-SHA-256 gespeichert sind.auth_query = SELECT * FROM public.pgbouncer_lookup($1), da PgBouncer's standardmäßig direktpg_authidauth_querygelesen wird und Ihre Datenbankbenutzer es nicht lesen können.- Serverseitiges TLS, da die Bereitstellungen ausschließlich TLS-Verbindungen akzeptieren. Legen Sie fest und speichern Sie das Zertifikat
server_tls_sslmode = verify-full, das Sie mit abgerufen haben, unteribmcloud cdb deployment-cacertdem Pfad, den Sie in festgelegt habenserver_tls_ca_file.
PgBouncer Liest die eigenen Anmeldedaten aus auth_user``auth_file, daher enthält userlist.txt in dieser Konfiguration ausschließlich die Anmeldedaten für auth_user. Jeder zweite Nutzer löst das Problem über auth_query.
Beschränken Sie die Dateiberechtigungen auf den Prozessverantwortlichen PgBouncer, beispielsweise mit dem Modus 0600.
"pool_auth" "<POOL_AUTH_PASSWORD>"
Eine vollständige Minimal-Konfiguration, bei der <HOSTNAME> und aus Ihren Verbindungszeichenfolgen <PORT> stammen:
[databases]
ibmclouddb = host=<HOSTNAME> port=<PORT> dbname=ibmclouddb
[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
auth_user = pool_auth
auth_query = SELECT * FROM public.pgbouncer_lookup($1)
server_tls_sslmode = verify-full
server_tls_ca_file = /etc/pgbouncer/ca-certificate.crt
pool_mode = session
max_client_conn = 200
default_pool_size = 20
Nicht festlegen auth_dbname = postgres. Die Suchfunktion ist nicht in der Datenbank postgres installiert. Lassen Sie den Wert auf unset auth_dbname gesetzt, damit die Authentifizierungsabfrage in der Datenbank
ausgeführt wird, mit der der Client verbunden ist. Datenbanken, die Sie später erstellen, enthalten diese Funktion automatisch.
Beschreibungen aller Einstellungen finden Sie in der Konfigurationsreferenz zu PgBouncer.
Einrichtung überprüfen
-
Stellen Sie sicher, dass die Abfrage einen Ihrer Datenbankbenutzer ergibt. Verbinden Sie sich mit als
psqladminund führen Sie Folgendes aus:SELECT usename, passwd IS NOT NULL AS can_authenticate FROM public.pgbouncer_lookup('<APP_USERNAME>');Das Ergebnis ist eine Zeile mit
can_authenticate = t. Die Abfrage ist so formuliert, dass die Passwortüberprüfung nicht angezeigt wird. Für den Dienst reservierte Benutzer, einschließlichadmin, liefern keine Zeilen zurück. -
Stellen Sie als Datenbankbenutzer eine Verbindung über PgBouncer her:
psql "host=127.0.0.1 port=6432 dbname=ibmclouddb user=<APP_USERNAME>"Wenn die Verbindung erfolgreich hergestellt wird, authentifiziert PgBouncer Benutzer korrekt über
auth_query. -
Ändern Sie das Passwort des Datenbankbenutzers und stellen Sie anschließend über PgBouncer mit dem neuen Passwort erneut eine Verbindung her:
ibmcloud cdb user-password <DEPLOYMENT_NAME_OR_CRN> <APP_USERNAME> <NEW_PASSWORD>Das neue Passwort ist sofort gültig. Es ist kein Neustart, kein Neuladen und keine Änderung
userlist.txtvon PgBouncer erforderlich.
So funktioniert das Sicherheitsmodell
Die Funktion pgbouncer_lookup gibt nur die Informationen preis, die PgBouncer für die Authentifizierung benötigt.
- Die Funktion wird mit und
SECURITY DEFINEReinem angeheftetensearch_pathausgeführt und liestpg_catalog.pg_authidin Ihrem Namen. Der direkte Zugriff auf undpg_authidbleibtpg_shadowgesperrt. - Es werden gehasht SCRAM-Verifizierer zurückgegeben, niemals Passwörter im Klartext.
- Es werden nur Rollen aufgelöst, die sich anmelden dürfen. Für den Dienst reservierte Benutzer, wie z. B.
adminsowie die internen Replikations- und Betriebsbenutzer, werden niemals aufgelöst. - Liegt der Zeitstempel
VALID UNTILeiner Rolle in der Vergangenheit, gibt die Funktion ein NULL-Passwort zurück, sodass die Authentifizierung fehlschlägt und die Passwortablaufregel weiterhin durchgesetzt wird. - Die Berechtigung zum Ausführen der Funktion wird von entzogen und
PUBLICausschließlich sowieadminden Mitgliedern von gewährtpgbouncer_auth.
PgBouncer's default lässt sich direkt pg_authid auth_query auslesen, was Ihren Datenbankbenutzern nicht möglich ist. In diesem Fall empfiehlt PgBouncer Dokumentation das, stattdessen eine Funktion SECURITY DEFINER über einen Nicht-Superuser aufzurufen. Die Funktion pgbouncer_lookup ist jene Funktion, wobei die für den Dienst reservierten Benutzer ausgeschlossen sind.
Einschränkungen und zu beachtende Punkte
- PgBouncer verursacht keine Erhöhung der. Ihrer Bereitstellung
max_connections. Stellen Sie sicherdefault_pool_size, dass die Gesamtzahl der Serververbindungen aller Ihrer PgBouncer-Instanzen innerhalb des Verbindungslimits bleibt. Wenn Sie das Limit erreichen, lesen Sie den Abschnitt Erhöhen der maximalen Anzahl an Verbindungen. - Der Benutzer
adminkann sich nicht überauth_query… authentifizieren. Für Verwaltungsaufgaben stellen Sie eine direkteadminVerbindung zur Bereitstellung her, nicht über PgBouncer. - Die Datenbank
postgresverfügt nicht über die Suchfunktion, daher sollten Sie niemals … festlegenauth_dbname = postgres. - Im Transaktions-Pooling-Modus (
pool_mode = transaction) werden Sitzungszustände wieSETVariablen, temporäre Tabellen, Advisory-Locks und KanäleLISTENnicht zwischen Transaktionen übertragen. Vorbereitete Anweisungen auf Protokollebene erfordern PgBouncer ( 1.21.0max_prepared_statements) oder eine neuere Version. Weitere Informationen finden Sie unter PgBouncer-Funktionen. - Während eines In-Place-Upgrades auf eine neue Hauptversion kommt es bei Ihrer Bereitstellung zu einer kurzen Ausfallzeit, und offene Verbindungen
werden beendet (SQLSTATE
57P01). PgBouncer stellt die Serververbindungen automatisch wieder her, Ihre Anwendungen müssen jedoch unterbrochene Transaktionen erneut versuchen und Anweisungen neu vorbereiten. - Benutzer mit Lesezugriff können keine Verbindung zum primären Endpunkt herstellen. Um die Verbindungen zu bündeln, fügen Sie einen separaten Eintrag
[databases]hinzu, der auf Ihreschreibgeschützte Replik verweist.