Для уменьшения потребления оперативной памяти нужно стремиться к тому, чтобы пул подключений к серверу PostgreSQL было как можно меньше, т.к. каждое подключение к серверу порождает запуск ещё одного процесса для его обслуживания. С другой стороны, если чрезмерно уменьшить количество подключений к серверу PostgreSQL, то приложения могут успешно устанавливать подключения к PgBouncer'у, но долгое время ожидать освобождения подключения к серверу PostgreSQL, прежде чем смогут выполнить запрос.
Подключения к самому PgBouncer'у обычно обходятся очень дёшево, поэтому нет особого смысла уменьшать их количество, но тем не менее, может оказаться полезно отслеживать и их, т.к. это может помочь в диагностике внутренних проблем в приложении.
Для контроля входящих подключений к PgBouncer'у и использования пула подключений PgBouncer'а к серверу PostgreSQL я решил воспользоваться Zabbix.
Настройка пользователя
Для съёма статистики будем использовать пользователя mon с паролем mon. Впишем в файл /etc/pgbouncer/userlist.txt нового пользователя:"mon" "mon"Теперь нужно разрешить этому пользователю просматривать статистику. Для этого откроем файл /etc/pgbouncer/pgbouncer.ini, найдём опцию stats_users. По умолчанию она закомментирована. В таком случае нужно её раскомментировать и прописать одного-единственного пользователя mon. Если же она уже раскомментирована, тогда нужно добавить пользователя mon через запятую к списку имеющихся:
stats_users = monОсталось перезагрузить pgbouncer, чтобы новый пользователь получил доступ к статистике PgBouncer'а:
# systemctl reload pgbouncer.service
Скрипт для Zabbix-агента
Скрипт для обнаружения пулов подключений написан на языке командной строки, использует только утилиту psql для подключения к PgBouncer'у и язык awk для разбора результатов запросов:#!/bin/sh MON_USER=mon MON_PASSWORD=mon PGBOUNCER_PORT=6432 COMMAND=$1 USER=$2 DB=$3 if [ "x$COMMAND" = "xdiscover" ] then env PGPASSWORD=$MON_PASSWORD psql -p $PGBOUNCER_PORT -U $MON_USER pgbouncer -t -c 'show pools;' \ | awk -F'|' 'BEGIN { printf "{\"data\":["; n=0; } /\|/ { if (n != 0) printf ","; gsub(" ", "", $1); gsub(" ", "", $2); printf "{\"{#PGBOUNCER_DATABASE}\": \"" $1 "\", \"{#PGBOUNCER_USER}\": \"" $2 "\"}"; n++; } END { printf "]}"; }' else env PGPASSWORD=$MON_PASSWORD psql -p $PGBOUNCER_PORT -U $MON_USER pgbouncer -t -c 'show pools;' \ | awk -F'|' \ -v DB=$DB \ -v USER=$USER \ -v COMMAND=$COMMAND '/\|/ { gsub(" ", "", $1); gsub(" ", "", $2); if (($1 == DB) && ($2 == USER)) { if (COMMAND == "cl_active") { gsub(" ", "", $3); print $3; } else if (COMMAND == "cl_waiting") { gsub(" ", "", $4); print $4; } else if (COMMAND == "cl_total") { print $3 + $4; } else if (COMMAND == "sv_active") { gsub(" ", "", $5); print $5; } else if (COMMAND == "sv_idle") { gsub(" ", "", $6); print $6; } else if (COMMAND == "sv_used") { gsub(" ", "", $7); print $7; } else if (COMMAND == "sv_tested") { gsub(" ", "", $8); print $8; } else if (COMMAND == "sv_login") { gsub(" ", "", $9); print $9; } else if (COMMAND == "sv_total") { print $5 + $6 + $7 + $8 + $9; } else if (COMMAND == "maxwait") { gsub(" ", "", $10); print $10; } } }' fiЯ поместил его в файле /etc/zabbix/pgbouncer.sh и выставил права доступа, позволяющие редактировать его только пользователю root, а читать и выполнять - пользователями из группы zabbix:
# chown root:zabbix /etc/zabbix/pgbouncer.sh # chmod u=rwx,g=rx,o= /etc/zabbix/pgbouncer.shКак можно понять из указанных выше команд, у остальных пользователей доступа к файлу нет. Сделано это на случай, если нужно будет поменять пароль пользователя mon на более безопасный, чтобы никто не мог увидеть этот пароль, посмотрев тело скрипта.
Настройка Zabbix-агента
Для того, чтобы использовать данные скрипта из Zabbix'а, нужно добавить в конфигурацию Zabbix-агента /etc/zabbix/zabbix_agentd.conf на том компьютере, где установлен PgBouncer, следующие строчки:UserParameter=pgbouncer.pool.discover,/etc/zabbix/pgbouncer.sh discover UserParameter=pgbouncer.pool.cl_active[*],/etc/zabbix/pgbouncer.sh cl_active $1 $2 UserParameter=pgbouncer.pool.cl_waiting[*],/etc/zabbix/pgbouncer.sh cl_waiting $1 $2 UserParameter=pgbouncer.pool.cl_total[*],/etc/zabbix/pgbouncer.sh cl_total $1 $2 UserParameter=pgbouncer.pool.sv_active[*],/etc/zabbix/pgbouncer.sh sv_active $1 $2 UserParameter=pgbouncer.pool.sv_idle[*],/etc/zabbix/pgbouncer.sh sv_idle $1 $2 UserParameter=pgbouncer.pool.sv_used[*],/etc/zabbix/pgbouncer.sh sv_used $1 $2 UserParameter=pgbouncer.pool.sv_tested[*],/etc/zabbix/pgbouncer.sh sv_tested $1 $2 UserParameter=pgbouncer.pool.sv_login[*],/etc/zabbix/pgbouncer.sh sv_login $1 $2 UserParameter=pgbouncer.pool.sv_total[*],/etc/zabbix/pgbouncer.sh sv_total $1 $2 UserParameter=pgbouncer.pool.maxwait[*],/etc/zabbix/pgbouncer.sh maxwait $1 $2После изменения конфигурации нужно перезапустить Zabbix-агента:
# systemctl restart zabbix-agent.service
Шаблоны Zabbix
Я подготовил два шаблона для Zabbix 3.4:- Template_App_PgBouncer.xml - шаблон с элементами данных типа «Zabbix-агент»,
- Template_App_PgBouncer_Active.xml - шаблон с элементами данных типа «Zabbix-агент (активный)».
В шаблонах настроены прототипы элементов данных, позволяющих контролировать количество подключений от клиентов, количество подключений к серверу, а также время ожидания клиента в очереди до получения доступа к одному из свободных подключений к серверу:
Имеются также прототипы графиков, позволяющих следить за клиентскими подключениями, подключениями к серверу и временем ожидания в очереди:
Примеры графиков
Количество клиентских подключений:Количество подключений к серверу:
Время ожидания клиента в очереди в ожидании свободного подключения к серверу:
Комментариев нет:
Отправить комментарий