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

10

Я попытался использовать сценарий Nagios для мониторинга количества соединений с базой данных в базе данных Postgres, и я столкнулся с этой проблемой: они считаются открытыми в настоящее время и измеряются каждые 5 минут.

SELECT sum(numbackends) FROM pg_stat_database;

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

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

Как я могу получить эту информацию надежным способом? как Макс (Connectios) произошло в течение промежутка времени.

Сорин
источник
1
Агрегировать статистику по соединениям с течением времени было бы неплохо, но я не думаю, что PostgreSQL в настоящее время собирает их. Обратитесь к документации postgresql.org/docs/current/static/monitoring-stats.html для получения подробной информации.
Крейг Рингер,
@CraigRinger, может быть, я мог бы настроить Postgres или клиентов так, чтобы соединения оставались открытыми в течение более длительного периода времени, чтобы я мог их измерить. Из-за текущей настройки у меня был один случай, когда postgres начал отказываться от соединений. Мониторинг не смог обнаружить это, потому что это произошло в 5-минутном интервале, и он перешел от уровня предупреждения ниже критического уровня менее чем за 5 минут. И это не было DoS-атакой.
сорин
2
Да, это довольно интересная проблема. Я настоятельно рекомендую поставить PgBouncerперед вашим экземпляром PostgreSQL, он будет ставить в очередь соединения, когда он слишком занят, а не отклонять их. (Да, глупо, что PostgreSQL не может сделать это самостоятельно, но это не простое исправление; см. Бесконечные обсуждения в списках рассылки, посвященных встроенному пулу).
Крейг Рингер
7
Как насчет регистрации соединений (используя log_connections и log_disconnections) в лог-файл (например, csvlog), а затем использовать pgBadger или что-то подобное, чтобы извлечь это из лог-файла?
a_horse_with_no_name
2
@a_horse_with_no_name Хороший вопрос. Вы можете даже «привязать» журналы к клиенту, который просто читает новые записи журнала, интегрируя через разъединения и соединения, чтобы получить почти пиковый отчет о пиковых соединениях за определенный период времени. Честно говоря, это не должно быть так сложно. Одна из моих задач в проекте AXLE ( axleproject.eu ) - реализовать еще один аудит, и я мог бы в него вписаться ...
Крейг Рингер,

Ответы:

1

Лучше использовать инструменты мониторинга рабочей нагрузки, например, pgbadgerдля проверки соединений с базой данных и общей нагрузки. Это поможет вам понять, какие пользователи подключаются, сколько времени и какие запросы они запускают. Информацию об установке и настройке pgbadger смотрите на этой странице.

Если вы просто хотите проверить количество активных соединений, вы можете использовать select count(*) from pg_stat_activity where state='active'

Лохит Гупта
источник
0

Вы можете использовать расширение с local_preload_libraries для этого.

Что-то вроде этого:

#include "postgres.h"
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

void _PG_init(void)
{
  SPI_connect();
  int ret = SPI_execute("UPDATE logon_logs SET logged = logged + 1", false, 0);
  SPI_finish();
}

/*
 * _PG_fini
 * Uninstall the hook.
 */
void _PG_fini(void)
{
}

Или вместо обновления через NOTIFY

Роман Ткачук
источник
5
Пожалуйста, попробуйте улучшить свой ответ, объяснив, как действовать дальше.
МакНетс