如何正确监视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 2014年

@CraigRinger也许我可以配置Postgres或客户端以保持连接打开较长时间,所以我可以测量它们。由于当前的设置,我遇到一种情况,即postgres开始拒绝连接。监视无法检测到此情况,因为这是在5分钟间隔内发生的,并且它在不到5分钟的时间内从低于警告级别变为高于严重级别。这不是DoS攻击。
sorin 2014年

2
是的,这是一个很有趣的问题。我强烈建议PgBouncer您在PostgreSQL实例前面放置一个,它会在连接太忙时将其排队,而不是拒绝它们。(是的,PostgreSQL无法做到这一点很愚蠢,但这不是一个简单的解决方法;请参阅有关邮件列表的无休止讨论,以重新构建内置池)。
克雷格·林格2014年

7
如何将连接(使用log_connections log_disconnections)记录到日志文件(例如csvlog)中,然后使用pgBadger或类似的方法从日志文件中提取出来呢?
a_horse_with_no_name 2014年

2
@a_horse_with_no_name好点。您甚至可以与客户端“尾部”日志,该客户端仅读取新的日志条目,通过断开连接和连接进行集成,以获取给定时间段内峰值连接的近实时报告。坦白说,它不应该那么复杂。我在AXLE项目(axisproject.eu)的任务之一是实施更多审核,我也许可以将其纳入其中……
Craig Ringer 2014年

Answers:


1

最好使用工作负载监视工具,例如pgbadger用于检查数据库连接和总体负载的工具。它将帮助您了解哪些用户连接了多少时间以及他们触发了哪些查询。有关安装和配置pgbadger的信息,请参阅页面。

如果您只想检查活动连接的数量,则可以使用 select count(*) from pg_stat_activity where state='active'


0

您可以将扩展名与local_preload_libraries一起使用。

像这样:

#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 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.