Häufig gestellte Fragen
Wie stelle ich eine Verbindung zu PgBouncer her?
PgBouncer verhält sich wie ein PostgreSQL-Server. Richten Sie Ihren Client daher einfach auf den PgBouncer-Port.
Wie lassen sich Abfragen auf mehrere Server verteilen?
PgBouncer unterstützt eine durch Kommas getrennte Liste von Hosts in der
Datenbank-Verbindungszeichenfolge. Mit
load_balance_hosts=round-robin
werden neue Serververbindungen reihum auf diese Hosts verteilt. Beispiel:
Auch externe Werkzeuge können verwendet werden:
-
DNS-Round-Robin. Hinterlegen Sie mehrere IP-Adressen für einen DNS-Namen. PgBouncer führt nicht bei jeder neuen Verbindung eine DNS-Abfrage durch. Stattdessen speichert es alle IP-Adressen im Cache und verteilt die Verbindungen intern per Round-Robin. Hinweis: Sind einem Namen mehr als 8 IP-Adressen zugeordnet, muss das DNS-Backend das EDNS0-Protokoll unterstützen. Einzelheiten finden sich unter Unterstützung für DNS-Abfragen .
-
Verwenden Sie einen Load-Balancer für TCP-Verbindungen. Sowohl LVS als auch HAProxy scheinen dafür gut geeignet. Auf PgBouncer-Seite kann es sinnvoll sein,
server_lifetimezu verkürzen undserver_round_robinzu aktivieren: Standardmäßig werden inaktive Verbindungen nach dem LIFO-Prinzip wiederverwendet, was bei Lastverteilung ungünstig sein kann.
Wie lässt sich ein Failover durchführen?
Bei einer durch Kommas getrennten Hostliste und
load_balance_hosts=disable
verwendet PgBouncer denselben Host weiter, bis ein Verbindungsversuch scheitert.
Dann versucht es den nächsten Host. Dabei werden die Rollen Primärserver und
Replikat nicht erkannt. Für ein Failover, das Änderungen an der
Datenbanktopologie folgt, sind externe Werkzeuge zu verwenden:
-
DNS-Neukonfiguration: Wenn die IP-Adresse geändert wird, auf die ein DNS-Name verweist, verbindet sich PgBouncer erneut mit dem neuen Server. Dieses Verhalten lässt sich über zwei Konfigurationsparameter steuern:
dns_max_ttllegt die Gültigkeitsdauer eines Hostnamens fest;dns_zone_check_periodbestimmt, wie häufig der SOA-Eintrag einer Zone auf Änderungen geprüft wird. Hat sich der SOA-Eintrag geändert, fragt PgBouncer alle Hostnamen dieser Zone erneut ab. -
Tragen Sie einen neuen Host in die Konfiguration ein und lassen Sie PgBouncer sie neu laden: Senden Sie SIGHUP oder verwenden Sie den Befehl
RELOADin der Konsole. PgBouncer erkennt die geänderte Hostkonfiguration und verbindet sich mit dem neuen Server. -
Verwenden Sie den Befehl
RECONNECT. Er ist für Situationen vorgesehen, in denen sich keine der beiden vorherigen Optionen anwenden lässt, etwa wenn Sie den zuvor erwähnten HAProxy-Load-Balancer einsetzen, um Verbindungen hinter PgBouncer weiterzuleiten.RECONNECTöffnet einfach alle Serververbindungen neu. Führen Sie den Befehl aus, nachdem die andere Komponente ihre Routinginformationen geändert hat.
Wie lassen sich vorbereitete Anweisungen mit Sitzungs-Pooling verwenden?
Im Sitzungs-Pooling muss die Abfrage zum Zurücksetzen alte vorbereitete Anweisungen
bereinigen. Hierzu kann server_reset_query = DISCARD ALL; oder zumindest
DEALLOCATE ALL; verwendet werden.
Wie lassen sich vorbereitete Anweisungen mit Transaktions-Pooling verwenden?
Seit Version 1.21.0 kann PgBouncer vorbereitete Anweisungen im
Transaktions-Pooling nachverfolgen und sicherstellen, dass sie bei Bedarf auf
der zugeordneten Serververbindung vorbereitet werden. Um diese Funktion zu
aktivieren, muss max_prepared_statements auf einen von null verschiedenen
Wert gesetzt werden (der Standardwert ist 200). Weitere Einzelheiten finden Sie in der Dokumentation zu
max_prepared_statements
.
Je nach verwendeter Version kann PHP/PDO mit der Unterstützung vorbereiteter Anweisungen durch PgBouncer inkompatibel sein (#991 ). PHP/PDO ist nur bei Verwendung von PHP 8.4+ und libpq 17 kompatibel. Für Installationen mit älteren Versionen empfiehlt sich daher ein Upgrade oder die Deaktivierung vorbereiteter Anweisungen auf Clientseite.
Vorbereitete Anweisungen in JDBC deaktivieren
Die richtige Vorgehensweise für JDBC besteht darin, den Parameter prepareThreshold=0
zur Verbindungszeichenfolge hinzuzufügen.
Vorbereitete Anweisungen in PHP/PDO deaktivieren
Um serverseitig vorbereitete Anweisungen zu deaktivieren, muss das
PDO-Attribut PDO::ATTR_EMULATE_PREPARES auf true gesetzt werden, entweder beim
Verbindungsaufbau:
$db = new PDO("dsn", "user", "pass", array(PDO::ATTR_EMULATE_PREPARES => true));
oder später:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
Wie aktualisiere ich PgBouncer, ohne Verbindungen zu unterbrechen?
Sie können einen rollierenden Neustart nach dem Verfahren im Dokumentationsabschnitt
zu SHUTDOWN WAIT_FOR_CLIENTS
durchführen.
Wie finde ich heraus, welcher Client welcher Serververbindung zugeordnet ist?
Verwenden Sie die Befehle SHOW CLIENTS und SHOW SERVERS in der Konsole.
-
Ordnen Sie mithilfe von
ptrundlinkeine lokale Clientverbindung der Serververbindung zu. -
Identifizieren Sie die vom Client ausgehende TCP-Verbindung anhand von
addrundportder Clientverbindung. -
Identifizieren Sie die zum Server führende TCP-Verbindung anhand von
local_addrundlocal_port.
Soll PgBouncer auf dem Webserver oder dem Datenbankserver installiert werden?
Das hängt davon ab.
Eine Installation von PgBouncer auf dem Webserver ist sinnvoll, wenn kurzlebige Verbindungen genutzt werden, weil sie die Latenz beim Verbindungsaufbau minimiert. (TCP benötigt mehrere Paketumlaufzeiten, bevor eine Verbindung nutzbar ist.) Eine Installation von PgBouncer auf dem Datenbankserver eignet sich, wenn viele unterschiedliche Hosts (z. B. Webserver) darauf zugreifen. Ihre Verbindungen können dann gemeinsam optimiert werden.
PgBouncer kann sowohl auf dem Webserver als auch auf dem Datenbankserver installiert werden. Nachteilig ist, dass jeder zusätzliche PgBouncer-Hop jeder Abfrage eine geringe Latenz hinzufügt.
Letztlich müssen Sie testen, welches Modell Ihre Leistungsanforderungen am besten erfüllt. Sie sollten außerdem berücksichtigen, wie sich die gewählte PgBouncer-Position auf das Failover Ihrer Anwendungen auswirkt, wenn ein Webserver beziehungsweise der Datenbankserver ausfällt.