PostgreSQL डेटाबेस कनेक्शन की संख्या की सही तरीके से निगरानी कैसे करें?


10

मैंने एक Postgres डेटाबेस पर डेटाबेस कनेक्शनों की संख्या की निगरानी के लिए एक Nagios स्क्रिप्ट का उपयोग करने की कोशिश की और मैं इस समस्या पर पहुंच गया: इन्हें वर्तमान में खुले कनेक्शनों के रूप में गिना जाता है और हर 5 मिनट में मापा जाता है।

SELECT sum(numbackends) FROM pg_stat_database;

फिर भी, यह बड़ी संख्या में अल्पकालिक कनेक्शनों को याद करता है, इसलिए आंकड़े वास्तविकता से बहुत दूर हैं।

मैंने स्क्रिप्ट को मैन्युअल रूप से चलाने की कोशिश की और मैंने दो कनेक्शनों के बीच भी बड़े बदलाव देखे, जो कुछ सेकंडों में एक दूसरे से दूर हो गए।

मैं विश्वसनीय तरीके से यह जानकारी कैसे प्राप्त कर सकता हूं? एक समय अंतराल के दौरान अधिकतम (संयोजक) हुआ।


1
कनेक्शन के लिए समय के साथ आँकड़े आँकड़े अच्छे होंगे, लेकिन मुझे नहीं लगता कि PostgreSQL वर्तमान में उन्हें एकत्र करता है। विवरण के लिए डॉक्स postgresql.org/docs/current/static/monitoring-stats.html देखें।
क्रेग रिंगर

@ क्रेगिंगर शायद मैं पोस्टग्रेज या क्लाइंट को लंबे समय तक कनेक्शन खुला रखने के लिए कॉन्फ़िगर कर सकता हूं, इसलिए मैं उन्हें माप सकता हूं। वर्तमान सेटअप के कारण मेरे पास एक मामला था जब पोस्टगे्रस ने कनेक्शन से इनकार करना शुरू कर दिया था। निगरानी यह पता लगाने में सक्षम नहीं थी क्योंकि यह 5 मिनट के अंतराल के अंदर हुआ था, और यह चेतावनी स्तर से कम से कम 5 मिनट में गंभीर से ऊपर हो गया। और यह एक DoS हमला नहीं था।
सोरिन

2
हाँ, यह काफी दिलचस्प समस्या है। मैं दृढ़ता PgBouncerसे आपके PostgreSQL उदाहरण के सामने रखने की सलाह देता हूं , यह कनेक्शन को कतारबद्ध कर देगा जब यह उन्हें अस्वीकार करने के बजाय बहुत व्यस्त है। (हां, यह बेवकूफी है कि PostgreSQL ऐसा नहीं कर सकता है, लेकिन यह एक साधारण फिक्स नहीं है; मेलिंग सूचियों पर अंतहीन चर्चा फिर से अंतर्निहित पूलिंग देखें)।
क्रेग रिंगर

7
लॉगफ़ाइल में लॉगिंग कनेक्शन (उपयोग log_connections और log_disconnections) के बारे में क्या है (उदाहरण के लिए सीएसवीलॉग) और फिर लॉगबाइल से निकालने के लिए pgBadger या कुछ इसी तरह का उपयोग करें?
a_horse_with_no_name

2
@a_horse_with_no_name अच्छा बिंदु। आप किसी क्लाइंट के साथ लॉग को "टेल" भी कर सकते हैं जो कि नए लॉग एंट्रीज को पढ़ता है, डिस्कनेक्ट पर एकीकृत करता है और किसी दिए गए टाइमफ्रेम के दौरान पीक कनेक्शन की लगभग वास्तविक समय रिपोर्ट प्राप्त करने के लिए कनेक्ट होता है। सच कहूँ तो, यह जटिल नहीं होना चाहिए। AXLE प्रोजेक्ट के लिए मेरा एक कार्य ( axleproject.eu ) कुछ और ऑडिटिंग को लागू करना है, और मैं इसे इसमें फिट कर सकता हूं ...
क्रेग रिंगर

जवाबों:


1

pgbadgerडेटाबेस कनेक्शन और समग्र लोड की जाँच के लिए वर्कलोड निगरानी उपकरण जैसे इसका बेहतर उपयोग । यह आपको यह समझने में मदद करेगा कि कौन से उपयोगकर्ता कितने समय से कनेक्ट हो रहे हैं और उनके द्वारा कौन सी क्वेरी को निकाल दिया जा रहा है। Pgbadger को स्थापित और कॉन्फ़िगर करने की जानकारी के लिए, इस पृष्ठ को देखें ।

यदि आप केवल सक्रिय कनेक्शन की संख्या की जांच करना चाहते हैं, तो आप उपयोग कर सकते हैं select count(*) from pg_stat_activity where state='active'


0

ऐसा करने के लिए आप local_preload_lbooks के साथ एक्सटेंशन का उपयोग कर सकते हैं।

कुछ इस तरह:

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

या इसके बजाय NOTIFY के माध्यम से अद्यतन करें


5
कृपया, आगे बढ़ने के बारे में कुछ स्पष्टीकरण के साथ अपने उत्तर को बेहतर बनाने का प्रयास करें।
मैकनेट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.