Wie kann die Anzahl der PostgreSQL-Datenbankverbindungen ordnungsgemäß überwacht werden?

10

Ich habe versucht, ein Nagios-Skript zum Überwachen der Anzahl der Datenbankverbindungen in einer Postgres-Datenbank zu verwenden, und bin auf dieses Problem gestoßen: Diese werden als derzeit offene Verbindungen gezählt und alle 5 Minuten gemessen.

SELECT sum(numbackends) FROM pg_stat_database;

Dennoch scheint dies eine große Anzahl von kurzlebigen Verbindungen zu übersehen, so dass die Statistiken weit von der Realität entfernt sind.

Ich habe versucht, das Skript manuell auszuführen, und ich habe große Änderungen festgestellt, selbst zwischen zwei Verbindungen, die einige Sekunden voneinander entfernt hergestellt wurden.

Wie kann ich diese Informationen zuverlässig erhalten? wie max (connectios) während eines Zeitintervalls passiert.

Sorin
quelle
1
Aggregierte Statistiken im Laufe der Zeit für Verbindungen wären nett, aber ich glaube nicht, dass PostgreSQL sie derzeit sammelt. Weitere Informationen finden Sie in den Dokumenten postgresql.org/docs/current/static/monitoring-stats.html .
Craig Ringer
@CraigRinger Vielleicht könnte ich Postgres oder die Clients so konfigurieren, dass Verbindungen für einen längeren Zeitraum offen bleiben, damit ich sie messen kann. Aufgrund des aktuellen Setups hatte ich einen Fall, in dem die Postgres anfingen, Verbindungen abzulehnen. Die Überwachung konnte dies nicht erkennen, da dies innerhalb des 5-Minuten-Intervalls geschah und in weniger als 5 Minuten von unterhalb der Warnstufe auf über kritisch abging. Und dies war kein DoS-Angriff.
Sorin
2
Ja, das ist ein ziemlich interessantes Problem. Ich empfehle dringend, eine PgBouncervor Ihre PostgreSQL-Instanz zu stellen, da sie Verbindungen in die Warteschlange stellt, wenn sie zu beschäftigt ist, anstatt sie abzulehnen. (Ja, es ist dumm, dass PostgreSQL das nicht selbst tun kann, aber es ist keine einfache Lösung; siehe die endlosen Diskussionen auf den Mailinglisten, die in das Pooling integriert sind).
Craig Ringer
7
Was ist mit der Protokollierung von Verbindungen (mit log_connections und log_disconnections) in der Protokolldatei (z. B. csvlog) und der Verwendung von pgBadger oder ähnlichem, um diese aus der Protokolldatei zu extrahieren?
a_horse_with_no_name
2
@a_horse_with_no_name Guter Punkt. Sie können die Protokolle sogar mit einem Client "abschließen", der nur neue Protokolleinträge liest, über Verbindungsabbrüche und Verbindungen integriert, um einen Echtzeitbericht über Spitzenverbindungen während eines bestimmten Zeitraums zu erhalten. Ehrlich gesagt sollte es nicht so kompliziert sein. Eine meiner Aufgaben für das AXLE-Projekt ( axleproject.eu ) besteht darin, weitere Audits zu implementieren, und ich kann dies möglicherweise einpassen ...
Craig Ringer

Antworten:

1

Es ist besser, Workload-Überwachungstools zu verwenden, pgbadgerum beispielsweise Datenbankverbindungen und die Gesamtlast zu überprüfen. Es hilft Ihnen zu verstehen, welche Benutzer sich für wie viel Zeit verbinden und welche Abfragen von ihnen ausgelöst werden. Informationen zum Installieren und Konfigurieren von pgbadger finden Sie auf dieser Seite.

Wenn Sie nur die Anzahl der aktiven Verbindungen überprüfen möchten, können Sie verwenden select count(*) from pg_stat_activity where state='active'

Lohit Gupta
quelle
0

Sie können dazu die Erweiterung mit local_preload_libraries verwenden.

Etwas wie das:

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

Oder stattdessen UPDATE über NOTIFY

Roman Tkachuk
quelle
5
Bitte versuchen Sie, Ihre Antwort mit einer Erklärung zum weiteren Vorgehen zu verbessern.
McNets