PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erreichen Sie PostgreSQL High Availability mit pgBouncer

In der Datenbankwelt gibt es viele gängige Konzepte wie Hochverfügbarkeit, Failover und Verbindungspooling. All dies sind nützliche Dinge, die auf jedem System implementiert werden können, und in manchen Fällen sogar ein Muss.

Ein Verbindungs-Pooling ist eine Methode, um einen Pool von Verbindungen zu erstellen und diese wiederzuverwenden, ohne ständig neue Verbindungen zur Datenbank öffnen zu müssen, wodurch die Leistung Ihrer Anwendungen erheblich gesteigert wird. PgBouncer ist ein beliebter Verbindungspooler, der für PostgreSQL entwickelt wurde, aber er reicht nicht aus, um PostgreSQL High Availability selbst zu erreichen, da er keine Multi-Host-Konfiguration, Failover oder Erkennung hat.

Die Verwendung eines Load Balancers ist eine Möglichkeit, Hochverfügbarkeit in Ihrer Datenbanktopologie zu erreichen. Es könnte nützlich sein, um den Datenverkehr auf fehlerfreie Datenbankknoten umzuleiten, den Datenverkehr auf mehrere Server zu verteilen, um die Leistung zu verbessern, oder einfach nur einen einzelnen Endpunkt in Ihrer Anwendung zu konfigurieren, um die Konfiguration und den Failover-Prozess zu vereinfachen. Aus diesem Grund ist HAProxy eine gute Option zur Ergänzung Ihres Verbindungspoolers, da es sich um einen Open-Source-Proxy handelt, der zur Implementierung von Hochverfügbarkeit, Lastausgleich und Proxying für TCP- und HTTP-basierte Anwendungen verwendet werden kann.

In diesem Blog verwenden wir beide Konzepte, Load Balancer und Connection Pooling (HAProxy + PgBouncer), um eine Hochverfügbarkeitsumgebung für Ihre PostgreSQL-Datenbank bereitzustellen.

Wie PgBouncer funktioniert

PgBouncer fungiert als PostgreSQL-Server, Sie müssen also nur mit den PgBouncer-Informationen (IP-Adresse/Hostname und Port) auf Ihre Datenbank zugreifen, und PgBouncer stellt eine Verbindung zum PostgreSQL-Server her, oder es wird wiederverwenden, falls vorhanden.

Wenn PgBouncer eine Verbindung erhält, führt es die Authentifizierung durch, die von der in der Konfigurationsdatei angegebenen Methode abhängt. PgBouncer unterstützt alle Authentifizierungsmechanismen, die der PostgreSQL-Server unterstützt. Danach sucht PgBouncer nach einer zwischengespeicherten Verbindung mit derselben Kombination aus Benutzername und Datenbank. Wenn eine zwischengespeicherte Verbindung gefunden wird, gibt es die Verbindung an den Client zurück, wenn nicht, erstellt es eine neue Verbindung. Abhängig von der PgBouncer-Konfiguration und der Anzahl aktiver Verbindungen kann es möglich sein, dass die neue Verbindung in die Warteschlange gestellt wird, bis sie erstellt werden kann, oder sogar abgebrochen wird.

Das Verhalten von PgBouncer hängt vom konfigurierten Pooling-Modus ab:

  • Sitzungspooling (Standard):Wenn ein Client eine Verbindung herstellt, wird ihm für die gesamte Dauer der Verbindung eine Serververbindung zugewiesen. Wenn der Client die Verbindung trennt, wird die Serververbindung wieder in den Pool gestellt.
  • Transaktionspooling :Eine Serververbindung wird einem Client nur während einer Transaktion zugewiesen. Wenn PgBouncer feststellt, dass die Transaktion beendet ist, wird die Serververbindung wieder in den Pool gestellt.
  • Anweisungspooling :Die Serververbindung wird unmittelbar nach Abschluss einer Abfrage wieder in den Pool gestellt. Transaktionen mit mehreren Anweisungen sind in diesem Modus nicht zulässig, da sie beschädigt würden.

Um Abfragen zwischen mehreren Servern auszugleichen, kann es auf der PgBouncer-Seite eine gute Idee sein, server_lifetime kleiner zu machen und auch server_round_robin einzuschalten. Standardmäßig werden ungenutzte Verbindungen vom LIFO-Algorithmus wiederverwendet, der möglicherweise nicht so gut funktioniert, wenn ein Load-Balancer verwendet wird.

So installieren Sie PgBouncer

Wir gehen davon aus, dass Sie Ihren PostgreSQL-Cluster und HAProxy bereitgestellt haben und betriebsbereit sind. Andernfalls können Sie diesem Blogbeitrag folgen, um PostgreSQL für Hochverfügbarkeit einfach bereitzustellen.

Sie können PgBouncer auf jedem Datenbankknoten oder auf einem externen Rechner installieren, in jedem Fall haben Sie so etwas:

Um die PgBouncer-Software zu erhalten, können Sie zum PgBouncer-Downloadbereich gehen oder Verwenden Sie die RPM- oder DEB-Repositories. Für dieses Beispiel verwenden wir CentOS 8 und installieren es aus dem offiziellen PostgreSQL-Repository.

Laden Sie zuerst das entsprechende Repository von der PostgreSQL-Site herunter und installieren Sie es (falls Sie es noch nicht eingerichtet haben):

$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm

Installieren Sie dann das PgBouncer-Paket:

$ yum install pgbouncer

Überprüfen Sie die Installation:

$ pgbouncer --version

PgBouncer 1.14.0

libevent 2.1.8-stable

adns: c-ares 1.13.0

tls: OpenSSL 1.1.1c FIPS  28 May 2019

Wenn es abgeschlossen ist, haben Sie eine neue Konfigurationsdatei in /etc/pgbouncer/pgbouncer.ini:

[databases]

[users]

[pgbouncer]

logfile = /var/log/pgbouncer/pgbouncer.log

pidfile = /var/run/pgbouncer/pgbouncer.pid

listen_addr = 127.0.0.1

listen_port = 6432

auth_type = trust

auth_file = /etc/pgbouncer/userlist.txt

admin_users = postgres

stats_users = stats, postgres

Sehen wir uns diese Parameter nacheinander an:

  • Datenbankabschnitt [Datenbanken]: Diese enthält Schlüssel=Wert-Paare, wobei der Schlüssel als Datenbankname und der Wert als eine Liste im Stil einer libpq-Verbindungszeichenfolge von Schlüssel=Wert-Paaren genommen wird.
  • Benutzerbereich [Benutzer]: Dies enthält Schlüssel=Wert-Paare, wobei der Schlüssel als Benutzername und der Wert als libpq-Verbindungszeichenfolgenstilliste von Schlüssel=Wert-Paaren von Konfigurationseinstellungen verwendet wird, die für diesen Benutzer spezifisch sind.
  • Protokolldatei :Gibt die Protokolldatei an. Die Protokolldatei wird offen gehalten, also nach der Rotation kill -HUP oder auf der Konsole RELOAD; sollte erledigt werden.
  • PID-Datei :Gibt die PID-Datei an. Ohne das pidfile-Set ist der Daemon nicht erlaubt.
  • listen_addr :Gibt eine Liste von Adressen an, an denen auf TCP-Verbindungen gewartet werden soll. Sie können auch * verwenden, was „alle Adressen abhören“ bedeutet. Wenn nicht gesetzt, werden nur Unix-Socket-Verbindungen akzeptiert.
  • listen_port: Auf welchem ​​Port zu lauschen ist. Gilt sowohl für TCP- als auch für Unix-Sockets. Der Standardport ist 6432.
  • auth_type: So authentifizieren Sie Benutzer.
  • auth_file :Der Name der Datei, aus der Benutzernamen und Passwörter geladen werden sollen.
  • admin_users :Kommagetrennte Liste von Datenbankbenutzern, die sich verbinden und alle Befehle auf der Konsole ausführen dürfen.
  • stats_users :Durch Kommas getrennte Liste von Datenbankbenutzern, die eine Verbindung herstellen und schreibgeschützte Abfragen auf der Konsole ausführen dürfen.

Dies ist nur ein Beispiel der Standardkonfigurationsdatei, da das Original 359 Zeilen hat, aber der Rest der Zeilen standardmäßig auskommentiert ist. Um alle verfügbaren Parameter zu erhalten, können Sie die offizielle Dokumentation einsehen.

Wie man PgBouncer verwendet

Sehen wir uns nun eine grundlegende Konfiguration an, damit es funktioniert.

Die Konfigurationsdatei pgbouncer.ini:

$ cat /etc/pgbouncer/pgbouncer.ini

[databases]

world = host=127.0.0.1 port=5432 dbname=world

[pgbouncer]

logfile = /var/log/pgbouncer/pgbouncer.log

pidfile = /var/run/pgbouncer/pgbouncer.pid

listen_addr = *

listen_port = 6432

auth_type = md5

auth_file = /etc/pgbouncer/userlist.txt

admin_users = admindb

Und die Authentifizierungsdatei:

$ cat /etc/pgbouncer/userlist.txt

"admindb" "root123"

Also, in diesem Fall habe ich PgBouncer im selben Datenbankknoten installiert, hört alle IP-Adressen ab und stellt eine Verbindung zu einer PostgreSQL-Datenbank namens „world“ her. Ich verwalte auch die erlaubten Benutzer in der userlist.txt-Datei mit einem Klartext-Passwort, das bei Bedarf verschlüsselt werden kann.

Um den PgBouncer-Dienst zu starten, müssen Sie nur den folgenden Befehl ausführen:

$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini

Wobei -d "Daemon" bedeutet, also läuft es im Hintergrund.

$ netstat -pltn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 0.0.0.0:6432            0.0.0.0:*               LISTEN      4274/pgbouncer

tcp6       0      0 :::6432                 :::*                    LISTEN      4274/pgbouncer

Wie Sie sehen können, ist PgBouncer aktiv und wartet auf Verbindungen am Port 6432. Um auf die PostgreSQL-Datenbank zuzugreifen, führen Sie den folgenden Befehl mit Ihren lokalen Informationen (Port, Host, Benutzername und Datenbankname) aus. :

$ psql -p 6432 -h 127.0.0.1 -U admindb world

Password for user admindb:

psql (12.4)

Type "help" for help.



world=#

Denken Sie daran, dass der Datenbankname (world) die Datenbank ist, die in Ihrer PgBouncer-Konfigurationsdatei konfiguriert ist:

[databases]

world = host=127.0.0.1 port=5432 dbname=world

Überwachung und Verwaltung von PgBouncer

Anstatt auf Ihre PostgreSQL-Datenbank zuzugreifen, können Sie sich direkt mit PgBouncer verbinden, um sie zu verwalten oder zu überwachen. Verwenden Sie dazu denselben Befehl, den Sie zuvor verwendet haben, ändern Sie jedoch die Datenbank in „pgbouncer“:

$ psql -p 6432 -h 127.0.0.1 -U admindb pgbouncer

Password for user admindb:

psql (12.4, server 1.14.0/bouncer)

Type "help" for help.



pgbouncer=# SHOW HELP;

NOTICE:  Console usage

DETAIL:

SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION

SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM

SHOW DNS_HOSTS|DNS_ZONES

SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS

SET key = arg

RELOAD

PAUSE [<db>]

RESUME [<db>]

DISABLE <db>

ENABLE <db>

RECONNECT [<db>]

KILL <db>

SUSPEND

SHUTDOWN



SHOW

Jetzt können Sie verschiedene PgBouncer-Befehle ausführen, um es zu überwachen:

STATS_TOTALS ANZEIGEN:

pgbouncer=# SHOW STATS_TOTALS;

 database  | xact_count | query_count | bytes_received | bytes_sent | xact_time | query_time | wait_time

-----------+------------+-------------+----------------+------------+-----------+------------+-----------

 pgbouncer |          1 |           1 |              0 |          0 |         0 |          0 |         0

 world     |          2 |           2 |             59 |     234205 |      8351 |       8351 |      4828

(2 rows)

SERVER ANZEIGEN:

pgbouncer=# SHOW SERVERS;

 type |  user   | database | state  |   addr    | port | local_addr | local_port |      connect_time       |      request_time

| wait | wait_us | close_needed |      ptr       |      link      | remote_pid | tls

------+---------+----------+--------+-----------+------+------------+------------+-------------------------+-------------------------

+------+---------+--------------+----------------+----------------+------------+-----

 S    | admindb | world    | active | 127.0.0.1 | 5432 | 127.0.0.1  |      45052 | 2020-09-09 18:31:57 UTC | 2020-09-09 18:32:04 UTC

|    0 |       0 |            0 | 0x55b04a51b3d0 | 0x55b04a514810 |       5738 |

(1 row)

CLIENTS ZEIGEN:

pgbouncer=# SHOW CLIENTS;

 type |  user   | database  | state  |   addr    | port  | local_addr | local_port |      connect_time       |      request_time

  | wait | wait_us | close_needed |      ptr       |      link      | remote_pid | tls

------+---------+-----------+--------+-----------+-------+------------+------------+-------------------------+-----------------------

--+------+---------+--------------+----------------+----------------+------------+-----

 C    | admindb | pgbouncer | active | 127.0.0.1 | 46950 | 127.0.0.1  |       6432 | 2020-09-09 18:29:46 UTC | 2020-09-09 18:55:11 UT

C | 1441 |  855140 |            0 | 0x55b04a5145e0 |                |          0 |

 C    | admindb | world     | active | 127.0.0.1 | 47710 | 127.0.0.1  |       6432 | 2020-09-09 18:31:41 UTC | 2020-09-09 18:32:04 UT

C |    0 |       0 |            0 | 0x55b04a514810 | 0x55b04a51b3d0 |          0 |

(2 rows)

POOLS ANZEIGEN:

pgbouncer=# SHOW POOLS;

 database  |   user    | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_

mode

-----------+-----------+-----------+------------+-----------+---------+---------+-----------+----------+---------+------------+------

-----

 pgbouncer | pgbouncer |         1 |          0 |         0 |       0 |       0 |         0 |        0 |       0 |          0 | state

ment

 world     | admindb   |         1 |          0 |         1 |       0 |       0 |         0 |        0 |       0 |          0 | sessi

on

(2 rows)

Und um es zu verwalten...

NACHLADEN:

pgbouncer=# RELOAD;

RELOAD

PAUSE:

pgbouncer=# PAUSE world;

PAUSE

FORTSETZUNG:

pgbouncer=# RESUME world;

RESUME

Diese Befehle sind nur ein Beispiel. Eine vollständige Liste der Befehle finden Sie in der offiziellen Dokumentation.

Fazit

Die Verwendung einer Kombination aus PgBouncer + HAProxy + PostgreSQL ist eine gute Möglichkeit, Hochverfügbarkeit für Ihren PostgreSQL-Cluster zu erreichen und gleichzeitig die Leistung Ihrer Datenbank zu verbessern.

Wie Sie sehen können, können Sie, wenn Sie Ihre PostgreSQL-Umgebung eingerichtet haben, die Sie mit ClusterControl mit nur wenigen Klicks bereitstellen können, ganz einfach PgBouncer hinzufügen, um die Vorteile eines Verbindungspoolers für Ihre Systeme zu nutzen.