Zum Inhalt springen

Häufig gestellte Fragen

Häufig gestellte Fragen zu PgBouncer

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 bietet keine interne Multi-Host-Konfiguration. Die Verteilung ist jedoch mit externen Werkzeugen möglich:

  1. 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 Sie in der README-Datei.

  2. Verwenden Sie einen Load-Balancer für TCP-Verbindungen. Sowohl LVS als auch HAProxy eignen sich dafür. Auf PgBouncer-Seite kann es sinnvoll sein, server_lifetime zu verkürzen und server_round_robin zu 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?

PgBouncer bietet weder eine interne Failover-Host-Konfiguration noch eine entsprechende Erkennung. Ein Failover lässt sich mit externen Werkzeugen realisieren:

  1. 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_ttl legt die Gültigkeitsdauer eines Hostnamens fest; dns_zone_check_period bestimmt, 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.

  2. Tragen Sie einen neuen Host in die Konfiguration ein und lassen Sie PgBouncer sie neu laden: Senden Sie SIGHUP oder verwenden Sie den Befehl RELOAD in der Konsole. PgBouncer erkennt die geänderte Hostkonfiguration und verbindet sich mit dem neuen Server.

  3. 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 Session-Pooling verwenden?

Im Session-Pooling muss die Reset-Abfrage 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. 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

Fügen Sie hierzu den Parameter prepareThreshold=0 zur Verbindungszeichenfolge hinzu.

Vorbereitete Anweisungen in PHP/PDO deaktivieren

Um serverseitig vorbereitete Anweisungen zu deaktivieren, setzen Sie das PDO-Attribut PDO::ATTR_EMULATE_PREPARES auf true — 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?

Führen Sie einen Rolling Restart nach dem Verfahren im Dokumentationsabschnitt zu SHUTDOWN WAIT_FOR_CLIENTS durch.


Wie finde ich heraus, welcher Client welcher Serververbindung zugeordnet ist?

Verwenden Sie die Befehle SHOW CLIENTS und SHOW SERVERS in der Konsole.

  1. Ordnen Sie mithilfe von ptr und link eine lokale Clientverbindung der Serververbindung zu.

  2. Identifizieren Sie die vom Client ausgehende TCP-Verbindung anhand von addr und port der Clientverbindung.

  3. Identifizieren Sie die zum Server führende TCP-Verbindung anhand von local_addr und local_port.


Soll PgBouncer auf dem Webserver oder dem Datenbankserver installiert werden?

Das hängt vom Einsatzszenario 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. Berücksichtigen Sie außerdem, wie sich die gewählte PgBouncer-Position auf das Failover Ihrer Anwendungen auswirkt, wenn ein Webserver beziehungsweise der Datenbankserver ausfällt.