Перейти к основному содержимому

Уровень 3.0

Предусловия:

  • Изучена лекция 2 «Пулер соединений»

Настройка и анализ работы Pangolin Pooler​

  1. Откройте терминал и подключитесь в psql к базе данных postgres с ролью postgres:
[student@ServerName ~]$ sudo -iu postgres
[postgres@ServerName ~]$ psql
psql (15.5)
Type "help" for help.
  1. Создайте роль student:
postgres=# CREATE ROLE student WITH LOGIN CREATEDB PASSWORD 'student';
CREATE ROLE
  1. Создайте базу данных pgbench_db и подключитесь к ней:
postgres=# CREATE DATABASE pgbench_db WITH OWNER student;
CREATE DATABASE
  1. Посмотрите хеш пароля пользователя student:
postgres=# SELECT rolpassword FROM pg_authid WHERE rolname = 'student';
rolpassword
---------------------------------------------------------------------------------------------------------------------------------------
SCRAM-SHA-256$4096:RAf9uYFejQCwQMS3kdGi8w==$2VQIEDmjVOek2V6i+ih2EArRAsmI2CJjMnDgaLELenw=:663yu3xX983xvgwI2+Ga/jIOllslzwF0xEV09fRl1J4=
(1 row)

Хеш пароля нам потребуется при настройке Pangolin Pooler.

Пароли или их хеши хранятся в системном каталоге pg_authid, доступ к которому имеет суперпользователь.

  1. Выйдите из сеанса psql и режима выполнения команд от имени пользователя postgres:
postgres=# \q
[postgres@ServerName ~]$ exit
logout

Установка​

  1. Проверьте наличие дистрибутива Pangolin в каталоге Distrib домашнего каталога пользователя student:
[student@ServerName ~]$ ls -1 ~/Distrib
license.json
PSQ-\{pangolin_version\}-50-\{OS\}-distrib.zip
  1. Создайте каталог и перейдите в него для распаковки архива:
[student@ServerName ~]$ mkdir ~/Distr && cd ~/Distr
  1. Распакуйте монолитный архив с дистрибутивом:
[student@ServerName Distr]$ unzip ~/Distrib/PSQ-\{pangolin_version\}-50-\{OS\}-distrib.zip
Archive: /home/student/Distrib/PSQ-\{pangolin_version\}-50-\{OS\}-distrib.zip
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-cyclonedx-distrib.json
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-documentation-distrib.pom
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-documentation-distrib.zip
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-installer-distrib.pom
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-installer-distrib.zip
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-owned-distrib.pom
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-owned-distrib.zip
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-party-distrib.pom
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-party-distrib.zip
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-swidtag-distrib.swidtag
inflating: PSQ-\{pangolin_version\}-50-\{OS\}-unpacker-distrib.sh
  1. Выполните скрипт распаковки:
[student@ServerName Distr]$ bash PSQ-\{pangolin_version\}-50-\{OS\}-unpacker-distrib.sh
start
~/Distr/distributive ~/Distr
successful completion: PSQ-06.005.01-distrib.tar.gz
~/Distr

В результате выполнения скрипта установочное программное обеспечение перепаковывается в сжатый архив tar.gz с RPM-пакетами.

  1. Распакуйте архив PSQ-06.005.01-distrib.tar.gz и посмотрите список полученных rpm-пакетов:
[student@ServerName Distr]$ tar xf PSQ-06.005.01-distrib.tar.gz
[student@ServerName Distr]$ ls -1 *.rpm
pangolin-backup-tools-1.2.4-\{OS\}.5.x86_64.rpm
pangolin-core-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-dbms-6.5-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-dbms-6.5-client-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-dbms-6.5-libpq-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-dbms-6.5-libpq-dev-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-full-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-full-debuginfo-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-manager-2.1.7-\{OS\}.5.x86_64.rpm
pangolin-manager-dcs-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-orchestrated-\{pangolin_version\}-\{OS\}.5.x86_64.rpm
pangolin-pooler-1.5.0-\{OS\}.5.x86_64.rpm

Pangolin Pooler содержится в пакете pangolin-pooler-1.5.0-\{OS\}.5.x86_64.rpm.

  1. Выполните установку пакета с Pangolin Pooler:
[student@ServerName Distr]$ sudo dnf -y install pangolin-pooler-1.5.0-\{OS\}.5.x86_64.rpm
Updating Subscription Management repositories.
...
Package Architecture Version Repository Size
==============================================================================================================================================
Installing:
pangolin-pooler x86_64 1.5.0-\{OS\}.5 @commandline 692 k
Installing dependencies:
lz4 x86_64 1.9.3-5.sl9.1 SBERTECH_JSC_SberLinux_sberlinux-95-for-x86_64-baseos-rpms 57 k

Transaction Summary
==============================================================================================================================================
Install 2 Packages

Total size: 749 k
Total download size: 57 k
Installed size: 3.3 M
Is this ok [y/N]: y
Downloading Packages:
lz4-1.9.3-5.sl9.1.x86_64.rpm 147 kB/s | 57 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------
Total 144 kB/s | 57 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : lz4-1.9.3-5.sl9.1.x86_64 1/2
Running scriptlet: pangolin-pooler-1.5.0-\{OS\}.5.x86_64 2/2
Installing : pangolin-pooler-1.5.0-\{OS\}.5.x86_64 2/2
Running scriptlet: pangolin-pooler-1.5.0-\{OS\}.5.x86_64 2/2
Verifying : lz4-1.9.3-5.sl9.1.x86_64 1/2
Verifying : pangolin-pooler-1.5.0-\{OS\}.5.x86_64 2/2
Installed products updated.

Installed:
lz4-1.9.3-5.sl9.1.x86_64 pangolin-pooler-1.5.0-\{OS\}.5.x86_64

Complete!

Настройка Pangolin Pooler​

  1. Перейдите в режим выполнения команд от имени пользователя postgres:
[student@ServerName Distr]$ sudo -iu postgres
  1. Перейдите в каталог /etc/pangolin-pooler и проверьте его содержимое:
[postgres@ServerName pangolin-pooler]$ cd /etc/pangolin-pooler && ls -l -1
total 20
-rw------- 1 postgres postgres 12361 Sep 14 14:53 pangolin-pooler.ini
-rw------- 1 postgres postgres 19 Apr 23 20:57 userlist.txt

В каталоге имеется основной конфигурационный файл pangolin-pooler.ini, а также файл userlist.txt, содержащий пользователей и их пароли (или их хеши).

  1. Создайте копии конфигурационных файлов:
postgres@ServerName pangolin-pooler]$ cp pangolin-pooler.ini pangolin-pooler_origin.ini
[postgres@ServerName pangolin-pooler]$ cp userlist.txt userlist_origin.txt

Оригинальные файлы на всякий случай сохранены в неизменном виде.

  1. Добавьте пользователя student в файл userlist.txt:
postgres@ServerName pangolin-pooler]$ tee userlist.txt > /dev/null << 'EOF'
"student" "SCRAM-SHA-256$4096:RAf9uYFejQCwQMS3kdGi8w==$2VQIEDmjVOek2V6i+ih2EArRAsmI2CJjMnDgaLELenw=:663yu3xX983xvgwI2+Ga/jIOllslzwF0xEV09fRl1J4="
EOF

При выполнении команды вставьте хеш пароля, который был ранее вами получен из системного каталога pg_authid.

  1. Задайте настройки в конфигурационном файле pangolin-pooler.ini:
postgres@ServerName pangolin-pooler]$ tee pangolin-pooler.ini > /dev/null << 'EOF'
[databases]
* = host=localhost port=5432
[pgbouncer]
logfile = /opt/pangolin-pooler/log/pangolin-pooler.log
pidfile = /var/run/pangolin-pooler/pangolin-pooler.pid
listen_addr = localhost
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pangolin-pooler/userlist.txt
admin_users = student
pool_mode = transaction
default_pool_size = 5
min_pool_size = 5
max_client_conn = 101
EOF

В разделе [databases] приводится список баз данных и соответствующие параметры направления подключения. Символ * означает, что параметры подключения распространяются на базы данных с любым именем.

В разделе [pgbouncer] приводятся общие параметры пулера соединений.

  • Параметр logfile определяет файл для ведения журнала сообщений, pidfile — файл pid процесса пулера соединений
  • Параметры listen_addr и listen_port определяют список адресов и порт для прослушивания подключений пулером
  • Параметры auth_type и auth_file определяют метод аутентификации и файл со списком пользователей с паролями (хешами)
  • Параметр admin_users определяет список пользователей, которым доступна консоль управления пулером
  • Параметр pool_mode определяет режим пулинга. В этом случае выбран наиболее востребованный режим transaction

    Вспомним, что такой режим предполагает предоставление клиенту соединения из пула только на время выполнения транзакции.

  • Параметры default_pool_size и min_pool_size определяют предельное и минимальное количества соединений в каждом из пулов соединений. В этом случае они совпадают и равны 5. Это означает, что для каждого пула соединений будут сразу организованы все 5 соединений, которые не будут закрываться, даже если они не используются

    Вспомним, что для каждой пары «база данных–роль» создается свой пул соединений.

  • Параметр max_client_conn определяет предельное количество соединений клиентов с пулером. В этом случае выбрано значение 101 для того, чтобы в ходе эксперимента к пулеру могли подключаться до 100 клиентов, а одно соединение использовалось для управления пулом через консоль
  1. Выйдите из сеанса пользователя postgres и перезапустите Pangolin Pooler:
[postgres@ServerName pangolin-pooler]$ exit
logout
[student@ServerName Distr]$ sudo systemctl restart pangolin-pooler

Перезапуск потребовался для применения конфигурационных параметров.

  1. Подключитесь в psql к базе данных pgbench_db посредством пулера, введя пароль "student":
[student@ServerName Distr]$ psql -d pgbench_db -U student -h localhost -p 6432
Password for user student:
psql (15.5)
Type "help" for help.

Подключение прошло успешно. О том, что подключение было именно к пулеру, а не к экземпляру сервера напрямую, можно догадаться только по номеру порта -p 6432.

  1. Проверьте состояние обслуживающих процессов с использованием представления pg_stat_activity:
pgbench_db=> SELECT pid, usename, wait_event_type, wait_event, backend_type FROM pg_stat_activity WHERE backend_type = 'client backend';
pid | usename | wait_event_type | wait_event | backend_type
--------+---------+-----------------+------------+----------------
212508 | student | | | client backend
212507 | student | Client | ClientRead | client backend
212506 | student | Client | ClientRead | client backend
212505 | student | Client | ClientRead | client backend
212504 | student | Client | ClientRead | client backend
(5 rows)

После подключения пулер сразу организовал пять соединений с соответствующими обслуживающими процессами (backend_type=client backend).

Четыре обслуживающих процесса находятся в режиме ожидания запросов от клиентов (wait_event=ClientRead), пятый выполняет собственно запрос к pg_stat_activity.

  1. Выйдите из сеанса psql и перейдите в режим выполнения команд от имени пользователя postgres:
pgbench_db=> \q
[student@ServerName Distr]$ sudo -iu postgres

Анализ работы Pangolin Pooler​

  1. Откройте второй терминал и подключитесь в нем к виртуальной базе данных pgbouncer, введя пароль "student":
[student@ServerName ~]$ psql -d pgbouncer -U student -h localhost -p 6432
Password for user student:
psql (15.5, server 1.24.0/bouncer)
WARNING: psql major version 15, server major version 1.24.
Some psql features might not work.
Type "help" for help.

Вспомним, что для управления и мониторинга Pangolin Pooler предусмотрена специальная консоль, для подключения к которой применяется «виртуальная» база данных pgbouncer.

  1. Откройте третий терминал, проинициализируйте и запустите 5-минутный тест pgbench, введя пароль "student":
[student@ServerName ~]$ pgbench -i -d pgbench_db -U student -h localhost -p 6432
Password:
dropping old tables...
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.02 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.20 s (drop tables 0.02 s, create tables 0.01 s, client-side generate 0.08 s, vacuum 0.04 s, primary keys 0.05 s).
[student@ServerName ~]$ pgbench -c 100 -T 300 -d pgbench_db -U student -h localhost -p 6432
Password:
...

Тест pgbench запущен на 5 минут (-T 300) через пулер соединений (-p 6432) с количеством клиентов, равным 100 (-c 100).

  1. Во втором сеансе посмотрите состояние пулов соединений:
pgbouncer=# SHOW POOLS\gx
-[ RECORD 1 ]---------+------------
database | pgbench_db
user | student
cl_active | 6
cl_waiting | 94
cl_active_cancel_req | 0
cl_waiting_cancel_req | 0
sv_active | 5
sv_active_cancel | 0
sv_being_canceled | 0
sv_idle | 0
sv_used | 0
sv_tested | 0
sv_login | 0
maxwait | 0
maxwait_us | 137084
avg_time | 0
avg_time_us | 2784
max_time | 0
max_time_us | 3184
pool_mode | transaction
load_balance_hosts |
-[ RECORD 2 ]---------+------------
database | pgbouncer
user | pgbouncer
cl_active | 1
cl_waiting | 0
cl_active_cancel_req | 0
cl_waiting_cancel_req | 0
sv_active | 0
sv_active_cancel | 0
sv_being_canceled | 0
sv_idle | 0
sv_used | 0
sv_tested | 0
sv_login | 0
maxwait | 0
maxwait_us | 0
avg_time | 0
avg_time_us | 0
max_time | 0
max_time_us | 0
pool_mode | statement
load_balance_hosts |

Команда SHOW POOLS показывает текущее состояние имеющихся пулеров.

В этом случае первая запись соответствует пулу «pgbench_db–student», вторая — консоли управления.

Пулером обслуживаются в настоящий момент шесть клиентов (cl_active=6), несмотря на то что соединений с экземпляром используется только пять (cv_active=5). Дело в том, что в поле cl_active учитываются клиенты, как связанные с серверными подключениями, так и находящиеся в режиме ожидания без запроса на обработку.

94 клиента ожидают обслуживания (cl_waiting=94), то есть направили свои запросы, но свободных соединений не оказалось.

Также стоит обращать внимание на поле maxwait, показывающее максимальное время ожидания клиента. Если значение начинает расти, значит, пулер не справляется с клиентской нагрузкой.

  1. Во втором сеансе приостановите обслуживание клиентов:
pgbouncer=# PAUSE;
PAUSE

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

  1. В третьем сеансе убедитесь, что выполнение транзакций утилитой pgbench приостановлено:
...
pgbench: client 38 executing script "<builtin: TPC-B (sort of)>"
pgbench: client 38 executing \set aid
pgbench: client 38 executing \set bid
pgbench: client 38 executing \set tid
pgbench: client 38 executing \set delta
pgbench: client 38 sending BEGIN;
pgbench: client 38 receiving

Вывод сообщений pgbench должен быть приостановлен.

  1. В первом сеансе перезапустите экземпляр Pangolin:
[postgres@ServerName ~]$ pg_ctl restart -l logfile
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started

Приостановка позволяет перезапустить экземпляр, например для обновления или применения параметров, требующих перезапуска.

  1. Во втором сеансе восстановите обслуживание клиентов:
pgbouncer=# RESUME;
RESUME
  1. В третьем сеансе дождитесь завершения теста pgbench:
...
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 100
number of threads: 1
maximum number of tries: 1
duration: 300 s
number of transactions actually processed: 133035
number of failed transactions: 0 (0.000%)
latency average = 225.288 ms
initial connection time = 472.879 ms
tps = 443.876856 (without initial connection time)

pgbench практически не заметил перезагрузки экземпляра сервера. По крайней мере, соединение с пулером разорвано не было.

Обратите внимание на общее количество выполненных транзакций (number of transactions actually processed: 133035).

  1. Во втором сеансе посмотрите накопленную статистику пулера соединений:
pgbouncer=# SHOW STATS\gx
-[ RECORD 1 ]-----------------+------------
database | pgbench_db
total_server_assignment_count | 133040
total_xact_count | 133040
total_query_count | 931250
total_received | 56272092
total_sent | 24808818
total_xact_time | 29705513650
total_query_time | 29393979366
total_wait_time | 28595843687
total_client_parse_count | 0
total_server_parse_count | 0
total_bind_count | 0
avg_server_assignment_count | 0
avg_xact_count | 0
avg_query_count | 0
avg_recv | 0
avg_sent | 0
avg_xact_time | 0
avg_query_time | 0
avg_wait_time | 0
avg_client_parse_count | 0
avg_server_parse_count | 0
avg_bind_count | 0
-[ RECORD 2 ]-----------------+------------
database | pgbouncer
total_server_assignment_count | 0
total_xact_count | 1
total_query_count | 1
total_received | 0
total_sent | 0
total_xact_time | 0
total_query_time | 0
total_wait_time | 0
total_client_parse_count | 0
total_server_parse_count | 0
total_bind_count | 0
avg_server_assignment_count | 0
avg_xact_count | 0
avg_query_count | 0
avg_recv | 0
avg_sent | 0
avg_xact_time | 0
avg_query_time | 0
avg_wait_time | 0
avg_client_parse_count | 0
avg_server_parse_count | 0
avg_bind_count | 0

Команда SHOW STATS показывает накопленную статистику пулеров соединений.

Поле total_xact_count показывает, сколько транзакций было выполнено посредством пулера. В этом случае их количество чуть больше, чем количество в выводе утилиты pgbench (133040 > 133035).

Это связано с тем, что pgbench выполнял транзакции при инициализации, а также с тем, что мы выполняли запрос к pg_stat_activity.

Поле total_server_assignment_count показывает, сколько раз клиенту было предоставлено соединение с экземпляром.

В этом случае значение указанного поля совпадает с количеством выполненных транзакций.

Это связано с режимом пулинга — в пуле транзакций для каждой транзакции соединение предоставляется заново.

Подготовленные операторы и пул транзакций​

  1. В первом сеансе подключитесь в psql к базе данных pgbench_db посредством пулера, введя пароль "student":
[postgres@ServerName ~]$ psql -d pgbench_db -U student -h localhost -p 6432
Password for user student:
psql (15.5)
Type "help" for help.
  1. В первом сеансе начните транзакцию и посмотрите pid обслуживающего процесса:
pgbench_db=> BEGIN;
BEGIN
pgbench_db=*> SELECT pg_backend_pid();
pg_backend_pid
----------------
215516
(1 row)
  1. В первом сеансе подготовьте запрос командой PREPARE и зафиксируйте транзакцию:
pgbench_db=*> PREPARE branches AS SELECT * FROM pgbench_branches;
PREPARE
pgbench_db=*> COMMIT;
COMMIT

Вспомним, что подготовленные операторы хранятся в памяти обслуживающего процесса.

  1. В третьем сеансе подключитесь в psql к базе данных pgbench_db посредством пулера, введя пароль "student":
[postgres@ServerName ~]$ psql -d pgbench_db -U student -h localhost -p 6432
Password for user student:
psql (15.5)
Type "help" for help.
  1. В третьем сеансе начните транзакцию и попытайтесь выполнить подготовленный запрос:
pgbench_db=> BEGIN;
BEGIN
pgbench_db=*> EXECUTE branches;
bid | bbalance | filler
-----+----------+--------
1 | 319792 |
(1 row)

Подготовленный запрос успешно выполнился, несмотря на то, что выполнялся в другом сеансе связи.

Дело в том, что в режиме пула транзакций для каждой транзакции назначается новое соединение с экземпляром.

В этом случае после завершения транзакции в первом сеансе соединение с экземпляром было освобождено и переиспользовано для транзакции в третьем сеансе.

  1. В третьем сеансе посмотрите pid обслуживающего процесса:
pgbench_db=*> SELECT pg_backend_pid();
pg_backend_pid
----------------
215516
(1 row)

Транзакция в третьем сеансе выполняется тем же обслуживающим процессом, которым был создан подготовленный оператор.

  1. В первом сеансе выполните подготовленный запрос:
pgbench_db=> EXECUTE branches;
ERROR: prepared statement "branches" does not exist

А в первом сеансе выполнение подготовленного оператора приводит к ошибке, поскольку для новой транзакции ему было предоставлено новое соединение (предыдущее соединение удерживается незавершенной транзакцией).

Вспомним, что подготовленные операторы все же могут быть использованы посредством Pangolin Pooler начиная с версии 5.1.0. Однако это возможно только на уровне клиент-серверного протокола, то есть за подготовку операторов должен отвечать драйвер для кого-либо языка программирования, формирующий сообщения протокола взаимодействия с Pangolin Pooler.

Завершение​

  1. В первом сеансе выйдите из psql и режима выполнения команд от имени пользователя postgres:
pgbench_db=> \q
[postgres@ServerName ~]$ exit
logout
  1. Во втором сеансе выйдите из psql:
pgbouncer=# \q
  1. В третьем сеансе откатите транзакцию и выйдите из psql:
pgbench_db=*> ROLLBACK;
ROLLBACK
pgbench_db=> \q
  1. В третьем сеансе подключитесь к базе данных postgres с ролью postgres:
[student@ServerName ~]$ sudo -iu postgres
[postgres@ServerName ~]$ psql
psql (15.5)
Type "help" for help.
  1. В первом сеансе остановите Pangolin Pooler:
[student@ServerName ~]$ sudo systemctl stop pangolin-pooler
  1. В третьем сеансе удалите базу данных pgbench_db:
postgres=# DROP DATABASE pgbench_db;
DROP DATABASE
  1. В третьем сеансе удалите роль student и выйдите из сеанса:
postgres=# DROP ROLE student;
DROP ROLE
postgres=# \q
[postgres@ServerName ~]$ exit
logout

Самопроверка​

Вопрос 1

Содержимое файла pangolin-pooler.ini представлено ниже:

[databases]
* = host=localhost port=5432
[pgbouncer]
logfile = /opt/pangolin-pooler/log/pangolin-pooler.log
pidfile = /var/run/pangolin-pooler/pangolin-pooler.pid
listen_addr = *
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pangolin-pooler/userlist.txt
admin_users = pooler_admin
pool_mode = session
default_pool_size = 100
min_pool_size = 100
max_client_conn = 1000

Команда подключения к пулеру соединений с указанными настройками приведена ниже:

[student@pangolin-prac-d0hicm ~]$ psql -d pgbouncer -U student -h localhost -p 6432

Каким будет результат выполнения данной команды?

Вопрос 2

Последовательность команд в сеансе psql взаимодействия с базой данных some_db посредством пула соединений представлена ниже:

some_db=> BEGIN;
BEGIN

some_db=> SELECT pg_backend_pid();
pg_backend_pid
----------------
215522
(1 row)

some_db=> INSERT INTO some_table VALUES(1,100);
INSERT 0 1

some_db=> COMMIT;
COMMIT

some_db=> SELECT pg_backend_pid();
pg_backend_pid
----------------
215520
(1 row)

В каком режиме пулинга соединений могла быть выполнена приведенная последовательность команд?

Вопрос 3

Результат выполнения команды в psql представлен ниже:

pgbouncer=# SHOW POOLS\gx
-[ RECORD 1 ]---------+------------
database              | some_db
user                  | student
cl_active             | 13
cl_waiting            | 54
cl_active_cancel_req  | 0
cl_waiting_cancel_req | 0
sv_active             | 11
sv_active_cancel      | 0
sv_being_canceled     | 0
sv_idle               | 0
sv_used               | 0
sv_tested             | 0
sv_login              | 0
maxwait               | 0
maxwait_us            | 187674
avg_time              | 0
avg_time_us           | 2891
max_time              | 0
max_time_us           | 5204
pool_mode             | transaction
load_balance_hosts    |

Какое количество соединений установлено с базой данных some_db посредством пула, состояние которого представлено выше?

Вопрос 4

Содержимое файла pangolin-pooler.ini представлено ниже:

[databases]
some_db1 = host=localhost port=5432
some_db2 = host=localhost port=5432
[pgbouncer]
logfile = /opt/pangolin-pooler/log/pangolin-pooler.log
pidfile = /var/run/pangolin-pooler/pangolin-pooler.pid
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pangolin-pooler/userlist.txt
admin_users = pooler_admin
pool_mode = transaction
default_pool_size = 50
min_pool_size = 10
max_client_conn = 300

Какое максимальное количество соединений с базой данных some_db1 может быть одновременно установлено посредством пулера с представленными настройками?