In unseren vorherigen Beiträgen in dieser Serie haben wir ausführlich über die Verwendung von PgBouncer und Pgpool-II, die Architektur des Verbindungspools und die Vor- und Nachteile der Nutzung eines solchen gesprochen für Ihre PostgreSQL-Bereitstellung. In unserem letzten Beitrag werden wir sie in einem detaillierten Feature-Vergleich gegenüberstellen und die Ergebnisse der Leistung von PgBouncer vs. Pgpool-II für Ihr PostgreSQL-Hosting vergleichen!
Wie stapeln sich die Features?
Beginnen wir mit dem Vergleich der Funktionen von PgBouncer und Pgpool-II:
PgBouncer | Pgpool-II | |
---|---|---|
Ressourcenverbrauch | Es wird nur ein Prozess verwendet, was es sehr leicht macht. PgBouncer garantiert einen geringen Speicherbedarf, auch bei großen Datensätzen. Gewinner! | Wenn wir N parallele Verbindungen benötigen, verzweigt dies N untergeordnete Prozesse. Standardmäßig gibt es 32 untergeordnete Prozesse, die gegabelt werden. |
Wann werden Verbindungen wiederverwendet? | PgBouncer definiert einen Pool pro Kombination aus Benutzer und Datenbank. Diese wird von allen Clients gemeinsam genutzt, sodass allen Clients eine gepoolte Verbindung zur Verfügung steht. Gewinner! | Pgpool-II definiert einen Prozess pro Kindprozess. Wir können nicht kontrollieren, mit welchem untergeordneten Prozess sich ein Client verbindet. Ein Client profitiert nur dann von einer gepoolten Verbindung, wenn er sich mit einem Kind verbindet, das zuvor eine Verbindung für diese Datenbank+Benutzer-Kombination bedient hat. |
Pooling-Modi | PgBouncer unterstützt drei verschiedene Modi:Sitzung (Verbindung wird an den Pool zurückgegeben, wenn der Client die Verbindung trennt), Transaktion (wird an den Pool zurückgegeben, wenn der Client festschreibt oder zurücksetzt) oder Anweisung ( Verbindung, die nach der Ausführung jeder Anweisung an den Pool zurückgegeben wird). Gewinner! | Pgpool-II unterstützt nur den Sitzungs-Pooling-Modus – die Wirksamkeit des Poolings hängt vom guten Verhalten der Clients ab. |
Hohe Verfügbarkeit | Nicht unterstützt. | Hochverfügbarkeit von PostgreSQL wird durch die in Pgpool-II integrierten Watcher-Prozesse unterstützt. Gewinner! |
Lastenausgleich | Nicht unterstützt – PgBouncer empfiehlt die Verwendung von HAProxy für Hochverfügbarkeit und Lastausgleich. | Unterstützt automatisches Load-Balancing – ist sogar intelligent genug, um Leseanfragen an Standbys und Schreibvorgänge an Master umzuleiten. Gewinner! |
Multi-Cluster-Unterstützung | Eine PgBouncer-Instanz kann mehreren PostgreSQL-Clustern (Ein-Knoten- oder Replikat-Sets) vorangehen. Dies kann die Kosten für Middleware reduzieren, wenn mehrere PostgreSQL-Cluster verwendet werden. Gewinner! (Hinweis – dieser Vorteil gilt nur für bestimmte Szenarien) | Pgpool-II hat keine Multi-Cluster-Unterstützung. |
Verbindungskontrolle | PgBouncer ermöglicht das Begrenzen von Verbindungen pro Pool, pro Datenbank, pro Benutzer oder pro Client. Gewinner! | Pgpool-II erlaubt nur die Begrenzung der Gesamtzahl der Verbindungen. |
Verbindungswarteschlange | PgBouncer unterstützt Warteschlangenbildung auf Anwendungsebene (d. h. PgBouncer verwaltet die Warteschlange). Gewinner! | Pgpool-II unterstützt Warteschlangen auf Kernel-Ebene – dies kann dazu führen, dass pg_bench auf CentOS 6 einfriert. |
Authentifizierung | Passthrough-Authentifizierung wird über PgBouncer unterstützt. Gewinner! | Pgpool-II unterstützt keine Pass-Through-Authentifizierung – Nutzer und ihre md5-verschlüsselten Passwörter müssen in einer Datei aufgelistet und jedes Mal manuell aktualisiert werden, wenn ein Nutzer aktualisiert ihr Passwort. Pgpool-II unterstützt passwortlose Authentifizierung durch PAM- oder SSL-Zertifikate. Diese müssen jedoch außerhalb des PostgreSQL-Systems eingerichtet werden, während PgBouncer dies auf den PostgreSQL-Server auslagern kann. |
Verwaltung | PgBouncer bietet eine virtuelle Datenbank, die verschiedene nützliche Statistiken meldet. | Pgpool-II bietet eine detaillierte Verwaltungsoberfläche, einschließlich einer GUI. Gewinner! |
Hostbasierte Authentifizierung | Unterstützt. Unentschieden! | Unterstützt. Unentschieden! |
SSL-Unterstützung | Volle Unterstützung. Unentschieden! | Volle Unterstützung. Unentschieden! |
Logische Replikation | Wird von PgBouncer nicht unterstützt. Unentschieden! | Unterstützt durch Pgpool-II, aber dies geschieht durch Senden der Schreibabfragen an alle Knoten und wird im Allgemeinen nicht empfohlen. Unentschieden! |
Lizenz | ISC – sehr freizügig, erlaubt grundsätzlich jede Nutzung. Unentschieden! | Benutzerdefinierte Lizenz – ebenso freizügig. Unentschieden! |
Unterm Strich – Pgpool-II ist ein großartiges Tool, wenn Sie Lastenausgleich und Hochverfügbarkeit benötigen. Das Verbindungspooling ist fast ein Bonus, den Sie nebenbei erhalten. PgBouncer macht nur eine Sache, aber macht es wirklich gut. Wenn das Ziel darin besteht, die Anzahl der Verbindungen zu begrenzen und den Ressourcenverbrauch zu reduzieren, gewinnt PgBouncer zweifellos.
Es ist auch völlig in Ordnung, sowohl PgBouncer als auch Pgpool-II in einer Kette zu verwenden – Sie können einen PgBouncer haben, um ein Verbindungspooling bereitzustellen, das mit a kommuniziert Pgpool-II-Instanz, die Hochverfügbarkeit und Lastenausgleich bietet. So erhalten Sie das Beste aus beiden Welten!
PostgreSQL Connection Pooling:Teil 4 – PgBouncer vs. Pgpool-IIClick To Tweet
Leistungstest
Während PgBouncer theoretisch die bessere Option zu sein scheint, kann die Theorie oft irreführend sein. Also haben wir die beiden Verbindungspooler mit dem Standard-pgbench-Tool gegeneinander antreten lassen, um in einem Benchmark-Test zu sehen, welcher einen besseren Transaktionsdurchsatz pro Sekunde bietet. Zur Sicherheit haben wir die gleichen Tests auch ohne Connection Pooler durchgeführt.
Testbedingungen
Alle PostgreSQL-Benchmarktests wurden unter den folgenden Bedingungen durchgeführt:
- Initialisierte pgbench mit einem Skalierungsfaktor von 100.
- Auto-Vacuuming auf der PostgreSQL-Instanz deaktiviert, um Interferenzen zu vermeiden.
- Kein anderer Workload funktionierte zu diesem Zeitpunkt.
- Verwendet das standardmäßige pgbench-Skript, um die Tests auszuführen.
- Verwendete Standardeinstellungen für PgBouncer und Pgpool-II, außer max_children *. Alle PostgreSQL-Limits wurden ebenfalls auf ihre Standardwerte gesetzt.
- Alle Tests wurden als einzelner Thread auf einem Computer mit einer CPU und zwei Kernen für eine Dauer von 5 Minuten ausgeführt.
- Zwingt pgbench, eine neue Verbindung für jede Transaktion mit der Option -C zu erstellen. Dies emuliert moderne Webanwendungs-Workloads und ist der einzige Grund, einen Pooler zu verwenden!
Wir haben jede Iteration 5 Minuten lang ausgeführt, um sicherzustellen, dass jegliches Rauschen gemittelt wird. So wurde die Middleware installiert:
- Für PgBouncer haben wir es auf demselben Rechner installiert wie die PostgreSQL-Server. Dies ist die Konfiguration, die wir in unseren verwalteten PostgreSQL-Clustern verwenden. Da PgBouncer ein sehr leichtgewichtiger Prozess ist, hat die Installation auf der Box keinen Einfluss auf die Gesamtleistung.
- Für Pgpool-II haben wir sowohl getestet, als die Pgpool-II-Instanz auf demselben Computer wie PostgreSQL (in der Box-Spalte) installiert war, und wenn sie auf einem anderen Computer installiert war (Off-Box-Spalte). Wie erwartet ist die Leistung viel besser, wenn Pgpool-II nicht einsatzbereit ist, da es nicht mit dem PostgreSQL-Server um Ressourcen konkurrieren muss.
Durchsatz-Benchmark
Hier sind die Ergebnisse der Transaktionen pro Sekunde (TPS) für jedes Szenario für eine Reihe von Clients:
Anzahl der Kunden | Ohne Pooling | PgBouncer | Pgpool-II (auf Karton) | Pgpool-II (aus dem Kästchen) |
---|---|---|---|---|
10 | 16,96 | 26.86 | 15.52 | 18.22 |
20 | 16,97 | 27.19 | 15.67 | 18.28 |
40 | 16.73 | 26.77 | 15.33 | 18.3 |
80 | 16.75 | 26.64 | 15.53 | 18.13 |
100 | 16.51 | 26.73 | 15.66 | 18.45 |
200 | Verbindungen abgebrochen. | 26.93 | Verbindungen abgebrochen, wenn max-children> 200, pgbench hängt bei max-children-Wert, wenn <=100. | Verbindungen abgebrochen, wenn max-children> 200, pgbench hängt bei max-children-Wert, wenn <=100. |
Pgpool-II hängt, wenn pg_bench mit mehr Clients als max_children ausgeführt wird. Daher haben wir die max_children erhöht, um sie der Anzahl der Clients für jeden Testlauf anzupassen.
Wenn wir die prozentuale Erhöhung der TPS bei Verwendung eines Verbindungspoolers berechnen, erhalten wir Folgendes:
Anzahl der Kunden | PgBouncer | Pgpool-II (auf Karton) | Pgpool-II (off box) |
---|---|---|---|
10 | 58,37 % | -8,49 % | 7,43 % |
20 | 60,22 % | -7,66 % | 7,72 % |
40 | 60,01 % | -8,37 % | 9,38 % |
80 | 59,04 % | -7,28 % | 8,24 % |
100 | 61,90 % | -5,15 % | 11,75 % |
* Verbesserungsalgorithmus =(mit Pooler – ohne)/ohne
Schlussworte
Wie Sie den Leistungstestergebnissen entnehmen können, können eine gut konfigurierte Verbindung und ein gut geeigneter Verbindungspooler den Transaktionsdurchsatz drastisch erhöhen, selbst bei einer relativ kleinen Anzahl von Clients. Verbindungspooler sind besonders nützlich für ihre Warteschlangenunterstützung – wenn die Anzahl der Clients die vom PostgreSQL-Server unterstützte maximale Anzahl von Clients überschreitet, ist PgBouncer immer noch in der Lage, die Transaktionsrate aufrechtzuerhalten, während direkte Verbindungen zu PostgreSQL abgebrochen werden.
Ein schlecht konfigurierter Verbindungspooler kann jedoch tatsächlich reduzieren die Leistung, wie wir sie hier mit dem Pgpool-II-Setup gesehen haben. Ein Teil des Problems besteht darin, Pgpool-II doppelt zu verwenden die Anzahl der Prozesse, die auf demselben Server ausgeführt werden – wir müssen Führen Sie Pgpool-II auf einem separaten Server aus, um eine gute Leistung zu erzielen. Aber selbst dann schafft PgBouncer eine bessere Leistung für diese relativ kleine Anzahl von Clients.
Beachten Sie auch, dass der Test hier eigentlich perfekt für Pgpool-II erstellt wurde – da bei N> 32 die Anzahl der Clients und die Anzahl der untergeordneten Prozesse gleich waren, und daher, bei jeder erneuten Verbindung wurde garantiert, dass ein zwischengespeicherter Prozess gefunden wurde. Schon damals war PgBouncer die schnellere Alternative.
Unsere Tests zeigen also, dass PgBouncer die weitaus bessere Wahl für das Verbindungspooling ist. Es ist jedoch wichtig, sich daran zu erinnern, dass ein Verbindungspooler zwar für die meisten realistischen Workloads absolut obligatorisch ist, es jedoch von Ihrer Anwendung abhängt, ob Sie durch die Verwendung eines clientseitigen Pools oder von Middleware wie PgBouncer mehr gewinnen. Muster des Datenzugriffs würden eine Rolle spielen, ebenso wie die Latenzen, die aufgrund Ihrer Architektur auftreten. Wir empfehlen, Ihre Arbeitsbelastung mit beiden zu testen und dann die beste Vorgehensweise zu wählen – es gibt keine bessere Alternative zum Experimentieren!