W świecie baz danych istnieje wiele powszechnych koncepcji, takich jak wysoka dostępność, przełączanie awaryjne i łączenie połączeń. Wszystkie z nich są przydatne do wdrożenia w dowolnym systemie, a w niektórych przypadkach nawet konieczne.
Zestawienie połączeń to metoda tworzenia puli połączeń i ponownego ich wykorzystywania, unikając nieustannego otwierania nowych połączeń do bazy danych, co znacznie zwiększy wydajność Twoich aplikacji. PgBouncer to popularny program do puli połączeń zaprojektowany dla PostgreSQL, ale sam w sobie nie wystarcza do osiągnięcia wysokiej dostępności PostgreSQL, ponieważ nie ma konfiguracji z wieloma hostami, przełączania awaryjnego ani wykrywania.
Korzystanie z Load Balancera to sposób na zapewnienie wysokiej dostępności w topologii bazy danych. Może to być przydatne w przypadku przekierowywania ruchu do sprawnych węzłów bazy danych, dystrybucji ruchu na wiele serwerów w celu poprawy wydajności lub po prostu skonfigurowania jednego punktu końcowego w aplikacji w celu ułatwienia konfiguracji i procesu przełączania awaryjnego. W tym celu HAProxy jest dobrą opcją do uzupełnienia puli połączeń, ponieważ jest to proxy typu open source, którego można użyć do implementacji wysokiej dostępności, równoważenia obciążenia i proxy dla aplikacji opartych na protokołach TCP i HTTP.
W tym blogu wykorzystamy obie koncepcje, Load Balancer i łączenie połączeń (HAProxy + PgBouncer), aby wdrożyć środowisko wysokiej dostępności dla Twojej bazy danych PostgreSQL.
Jak działa PgBouncer
PgBouncer działa jak serwer PostgreSQL, więc wystarczy uzyskać dostęp do bazy danych za pomocą informacji PgBouncer (adres IP/nazwa hosta i port), a PgBouncer utworzy połączenie z serwerem PostgreSQL, w przeciwnym razie użyj ponownie, jeśli istnieje.
Kiedy PgBouncer odbiera połączenie, przeprowadza uwierzytelnianie, które zależy od metody określonej w pliku konfiguracyjnym. PgBouncer obsługuje wszystkie mechanizmy uwierzytelniania obsługiwane przez serwer PostgreSQL. Następnie PgBouncer sprawdza połączenie z pamięcią podręczną z tą samą kombinacją nazwy użytkownika i bazy danych. Jeśli zostanie znalezione połączenie buforowane, zwraca połączenie do klienta, jeśli nie, tworzy nowe połączenie. W zależności od konfiguracji PgBouncer i liczby aktywnych połączeń, może się zdarzyć, że nowe połączenie zostanie umieszczone w kolejce do momentu utworzenia lub nawet przerwania.
Zachowanie PgBouncer zależy od skonfigurowanego trybu puli:
- łączenie sesji (domyślnie):Gdy klient się połączy, zostanie mu przypisane połączenie z serwerem na cały czas, w którym klient pozostaje połączony. Gdy klient się rozłączy, połączenie z serwerem zostanie przywrócone do puli.
- pula transakcji :Połączenie z serwerem jest przypisywane klientowi tylko podczas transakcji. Kiedy PgBouncer zauważy, że transakcja się skończyła, połączenie z serwerem zostanie przywrócone do puli.
- grupowanie wyciągów :Połączenie z serwerem zostanie przywrócone do puli natychmiast po zakończeniu zapytania. Transakcje wielowyciągowe są w tym trybie niedozwolone, ponieważ mogłyby się zepsuć.
Aby zrównoważyć zapytania między kilkoma serwerami, po stronie PgBouncera dobrym pomysłem może być zmniejszenie wartości server_lifetime, a także włączenie server_round_robin. Domyślnie nieaktywne połączenia są ponownie wykorzystywane przez algorytm LIFO, który może nie działać tak dobrze, gdy używany jest load-balancer.
Jak zainstalować PgBouncera
Zakładamy, że masz wdrożony klaster PostgreSQL i HAProxy, które działają, w przeciwnym razie możesz śledzić ten wpis na blogu, aby łatwo wdrożyć PostgreSQL w celu zapewnienia wysokiej dostępności.
Możesz zainstalować PgBouncer na każdym węźle bazy danych lub na komputerze zewnętrznym, w każdym razie będziesz mieć coś takiego:
Aby pobrać oprogramowanie PgBouncer, możesz przejść do sekcji pobierania PgBouncer lub skorzystaj z repozytoriów RPM lub DEB. W tym przykładzie użyjemy CentOS 8 i zainstalujemy go z oficjalnego repozytorium PostgreSQL.
Najpierw pobierz i zainstaluj odpowiednie repozytorium ze strony PostgreSQL (jeśli jeszcze go nie masz):
$ 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
Następnie zainstaluj pakiet PgBouncer:
$ yum install pgbouncer
Zweryfikuj instalację:
$ 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
Po zakończeniu będziesz miał nowy plik konfiguracyjny zlokalizowany w /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
Zobaczmy te parametry jeden po drugim:
- Sekcja baz danych [bazy danych]: Zawiera pary klucz=wartość, w których klucz będzie traktowany jako nazwa bazy danych, a wartość jako lista stylów parametrów połączenia libpq zawierająca pary klucz=wartość.
- Sekcja użytkownika [users]: Zawiera pary klucz=wartość, w których klucz będzie traktowany jako nazwa użytkownika, a wartość jako lista stylów parametrów połączenia libpq zawierająca pary klucz=wartość ustawień konfiguracyjnych specyficznych dla tego użytkownika.
- plik dziennika :Określa plik dziennika. Plik dziennika pozostaje otwarty, więc po obrocie kill -HUP lub na konsoli RELOAD; powinno być zrobione.
- plik pid :Określa plik PID. Bez zestawu pidfile demon nie jest dozwolony.
- listen_addr :Określa listę adresów, w których należy nasłuchiwać połączeń TCP. Możesz również użyć *, co oznacza „słuchaj pod wszystkimi adresami”. Jeśli nie jest ustawione, akceptowane są tylko połączenia z gniazdami Unix.
- listen_port: Na którym porcie nasłuchiwać. Dotyczy gniazd TCP i Unix. Domyślny port to 6432.
- auth_type: Jak uwierzytelnić użytkowników.
- auth_file :Nazwa pliku, z którego mają zostać załadowane nazwy użytkowników i hasła.
- admin_users :Oddzielona przecinkami lista użytkowników bazy danych, którzy mogą łączyć się i uruchamiać wszystkie polecenia w konsoli.
- stats_users :Oddzielona przecinkami lista użytkowników bazy danych, którzy mogą łączyć się i uruchamiać zapytania tylko do odczytu na konsoli.
To jest tylko próbka domyślnego pliku konfiguracyjnego, ponieważ oryginał ma 359 wierszy, ale pozostałe wiersze są domyślnie zakomentowane. Aby uzyskać wszystkie dostępne parametry, możesz sprawdzić oficjalną dokumentację.
Jak korzystać z PgBouncera
Teraz zobaczmy podstawową konfigurację, aby to działało.
Plik konfiguracyjny 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
I plik uwierzytelniający:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
Więc w tym przypadku zainstalowałem PgBouncer w tym samym węźle bazy danych, nasłuchując wszystkich adresów IP i łączy się on z bazą danych PostgreSQL o nazwie „świat”. Zarządzam również dozwolonymi użytkownikami w pliku userlist.txt za pomocą hasła w postaci zwykłego tekstu, które w razie potrzeby można zaszyfrować.
Aby uruchomić usługę PgBouncer, wystarczy uruchomić następujące polecenie:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
Gdzie -d oznacza „demon”, więc będzie działać w tle.
$ 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
Jak widać, PgBouncer działa i czeka na połączenia w porcie 6432. Aby uzyskać dostęp do bazy danych PostgreSQL, uruchom następujące polecenie, używając swoich lokalnych informacji (port, host, nazwa użytkownika i nazwa bazy danych) :
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
Pamiętaj, że nazwa bazy danych (świat) to baza danych skonfigurowana w twoim pliku konfiguracyjnym PgBouncer:
[databases]
world = host=127.0.0.1 port=5432 dbname=world
Monitorowanie i zarządzanie PgBouncerem
Zamiast dostępu do bazy danych PostgreSQL, możesz połączyć się bezpośrednio z PgBouncer, aby nią zarządzać lub monitorować. W tym celu użyj tego samego polecenia, którego użyłeś wcześniej, ale zmień bazę danych na „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
Teraz możesz uruchomić różne polecenia PgBouncer, aby to monitorować:
POKAŻ STATS_TOTALS:
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)
POKAŻ SERWERY:
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)
POKAŻ KLIENTÓW:
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)
POKAŻ BASENY:
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)
I zarządzać tym...
PONOWNIE ZAŁADUJ:
pgbouncer=# RELOAD;
RELOAD
PAUSE:
pgbouncer=# PAUSE world;
PAUSE
WZNÓW:
pgbouncer=# RESUME world;
RESUME
Te polecenia to tylko przykład. Pełna lista poleceń znajduje się w oficjalnej dokumentacji.
Wnioski
Korzystanie z kombinacji PgBouncer + HAProxy + PostgreSQL to dobry sposób na osiągnięcie wysokiej dostępności klastra PostgreSQL, poprawiając jednocześnie wydajność bazy danych.
Jak widać, jeśli masz swoje środowisko PostgreSQL, które możesz wdrożyć za pomocą ClusterControl za pomocą kilku kliknięć, możesz łatwo dodać PgBouncer, aby skorzystać z puli połączeń dla swoich systemów.