В света на базата данни има много общи понятия като висока наличност, отказ и пул на връзки. Всички те са полезни неща за внедряване във всяка система и дори задължителни в някои случаи.
Обединяването на връзки е метод за създаване на пул от връзки и повторното им използване, като се избягва непрекъснатото отваряне на нови връзки към базата данни, което значително ще увеличи производителността на вашите приложения. 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, за да се възползвате от наличието на пул за връзки за вашите системи.