sql >> Databáze >  >> RDS >> PostgreSQL

Jak dosáhnout vysoké dostupnosti PostgreSQL pomocí pgBouncer

V databázovém světě existuje mnoho běžných pojmů, jako je vysoká dostupnost, převzetí služeb při selhání a sdružování připojení. Všechny z nich jsou užitečné věci k implementaci na jakýkoli systém av některých případech dokonce nutnost.

Sdružování připojení je metoda vytváření fondu připojení a jejich opětovného použití, aby se zabránilo neustálému otevírání nových připojení k databázi, což výrazně zvýší výkon vašich aplikací. PgBouncer je oblíbený fond připojení navržený pro PostgreSQL, ale k dosažení vysoké dostupnosti PostgreSQL sám o sobě nestačí, protože nemá konfiguraci pro více hostitelů, převzetí služeb při selhání ani detekci.

Použití nástroje Load Balancer je způsob, jak dosáhnout vysoké dostupnosti v topologii databáze. Mohlo by to být užitečné pro přesměrování provozu na zdravé databázové uzly, distribuci provozu na více serverů za účelem zlepšení výkonu nebo jen pro konfiguraci jednoho koncového bodu ve vaší aplikaci pro snazší konfiguraci a proces převzetí služeb při selhání. Za tímto účelem je HAProxy dobrou volbou pro doplnění vašeho pooleru připojení, protože jde o open-source proxy, kterou lze použít k implementaci vysoké dostupnosti, vyvažování zátěže a proxy pro aplikace založené na TCP a HTTP.

V tomto blogu použijeme oba koncepty, Load Balancer a Connection pooling (HAProxy + PgBouncer), k nasazení prostředí High Availability pro vaši PostgreSQL databázi.

Jak PgBouncer funguje

PgBouncer funguje jako PostgreSQL server, takže stačí přistupovat k databázi pomocí informací PgBouncer (IP adresa/název hostitele a port) a PgBouncer vytvoří připojení k serveru PostgreSQL nebo znovu použít, pokud existuje.

Když PgBouncer přijme spojení, provede ověření, které závisí na metodě uvedené v konfiguračním souboru. PgBouncer podporuje všechny autentizační mechanismy, které PostgreSQL server podporuje. Poté PgBouncer zkontroluje připojení uložené v mezipaměti se stejnou kombinací uživatelského jména a databáze. Pokud je nalezeno připojení uložené v mezipaměti, vrátí připojení klientovi, pokud ne, vytvoří nové připojení. V závislosti na konfiguraci PgBouncer a počtu aktivních připojení je možné, že nové připojení bude zařazeno do fronty, dokud nebude možné vytvořit, nebo dokonce přerušit.

Chování PgBouncer závisí na nakonfigurovaném režimu sdružování:

  • sdružování relací (výchozí):Když se klient připojí, bude mu přiděleno připojení k serveru po celou dobu, po kterou klient zůstane připojen. Když se klient odpojí, připojení k serveru se vrátí zpět do fondu.
  • sdružování transakcí :Připojení k serveru je přiřazeno klientovi pouze během transakce. Když PgBouncer zaznamená, že transakce je u konce, připojení k serveru se vrátí zpět do fondu.
  • sdružování prohlášení :Připojení k serveru bude vráceno zpět do fondu ihned po dokončení dotazu. Transakce s více výpisy jsou v tomto režimu zakázány, protože by se přerušily.

Chcete-li vyvážit dotazy mezi několika servery, na straně PgBouncer může být dobrý nápad zmenšit server_lifetime a také zapnout server_round_robin. Ve výchozím nastavení jsou nečinná připojení znovu používána algoritmem LIFO, který nemusí fungovat tak dobře, když je použit load-balancer.

Jak nainstalovat PgBouncer

Předpokládáme, že máte nasazený PostgreSQL cluster a HAProxy a že jsou v provozu, jinak můžete následovat tento blogový příspěvek a snadno nasadit PostgreSQL pro vysokou dostupnost.

PgBouncer můžete nainstalovat na každý databázový uzel nebo na externí počítač, v každém případě budete mít něco takového:

Pro získání softwaru PgBouncer můžete přejít do sekce stahování PgBouncer nebo použijte úložiště RPM nebo DEB. V tomto příkladu použijeme CentOS 8 a nainstalujeme jej z oficiálního úložiště PostgreSQL.

Nejprve si stáhněte a nainstalujte odpovídající úložiště z webu PostgreSQL (pokud jej ještě nemáte):

$ 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

Potom nainstalujte balíček PgBouncer:

$ yum install pgbouncer

Ověřte instalaci:

$ 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 dokončení budete mít nový konfigurační soubor umístěný v /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

Podívejme se na tyto parametry jeden po druhém:

  • Sekce databáze [databáze]: Toto obsahuje páry klíč=hodnota, kde klíč bude považován za název databáze a hodnota jako seznam párů klíč=hodnota ve stylu připojovacího řetězce libpq.
  • Uživatelská sekce [uživatelé]: Toto obsahuje páry klíč=hodnota, kde klíč bude brán jako uživatelské jméno a hodnota jako seznam stylů připojovacího řetězce libpq párů klíč=hodnota konfiguračních nastavení specifických pro tohoto uživatele.
  • soubor protokolu :Určuje soubor protokolu. Soubor protokolu je udržován otevřený, takže po otočení zabijte -HUP nebo na konzoli RELOAD; by mělo být hotovo.
  • pidfile :Určuje soubor PID. Bez sady pidfile není démon povolen.
  • listen_addr :Určuje seznam adres, kde se má naslouchat připojení TCP. Můžete také použít * ve významu „poslouchat na všech adresách“. Pokud není nastaveno, jsou akceptována pouze připojení soketů Unix.
  • listen_port: Na kterém portu poslouchat. Platí pro TCP i Unix sockety. Výchozí port je 6432.
  • auth_type: Jak ověřovat uživatele.
  • auth_file :Název souboru, ze kterého se mají načíst uživatelská jména a hesla.
  • admin_users :Čárkami oddělený seznam uživatelů databáze, kteří se mohou připojit a spouštět všechny příkazy na konzole.
  • stats_users :Čárkami oddělený seznam uživatelů databáze, kteří se mohou na konzoli připojit a spouštět dotazy pouze pro čtení.

Toto je pouze ukázka výchozího konfiguračního souboru, protože originál má 359 řádků, ale zbytek řádků je ve výchozím nastavení zakomentován. Chcete-li získat všechny dostupné parametry, můžete se podívat na oficiální dokumentaci.

Jak používat PgBouncer

Nyní se podíváme na základní konfiguraci, aby to fungovalo.

Konfigurační soubor 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

A ověřovací soubor:

$ cat /etc/pgbouncer/userlist.txt

"admindb" "root123"

Takže v tomto případě jsem nainstaloval PgBouncer do stejného databázového uzlu, naslouchá všem IP adresám a připojuje se k databázi PostgreSQL s názvem „world“. Také spravuji povolené uživatele v souboru userlist.txt pomocí hesla ve formátu prostého textu, které lze v případě potřeby zašifrovat.

Pro spuštění služby PgBouncer stačí spustit následující příkaz:

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

Kde -d znamená „démon“, bude tedy běžet na pozadí.

$ 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 můžete vidět, PgBouncer je aktivní a čeká na připojení na portu 6432. Chcete-li získat přístup k databázi PostgreSQL, spusťte následující příkaz pomocí místních informací (port, hostitel, uživatelské jméno a název databáze) :

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

Password for user admindb:

psql (12.4)

Type "help" for help.



world=#

Mějte na paměti, že název databáze (svět) je databáze nakonfigurovaná v konfiguračním souboru PgBouncer:

[databases]

world = host=127.0.0.1 port=5432 dbname=world

Monitorování a správa PgBouncer

Místo přístupu k databázi PostgreSQL se můžete připojit přímo k PgBouncer a spravovat nebo monitorovat ji. K tomu použijte stejný příkaz, který jste použili dříve, ale změňte databázi 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

Nyní můžete spouštět různé příkazy PgBouncer a sledovat to:

ZOBRAZIT 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)

ZOBRAZIT SERVERY:

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)

ZOBRAZIT KLIENTY:

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)

ZOBRAZIT BAZÉNY:

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)

A spravovat to...

ZNOVU NAČÍST:

pgbouncer=# RELOAD;

RELOAD

PAUZA:

pgbouncer=# PAUSE world;

PAUSE

POKRAČOVAT:

pgbouncer=# RESUME world;

RESUME

Tyto příkazy jsou pouze příkladem. Úplný seznam příkazů naleznete v oficiální dokumentaci.

Závěr

Použití kombinace PgBouncer + HAProxy + PostgreSQL je dobrý způsob, jak dosáhnout vysoké dostupnosti pro váš cluster PostgreSQL a současně zlepšit výkon vaší databáze.

Jak můžete vidět, pokud máte své PostgreSQL prostředí, které můžete nasadit pomocí ClusterControl několika kliknutími, můžete snadno přidat PgBouncer a využít výhody, že máte pro své systémy pooler připojení.


  1. Získejte den v týdnu v SQL Server 2005/2008

  2. Jak dočasně deaktivuji spouštěče v PostgreSQL?

  3. Jak funguje ROW_NUMBER() na serveru SQL

  4. Databázový model pro online průzkum. Část 3