PostgreSQL veritabanı bağlantılarının sayısı nasıl doğru şekilde izlenir?


10

Postgres veritabanındaki veritabanı bağlantılarının sayısını izlemek için bir Nagios komut dosyası kullanmaya çalıştım ve bu soruna ulaştım: bunlar şu anda açık bağlantılar olarak sayılıyor ve her 5 dakikada bir ölçülüyor.

SELECT sum(numbackends) FROM pg_stat_database;

Yine de, bu çok sayıda kısa ömürlü bağlantıyı kaçırıyor gibi görünüyor, bu yüzden istatistikler gerçeklikten uzak.

Komut dosyasını el ile çalıştırmayı denedim ve birbirinden birkaç saniye uzakta iki bağlantı arasında büyük değişiklikler gözlemledim.

Bu bilgiyi nasıl güvenilir bir şekilde alabilirim? max (connectios) gibi bir zaman aralığında gerçekleşti.


1
Bağlantılar için zaman içinde toplu istatistikler iyi olurdu, ancak PostgreSQL'in şu anda onları topladığını düşünmüyorum. Ayrıntılar için postgresql.org/docs/current/static/monitoring-stats.html dokümanlarına bakın.
Craig Ringer

@CraigRinger belki Postgres veya istemcileri bağlantıları daha uzun süre açık tutacak şekilde yapılandırabilirim, böylece onları ölçebilirim. Mevcut kurulum nedeniyle postgres bağlantılarını reddetmeye başladığında bir dava vardı. İzleme bunu algılayamadı çünkü bu 5 dakikalık aralık içinde gerçekleşti ve 5 dakikadan daha kısa bir sürede uyarı seviyesinin altında kritik seviyenin üstüne çıktı. Ve bu bir DoS saldırısı değildi.
sorin

2
Evet, bu oldukça ilginç bir problem. PgBouncerPostgreSQL örneğinizin önüne bir koymanızı şiddetle tavsiye ederim , bağlantıları reddetmek yerine çok meşgul olduğunda sıraya koyacaktır. (Evet, PostgreSQL'in kendi kendine yapamayacağı aptalca ama basit bir düzeltme değil; postalama listelerindeki yerleşik tartışmalara bakın.
Craig Ringer

7
Bağlantıları ( log_connections ve log_disconnections) kullanarak günlük dosyasına (örn. Csvlog) günlüğe kaydetmeye ve sonra pgBadger veya günlük dosyasından ayıklamaya benzer bir şey kullanmaya ne dersiniz?
a_horse_with_no_name

2
@a_horse_with_no_name İyi bir nokta. Günlükleri sadece yeni günlük girişlerini okuyan, bağlantı kesmeleri üzerinden entegre edilen ve belirli bir zaman aralığında zirve bağlantılarının gerçek zamanlıya yakın bir raporunu almak için bağlanan bir istemciyle "kuyruğa alabilirsiniz". Açıkçası, bu kadar karmaşık olmamalı. AXLE projesi ( axleproject.eu ) için görevlerimden biri daha fazla denetim uygulamak ve bunu buna sığabilirim ...
Craig Ringer

Yanıtlar:


1

pgbadgerVeritabanı bağlantılarını ve genel yükü kontrol etmek gibi İş Yükü izleme araçlarını kullanmak daha iyidir . Hangi kullanıcıların ne kadar süre bağlantı kurduğunu ve hangi sorguların onlar tarafından tetiklendiğini anlamanıza yardımcı olacaktır. Pgbadger'ı kurma ve yapılandırma hakkında bilgi için bu sayfaya bakın .

Sadece aktif bağlantı sayısını kontrol etmek istiyorsanız, select count(*) from pg_stat_activity where state='active'


0

Bunu yapmak için local_preload_libraries uzantısını kullanabilirsiniz.

Bunun gibi bir şey:

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

Ya da bunun yerine NOTIFY ile GÜNCELLEME


5
Lütfen, nasıl devam edeceğinizle ilgili bazı açıklamalarla yanıtınızı geliştirmeye çalışın.
McNets
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.