PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да постигнем висока наличност на PostgreSQL с pgBouncer

В света на базата данни има много общи понятия като висока наличност, отказ и пул на връзки. Всички те са полезни неща за внедряване във всяка система и дори задължителни в някои случаи.

Обединяването на връзки е метод за създаване на пул от връзки и повторното им използване, като се избягва непрекъснатото отваряне на нови връзки към базата данни, което значително ще увеличи производителността на вашите приложения. PgBouncer е популярен пул за свързване, предназначен за PostgreSQL, но не е достатъчен за постигане на висока наличност на PostgreSQL сам по себе си, тъй като няма конфигурация с няколко хоста, преминаване при отказ или откриване.

Използването на Load Balancer е начин да имате висока наличност във вашата топология на базата данни. Може да бъде полезно за пренасочване на трафик към здрави възли на базата данни, разпределяне на трафика между множество сървъри, за да се подобри производителността, или просто за конфигуриране на една крайна точка във вашето приложение за по-лесно конфигуриране и процес на отказ. За това HAProxy е добър вариант за допълване на вашия пул за връзки, тъй като е прокси с отворен код, който може да се използва за внедряване на висока наличност, балансиране на натоварването и прокси за TCP и HTTP базирани приложения.

В този блог ще използваме и двете концепции, Load Balancer и Connection pooling (HAProxy + PgBouncer), за да разгърнем среда с висока достъпност за вашата PostgreSQL база данни.

Как работи PgBouncer

PgBouncer действа като PostgreSQL сървър, така че просто трябва да получите достъп до вашата база данни, като използвате информацията на PgBouncer (IP адрес/име на хост и порт), а PgBouncer ще създаде връзка със сървъра на PostgreSQL или ще използвайте повторно, ако съществува.

Когато PgBouncer получи връзка, той извършва удостоверяване, което зависи от метода, посочен в конфигурационния файл. PgBouncer поддържа всички механизми за удостоверяване, които PostgreSQL сървърът поддържа. След това PgBouncer проверява за кеширана връзка със същата комбинация потребителско име+база данни. Ако е намерена кеширана връзка, тя връща връзката към клиента, ако не, създава нова връзка. В зависимост от конфигурацията на PgBouncer и броя на активните връзки е възможно новата връзка да бъде поставена на опашка, докато може да бъде създадена или дори прекратена.

Поведението на PgBouncer зависи от конфигурирания режим на обединяване:

  • обединяване на сесии (по подразбиране):Когато клиент се свърже, ще му бъде присвоена сървърна връзка за цялото време, през което клиентът остава свързан. Когато клиентът прекъсне връзката, връзката със сървъра ще бъде върната в пула.
  • обединяване на транзакции :Връзка със сървъра се присвоява на клиент само по време на транзакция. Когато PgBouncer забележи, че транзакцията е приключила, връзката със сървъра ще бъде върната в пула.
  • обединяване на изрази :Връзката със сървъра ще бъде върната в пула веднага след приключване на заявката. Транзакциите с множество оператори са забранени в този режим, тъй като биха се развалили.

За да балансирате заявките между няколко сървъра, от страна на PgBouncer, може да е добра идея да направите server_lifetime по-малко и също да включите server_round_robin. По подразбиране неактивните връзки се използват повторно от алгоритъма LIFO, който може да не работи толкова добре, когато се използва балансиране на натоварването.

Как да инсталирате PgBouncer

Ще приемем, че разполагате с вашия PostgreSQL клъстер и HAProxy, и той е готов и работи, в противен случай можете да следвате тази публикация в блога, за да внедрите лесно PostgreSQL за висока достъпност.

Можете да инсталирате PgBouncer на всеки възел на базата данни или на външна машина, във всеки случай ще имате нещо подобно:

За да получите софтуера PgBouncer, можете да отидете в раздела за изтегляне на PgBouncer или използвайте RPM или DEB хранилища. За този пример ще използваме CentOS 8 и ще го инсталираме от официалното хранилище на PostgreSQL.

Първо, изтеглете и инсталирайте съответното хранилище от сайта на PostgreSQL (ако все още го нямате):

$ 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

След това инсталирайте пакета PgBouncer:

$ yum install pgbouncer

Проверете инсталацията:

$ 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

Когато приключи, ще имате нов конфигурационен файл, намиращ се в /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

Нека видим тези параметри един по един:

  • Раздел Бази данни [бази данни]: Това съдържа двойки ключ=стойност, където ключът ще бъде взет като име на база данни и стойността като списък на стил на низове за връзка libpq от двойки ключ=стойност.
  • Потребителска секция [потребители]: Това съдържа двойки ключ=стойност, където ключът ще се приема като потребителско име и стойността като списък със стил на низове за връзка libpq от двойки ключ=стойност конфигурационни настройки, специфични за този потребител.
  • регистрационен файл :Указва регистрационния файл. Регистрационният файл се поддържа отворен, така че след завъртане kill -HUP или на конзолата RELOAD; трябва да се направи.
  • pidfile :Указва PID файла. Без набора pidfile, демонът не е разрешен.
  • addr_listen_addr :Посочва списък с адреси, където да се слушат TCP връзки. Можете също да използвате *, което означава „слушайте на всички адреси“. Когато не е зададено, се приемат само Unix сокет връзки.
  • port_listen_port: На кой порт да слушате. Прилага се както за TCP, така и за Unix сокети. Портът по подразбиране е 6432.
  • auth_type: Как да удостоверяваме потребители.
  • auth_file :Името на файла за зареждане на потребителски имена и пароли.
  • admin_users :Разделен със запетая списък с потребители на базата данни, на които е разрешено да се свързват и изпълняват всички команди на конзолата.
  • stats_users :Разделен със запетая списък с потребители на базата данни, на които е разрешено да се свързват и да изпълняват заявки само за четене на конзолата.

Това е само извадка от конфигурационния файл по подразбиране, тъй като оригиналът има 359 реда, но останалите редове са коментирани по подразбиране. За да получите всички налични параметри, можете да проверите официалната документация.

Как да използвате PgBouncer

Сега нека видим основна конфигурация, за да я накараме да работи.

Конфигурационният файл 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

И файлът за удостоверяване:

$ cat /etc/pgbouncer/userlist.txt

"admindb" "root123"

И така, в този случай инсталирах PgBouncer в същия възел на базата данни, слушайки всички IP адреси и се свързва с PostgreSQL база данни, наречена „свят“. Аз също управлявам разрешените потребители във файла userlist.txt с парола в обикновен текст, която може да бъде криптирана, ако е необходимо.

За да стартирате услугата PgBouncer, просто трябва да изпълните следната команда:

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

Където -d означава „демон“, така че ще работи на заден план.

$ 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

Както можете да видите, PgBouncer работи и чака връзки в порт 6432. За достъп до базата данни PostgreSQL, изпълнете следната команда, като използвате вашата локална информация (порт, хост, потребителско име и име на база данни) :

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

Password for user admindb:

psql (12.4)

Type "help" for help.



world=#

Имайте предвид, че името на базата данни (свят) е базата данни, конфигурирана във вашия конфигурационен файл на PgBouncer:

[databases]

world = host=127.0.0.1 port=5432 dbname=world

Наблюдение и управление на PgBouncer

Вместо да осъществявате достъп до вашата PostgreSQL база данни, можете да се свържете директно с PgBouncer, за да я управлявате или наблюдавате. За това използвайте същата команда, която сте използвали преди, но променете базата данни на „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

Сега можете да изпълнявате различни команди на PgBouncer, за да го наблюдавате:

ПОКАЖЕТЕ СТАТИСТИЧЕСКИ ОБЩИ СТАТИСТИКИ:

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)

ПОКАЖЕТЕ СЪРВЪРИТЕ:

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)

ПОКАЖЕТЕ КЛИЕНТИ:

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)

ПОКАЗВАНЕ НА БАСЕЙНИ:

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)

И да го управлявате...

ПРЕЗАРЕЖДАНЕ:

pgbouncer=# RELOAD;

RELOAD

ПАУЗА:

pgbouncer=# PAUSE world;

PAUSE

ВЪЗОБНОВЯВАНЕ:

pgbouncer=# RESUME world;

RESUME

Тези команди са само пример. За пълен списък с команди, моля, вижте официалната документация.

Заключение

Използването на комбинация от PgBouncer + HAProxy + PostgreSQL е добър начин да постигнете висока наличност за вашия PostgreSQL клъстер, като същевременно подобрявате производителността на вашата база данни.

Както можете да видите, ако разполагате с вашата PostgreSQL среда, която можете да разгърнете с помощта на ClusterControl само с няколко щраквания, можете лесно да добавите PgBouncer, за да се възползвате от наличието на пул за връзки за вашите системи.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете Century от дата в PostgreSQL

  2. Уведомяване за промени в postgres в java приложение

  3. Django:Кои са най-добрите практики за мигриране на проект от sqlite към PostgreSQL

  4. Вмъкнете данни и задайте външни ключове с Postgres

  5. Извличане на всички привилегии на обект за конкретна роля