Jak właściwie monitorować liczbę połączeń z bazą danych PostgreSQL?

10

Próbowałem użyć skryptu Nagios do monitorowania liczby połączeń z bazą danych w bazie danych Postgres i doszedłem do tego problemu: są one liczone jako aktualnie otwarte połączenia i mierzone co 5 minut.

SELECT sum(numbackends) FROM pg_stat_database;

Mimo to wydaje się, że brakuje dużej liczby krótkotrwałych połączeń, więc statystyki są dalekie od rzeczywistości.

Próbowałem uruchomić skrypt ręcznie i zauważyłem duże zmiany nawet między dwoma połączeniami oddalonymi od siebie o kilka sekund.

Jak mogę uzyskać te informacje w niezawodny sposób? jak max (connectios) wydarzyło się w pewnym przedziale czasu.

sorin
źródło
1
Statystyki agregacji w czasie dla połączeń byłyby fajne, ale nie sądzę, że PostgreSQL je obecnie zbiera. Szczegółowe informacje można znaleźć w dokumentacji postgresql.org/docs/current/static/monitoring-stats.html .
Craig Ringer
@CraigRinger może mógłbym skonfigurować Postgres lub klientów, aby utrzymywali połączenia otwarte przez dłuższy czas, aby móc je zmierzyć. Z powodu obecnej konfiguracji miałem jeden przypadek, kiedy postgres zaczął odmawiać połączeń. Monitorowanie nie było w stanie tego wykryć, ponieważ zdarzyło się to w odstępie 5 minut, i przeszło od poziomu ostrzegania do poziomu powyżej krytycznego w mniej niż 5 minut. I to nie był atak DoS.
sorin
2
Tak, to całkiem interesujący problem. Zdecydowanie zalecam umieszczenie PgBouncerprzed instancją PostgreSQL, która będzie kolejkować połączenia, gdy będzie zbyt zajęta, zamiast je odrzucać. (Tak, to głupie, że PostgreSQL nie może tego zrobić samodzielnie, ale nie jest to prosta poprawka; zobacz niekończące się dyskusje na listach dyskusyjnych dotyczące wbudowanej puli).
Craig Ringer
7
Co z logowaniem połączeń (za pomocą log_connections i log_disconnections) do pliku dziennika (np. Csvlog), a następnie użyj pgBadger lub czegoś podobnego, aby wyodrębnić to z pliku dziennika?
a_horse_w_no_name
2
@ a_horse_with_no_name Dobry punkt. Możesz nawet „ogonić” dzienniki za pomocą klienta, który po prostu odczytuje nowe wpisy dziennika, integrując się przez rozłączenia i połączenia, aby uzyskać raport w czasie rzeczywistym o szczytowych połączeniach w określonym czasie. Szczerze mówiąc, nie powinno to być takie skomplikowane. Jednym z moich zadań w projekcie AXLE ( axleproject.eu ) jest zaimplementowanie większej ilości audytów i być może uda mi się to do tego dopasować ...
Craig Ringer

Odpowiedzi:

1

Lepiej jest używać narzędzi do monitorowania obciążenia, takich jak pgbadgersprawdzanie połączeń z bazą danych i ogólne obciążenie. Pomoże ci zrozumieć, którzy użytkownicy łączą się przez ile czasu i jakie zapytania są przez nich uruchamiane. Aby uzyskać informacje na temat instalowania i konfigurowania pgbadger, zobacz stronę.

Jeśli chcesz tylko sprawdzić liczbę aktywnych połączeń, możesz użyć select count(*) from pg_stat_activity where state='active'

Lohit Gupta
źródło
0

Aby to zrobić, możesz użyć rozszerzenia z local_preload_libraries.

Coś takiego:

#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)
{
}

Lub zamiast tego UPDATE przez NOTIFY

Roman Tkachuk
źródło
5
Spróbuj poprawić swoją odpowiedź, podając wyjaśnienie dotyczące dalszego postępowania.
McNets,