Làm thế nào để theo dõi đúng số lượng kết nối cơ sở dữ liệu PostgreSQL?


10

Tôi đã cố gắng sử dụng tập lệnh Nagios để theo dõi số lượng kết nối cơ sở dữ liệu trên cơ sở dữ liệu Postgres và tôi đã gặp phải vấn đề này: chúng được tính là các kết nối hiện đang mở và được đo cứ sau 5 phút.

SELECT sum(numbackends) FROM pg_stat_database;

Tuy nhiên, điều này dường như bỏ lỡ một số lượng lớn các kết nối ngắn hạn, vì vậy các số liệu thống kê là xa thực tế.

Tôi đã cố gắng chạy tập lệnh theo cách thủ công và tôi đã quan sát những thay đổi lớn ngay cả giữa hai kết nối cách nhau vài giây.

Làm thế nào tôi có thể nhận được thông tin này một cách đáng tin cậy? như max (kết nối) đã xảy ra trong một khoảng thời gian.


1
Số liệu thống kê tổng hợp theo thời gian cho các kết nối sẽ tốt, nhưng tôi không nghĩ PostgreQuery hiện đang thu thập chúng. Hãy xem các tài liệu postgresql.org/docs/civerse/static/monitoring-stats.html để biết chi tiết.
Craig Ringer

@CraigRinger có lẽ tôi có thể định cấu hình Postgres hoặc ứng dụng khách để giữ kết nối mở trong một khoảng thời gian dài hơn, vì vậy tôi có thể đo chúng. Do thiết lập hiện tại, tôi đã có một trường hợp khi các postgres bắt đầu từ chối kết nối. Giám sát đã không thể phát hiện ra điều này bởi vì điều này đã xảy ra trong khoảng thời gian 5 phút và nó đã đi từ mức cảnh báo xuống dưới mức quan trọng trong vòng chưa đầy 5 phút. Và đây không phải là một cuộc tấn công DoS.
sorin

2
Vâng, đó là một vấn đề khá thú vị. Tôi thực sự khuyên bạn nên đặt PgBouncertrước ví dụ PostgreQuery của bạn, nó sẽ xếp hàng các kết nối khi quá bận thay vì từ chối chúng. (Vâng, thật ngu ngốc khi PostgreSQL không thể tự làm điều đó nhưng nó không phải là một sửa chữa đơn giản; xem các cuộc thảo luận bất tận về danh sách gửi thư được tích hợp lại).
Craig Ringer

7
Điều gì về việc ghi nhật ký các kết nối (sử dụng log_connections log_disconnections) vào logfile (ví dụ: csvlog) và sau đó sử dụng pgBadger hoặc một cái gì đó tương tự để trích xuất từ ​​logfile?
a_horse_with_no_name

2
@a_horse_with_no_name Điểm tốt. Bạn thậm chí có thể "theo đuôi" các bản ghi với một máy khách chỉ đọc các mục nhật ký mới, tích hợp trên các ngắt kết nối và kết nối để có được một báo cáo gần như thời gian thực về các kết nối cao điểm trong một khung thời gian nhất định. Thành thật mà nói, nó không nên phức tạp. Một trong những nhiệm vụ của tôi cho dự án AXLE ( axleproject.eu ) là triển khai một số kiểm toán khác và tôi có thể phù hợp với điều này ...
Craig Ringer

Câu trả lời:


1

Tốt hơn hết là sử dụng các công cụ giám sát khối lượng công việc như pgbadgerđể kiểm tra các kết nối cơ sở dữ liệu và tải tổng thể. Nó sẽ giúp bạn hiểu người dùng nào đang kết nối trong bao nhiêu thời gian và những truy vấn nào đang bị họ sa thải. Để biết thông tin về cách cài đặt và cấu hình pgbadger, tham khảo này trang.

Nếu bạn chỉ muốn kiểm tra số lượng kết nối hoạt động, bạn có thể sử dụng select count(*) from pg_stat_activity where state='active'


0

Bạn có thể sử dụng tiện ích mở rộng với local_preload_l Library để thực hiện việc này.

Một cái gì đó như thế này:

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

Hoặc thay vào đó CẬP NHẬT qua THÔNG BÁO


5
Xin vui lòng, cố gắng cải thiện câu trả lời của bạn với một số giải thích về cách tiến hành.
McNets
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.