Comment surveiller correctement le nombre de connexions à la base de données PostgreSQL?

10

J'ai essayé d'utiliser un script Nagios pour surveiller le nombre de connexions à une base de données sur une base de données Postgres et j'ai atteint ce problème: ceux-ci sont comptés comme des connexions actuellement ouvertes et mesurés toutes les 5 minutes.

SELECT sum(numbackends) FROM pg_stat_database;

Pourtant, cela semble manquer un grand nombre de connexions de courte durée, donc les statistiques sont loin de la réalité.

J'ai essayé d'exécuter le script manuellement et j'ai observé de grands changements même entre deux connexions établies à quelques secondes l'une de l'autre.

Comment puis-je obtenir ces informations de manière fiable? comme max (connectios) s'est produit pendant un intervalle de temps.

Sorin
la source
1
Les statistiques agrégées au fil du temps pour les connexions seraient bien, mais je ne pense pas que PostgreSQL les collecte actuellement. Consultez les documents postgresql.org/docs/current/static/monitoring-stats.html pour plus de détails.
Craig Ringer
@CraigRinger je pourrais peut-être configurer Postgres ou les clients pour garder les connexions ouvertes pendant une plus longue période, afin que je puisse les mesurer. En raison de la configuration actuelle, j'ai eu un cas où les postgres ont commencé à refuser les connexions. La surveillance n'a pas été en mesure de détecter cela, car cela s'est produit dans l'intervalle de 5 minutes, et elle est passée du niveau d'avertissement inférieur au niveau critique en moins de 5 minutes. Et ce n'était pas une attaque DoS.
sorin
2
Oui, c'est un problème assez intéressant. Je recommande fortement de mettre un PgBouncerdevant votre instance PostgreSQL, il mettra les connexions en file d'attente lorsqu'il est trop occupé au lieu de les rejeter. (Oui, c'est stupide que PostgreSQL ne puisse pas le faire lui-même mais ce n'est pas une solution simple; voir les discussions sans fin sur les listes de diffusion concernant le regroupement intégré).
Craig Ringer
7
Qu'en est-il de la connexion des connexions (à l'aide de log_connections et log_disconnections) dans le fichier journal (par exemple, csvlog), puis utilisez pgBadger ou quelque chose de similaire pour extraire cela du fichier journal?
a_horse_with_no_name
2
@a_horse_with_no_name Bon point. Vous pouvez même "suivre" les journaux avec un client qui ne fait que lire les nouvelles entrées de journal, en intégrant les déconnexions et les connexions pour obtenir un rapport en temps quasi réel des connexions de pointe pendant une période donnée. Franchement, cela ne devrait pas être aussi compliqué. L'une de mes tâches pour le projet AXLE ( axisproject.eu ) est de mettre en œuvre un peu plus d'audit, et je pourrais peut-être y intégrer ...
Craig Ringer

Réponses:

1

Il est préférable d'utiliser des outils de surveillance de la charge de travail comme pgbadgerpour vérifier les connexions à la base de données et la charge globale. Il vous aidera à comprendre quels utilisateurs se connectent pendant combien de temps et quelles requêtes sont lancées par eux. Pour plus d'informations sur l'installation et la configuration de pgbadger, reportez - vous à cette page.

Si vous souhaitez simplement vérifier le nombre de connexions actives, vous pouvez utiliser select count(*) from pg_stat_activity where state='active'

Lohit Gupta
la source
0

Vous pouvez utiliser l'extension avec local_preload_libraries pour ce faire.

Quelque chose comme ça:

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

Ou à la place MISE À JOUR via NOTIFY

Roman Tkachuk
la source
5
S'il vous plaît, essayez d'améliorer votre réponse avec quelques explications sur la façon de procéder.
McNets