PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak osiągnąć wysoką dostępność PostgreSQL z pgBouncer?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydajność OLTP od PostgreSQL 8.3

  2. Znajdź wartości, które nie zawierają liczb w PostgreSQL

  3. Java Crosstab — zapytanie przygotowanej instrukcji

  4. Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL

  5. Dynamicznie generuj kolumny dla tabeli krzyżowej w PostgreSQL