Bagaimana cara memonitor dengan benar jumlah koneksi basis data PostgreSQL?

10

Saya mencoba menggunakan skrip Nagios untuk memantau jumlah koneksi basis data pada basis data Postgres dan saya mencapai masalah ini: ini dihitung sebagai koneksi terbuka dan diukur setiap 5 menit.

SELECT sum(numbackends) FROM pg_stat_database;

Namun, ini sepertinya kehilangan sejumlah besar koneksi berumur pendek, jadi statistiknya jauh dari kenyataan.

Saya mencoba menjalankan skrip secara manual dan saya mengamati perubahan besar bahkan antara dua koneksi membuat beberapa detik satu sama lain.

Bagaimana saya bisa mendapatkan informasi ini dengan cara yang dapat diandalkan? seperti max (connectios) terjadi selama interval waktu.

Sorin
sumber
1
Agregat statistik dari waktu ke waktu untuk koneksi akan menyenangkan, tetapi saya tidak berpikir PostgreSQL saat ini mengumpulkannya. Lihatlah dokumen postgresql.org/docs/current/static/monitoring-stats.html untuk detailnya.
Craig Ringer
@CraigRinger mungkin saya bisa mengkonfigurasi Postgres atau klien untuk menjaga koneksi tetap terbuka untuk jangka waktu yang lebih lama, jadi saya bisa mengukurnya. Karena pengaturan saat ini saya punya satu kasus ketika postgres mulai menolak koneksi. Pemantauan tidak dapat mendeteksi hal ini karena ini terjadi di dalam interval 5 menit, dan ia beralih dari tingkat peringatan di bawah menjadi di atas kritis dalam waktu kurang dari 5 menit. Dan ini bukan serangan DoS.
sorin
2
Ya, itu masalah yang cukup menarik. Saya sangat menyarankan meletakkan PgBouncerdi depan contoh PostgreSQL Anda, itu akan mengantri koneksi ketika terlalu sibuk alih-alih menolaknya. (Ya, itu bodoh bahwa PostgreSQL tidak dapat melakukan itu sendiri tetapi itu bukan perbaikan sederhana; lihat diskusi tanpa henti di milis tentang penyatuan bawaan).
Craig Ringer
7
Bagaimana dengan mencatat koneksi (menggunakan log_connections dan log_disconnections) ke dalam file log (mis. Csvlog) dan kemudian menggunakan pgBadger atau sesuatu yang serupa untuk mengekstraknya dari file log?
a_horse_with_no_name
2
@a_horse_with_no_name Poin bagus. Anda bahkan dapat "mengekor" log dengan klien yang baru saja membaca entri log baru, mengintegrasikan lebih dari terputus dan menghubungkan untuk mendapatkan laporan waktu dekat koneksi puncak selama jangka waktu tertentu. Terus terang, seharusnya tidak serumit ini. Salah satu tugas saya untuk proyek AXLE ( axleproject.eu ) adalah untuk menerapkan beberapa audit lagi, dan saya mungkin dapat memasukkan ini ke dalamnya ...
Craig Ringer

Jawaban:

1

Lebih baik menggunakan alat pemantauan Beban Kerja seperti pgbadgeruntuk memeriksa koneksi basis data dan beban keseluruhan. Ini akan membantu Anda memahami pengguna mana yang terhubung untuk berapa banyak waktu dan pertanyaan apa yang dipecat oleh mereka. Untuk informasi tentang menginstal dan mengkonfigurasi pgbadger, lihat halaman ini .

Jika Anda hanya ingin memeriksa jumlah koneksi yang aktif, Anda dapat menggunakan select count(*) from pg_stat_activity where state='active'

Lohit Gupta
sumber
0

Anda dapat menggunakan ekstensi dengan local_preload_libraries untuk melakukan ini.

Sesuatu seperti ini:

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

Atau sebagai gantinya UPDATE via NOTIFY

Roman Tkachuk
sumber
5
Tolong, cobalah tingkatkan jawaban Anda dengan beberapa penjelasan tentang bagaimana melanjutkan.
McNets