วิธีตรวจสอบจำนวนการเชื่อมต่อฐานข้อมูล PostgreSQL อย่างถูกต้อง


10

ฉันพยายามใช้สคริปต์ Nagios เพื่อตรวจสอบจำนวนการเชื่อมต่อฐานข้อมูลในฐานข้อมูล Postgres และฉันพบปัญหานี้: สิ่งเหล่านี้นับเป็นการเชื่อมต่อแบบเปิดในปัจจุบันและวัดทุกๆ 5 นาที

SELECT sum(numbackends) FROM pg_stat_database;

แต่ถึงกระนั้นก็ดูเหมือนว่าจะพลาดการเชื่อมต่อระยะสั้นจำนวนมากดังนั้นสถิติอยู่ไกลจากความเป็นจริง

ฉันพยายามเรียกใช้สคริปต์ด้วยตนเองและฉันสังเกตเห็นการเปลี่ยนแปลงครั้งใหญ่แม้ระหว่างการเชื่อมต่อสองครั้งทำให้ห่างจากกันไม่กี่วินาที

ฉันจะรับข้อมูลนี้ในวิธีที่เชื่อถือได้อย่างไร ชอบ max (connectios) ที่เกิดขึ้นในช่วงเวลาหนึ่ง


1
สถิติโดยรวมเมื่อเวลาผ่านไปสำหรับการเชื่อมต่อจะดี แต่ฉันไม่คิดว่าปัจจุบัน PostgreSQL รวบรวมพวกเขา ดูที่ docs postgresql.org/docs/current/static/monitoring-stats.htmlเพื่อดูรายละเอียด
Craig Ringer

@ CraigRinger บางทีฉันสามารถกำหนดค่า Postgres หรือไคลเอนต์ให้เปิดการเชื่อมต่อเป็นระยะเวลานานดังนั้นฉันสามารถวัดพวกเขา เนื่องจากการตั้งค่าปัจจุบันฉันมีหนึ่งกรณีเมื่อ postgres เริ่มปฏิเสธการเชื่อมต่อ การตรวจสอบไม่สามารถตรวจจับสิ่งนี้ได้เนื่องจากสิ่งนี้เกิดขึ้นภายในช่วงเวลา 5 นาทีและมันเปลี่ยนจากระดับการเตือนต่ำกว่าไปเป็นระดับวิกฤตในเวลาไม่ถึง 5 นาที และนี่ไม่ใช่การโจมตี DoS
sorin

2
ใช่นั่นเป็นปัญหาที่น่าสนใจทีเดียว ฉันขอแนะนำอย่างยิ่งให้วางPgBouncerหน้าอินสแตนซ์ PostgreSQL ของคุณมันจะจัดคิวการเชื่อมต่อเมื่อไม่ว่างแทนที่จะปฏิเสธพวกเขา (ใช่มันโง่ที่ PostgreSQL ไม่สามารถทำได้ด้วยตัวเอง แต่มันไม่ใช่การแก้ไขง่ายๆดูการสนทนาที่ไม่สิ้นสุดในรายชื่อผู้รับจดหมายที่รวมตัวกันในตัว)
Craig Ringer

7
สิ่งที่เกี่ยวกับการเชื่อมต่อเข้าสู่ระบบ (ใช้log_connections และlog_disconnections) ใน logfile (เช่น csvlog) แล้วใช้ pgBadger หรือสิ่งที่คล้ายกันเพื่อแยกว่าจาก logfile หรือไม่
a_horse_with_no_name

2
@a_horse_with_no_name จุดดี คุณสามารถ "ตัด" บันทึกการทำงานกับไคลเอนต์ที่เพิ่งอ่านรายการบันทึกใหม่รวมเข้ากับการตัดการเชื่อมต่อและการเชื่อมต่อเพื่อรับรายงานการเชื่อมต่อสูงสุดแบบเรียลไทม์ในช่วงเวลาที่กำหนด ตรงไปตรงมามันไม่ควรจะซับซ้อนนี้ หนึ่งในภารกิจของฉันสำหรับโครงการ AXLE ( axleproject.eu ) คือการดำเนินการตรวจสอบเพิ่มเติมและฉันอาจจะเหมาะสมกับสิ่งนี้ในนั้น ...
Craig Ringer

คำตอบ:


1

จะดีกว่าการใช้เครื่องมือตรวจสอบภาระงานเช่นpgbadgerการตรวจสอบการเชื่อมต่อฐานข้อมูลและโหลดโดยรวม มันจะช่วยให้คุณเข้าใจว่าผู้ใช้รายใดกำลังเชื่อมต่อกับเวลาและคำสั่งใดที่ถูกไล่ออก สำหรับข้อมูลเกี่ยวกับการติดตั้งและการกำหนดค่า pgbadger อ้างอิงนี้หน้า

หากคุณต้องการตรวจสอบจำนวนการเชื่อมต่อที่ใช้งานอยู่คุณสามารถใช้ select count(*) from pg_stat_activity where state='active'


0

คุณสามารถใช้ส่วนขยายกับ local_preload_l ไลบรารีเพื่อทำสิ่งนี้

บางสิ่งเช่นนี้

#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
โปรดลองปรับปรุงคำตอบของคุณพร้อมคำอธิบายเกี่ยวกับวิธีดำเนินการต่อ
McNets
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.