PostgreSQL 데이터베이스 연결 수를 올바르게 모니터링하는 방법은 무엇입니까?


10

Postgres 데이터베이스에서 데이터베이스 연결 수를 모니터링하기 위해 Nagios 스크립트를 사용하려고 시도 했는데이 문제에 도달했습니다. 이는 현재 열린 연결로 계산되어 5 분마다 측정됩니다.

SELECT sum(numbackends) FROM pg_stat_database;

그럼에도 불구하고 이것은 수많은 단기간 연결을 그리워하는 것 같으므로 통계는 현실과 거리가 멀다.

스크립트를 수동으로 실행하려고했는데 몇 초만에 두 연결 간에도 큰 변화가있었습니다.

이 정보를 신뢰할 수있는 방법으로 얻을 수 있습니까? max (connectios)와 같은 시간 간격 동안 발생했습니다.


1
연결에 대한 시간 경과에 따른 집계 통계는 좋지만 PostgreSQL이 현재 통계를 수집하지는 않습니다. 자세한 내용은 postgresql.org/docs/current/static/monitoring-stats.html 문서 를 참조하십시오.
Craig Ringer

@CraigRinger 어쩌면 Postgres 또는 클라이언트가 더 오랫동안 연결을 유지하도록 구성 할 수 있으므로 측정 할 수 있습니다. 현재 설정으로 인해 postgres가 연결을 거부하기 시작한 경우가 있습니다. 5 분 내에 발생했기 때문에 모니터링이이를 감지 할 수 없었으며 5 분 이내에 경고 레벨 아래에서 위험 레벨로 올라갔습니다. 그리고 이것은 DoS 공격이 아닙니다.
sorin

2
네, 꽤 흥미로운 문제입니다. PgBouncerPostgreSQL 인스턴스 앞에 배치하는 것이 좋습니다. 연결을 거부하지 않고 너무 바쁠 때 연결을 대기시킵니다. (예, PostgreSQL이 자체적으로 수행 할 수는 없지만 멍청한 것은 아닙니다. 메일 링리스트에 대한 끝없는 토론은 내장 풀링을 참조하십시오).
Craig Ringer

7
로깅 연결에 대한 어떤 (사용 log_connections 하고 log_disconnections) 로그 파일에 (예를 들어 csvlog) 다음 pgBadger를 사용하거나 이와 유사한가 로그 파일에서 것을 추출?
a_horse_with_no_name 12

2
@a_horse_with_no_name 좋은 지적입니다. 새로운 로그 항목을 읽은 클라이언트와 로그를 "꼬리"할 수 있으며, 연결 해제 및 연결을 통합하여 주어진 시간 동안 최대 연결에 대한 거의 실시간 보고서를 얻을 수 있습니다. 솔직히, 그렇게 복잡해서는 안됩니다. 차축 프로젝트 (내 작업 중 하나 axleproject.eu는 ...) 좀 더 감사를 구현하는 것입니다, 나는 그것으로이 적합 할 수있을 것
크레이그 벨소리

답변:


1

pgbadger데이터베이스 연결 및 전체로드 확인 과 같은 워크로드 모니터링 도구를 사용하는 것이 좋습니다 . 연결하는 시간과 시간에 따라 어떤 사용자가 연결하고 있는지 파악하는 데 도움이됩니다. pgbadger 설치 및 구성에 대한 정보는 페이지를 참조 하십시오.

활성 연결 수만 확인하려는 경우 select count(*) from pg_stat_activity where state='active'


0

local_preload_libraries와 함께 extension을 사용하여이를 수행 할 수 있습니다.

이 같은:

#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.