对于PostgreSQL中的连接池,最好的和最受欢迎的工具之一是PgBouncer。但是,由于监视PgBouncer的使用SHOW命令而可能具有挑战性,SHOW命令仅通过特殊的数据库连接才可用,而不是通过标准表或视图提供其统计信息。
为了更轻松地监视PgBouncer,Crunchy Data团队开发了一个开源PgBouncer外部数据包装器(pgbouncer_fdw)。这篇博客文章描述了为什么监视PgBouncer如此重要,以及如何使用pgMonitor和pgbouncer_fdw轻松地做到这一点。
背景
pgMonitor是一个用于PostgreSQL的开源监视实用程序,我们已经在CrunchyData上开发了它。它是一套工具,用于促进PostgreSQL数据库和主机环境中应了解的指标的收集和可视化。合理地包括所有可通过PgBouncer获得的统计信息,这样我们就可以知道连接池是否在提供好处并尽可能有效地工作。但是,由于使用了特殊数据库连接中的SHOW命令来提供这些统计信息,因此没有一种简单的方法来监视PgBouncer。
$ psql -h localhost -U ccp_monitoring -p 5432 pgbouncer Password for user ccp_monitoring: psql (11.6, server 1.12.0/bouncer) Type "help" for help. pgbouncer=# \x Expanded display is on. pgbouncer=# SHOW pools; -[ RECORD 1 ]--------- database | pgbouncer user | pgbouncer cl_active | 1 cl_waiting | 0 sv_active | 0 sv_idle | 0 sv_used | 0 sv_tested | 0 sv_login | 0 maxwait | 0 maxwait_us | 0 pool_mode | statement -[ RECORD 2 ]--------- [...]
复制
如果不能使用标准SQL来收集这些统计信息,则很难执行更详细的分析并使用典型的数据库监视工具来收集它们。
我回想起曾经有人使用PG9.1中引入的新外部数据包装器(FDW)功能来简化PgBouncer的监视。 PostgreSQL中的外部数据包装器允许直接连接到数据库本身之外的许多不同的外部数据源(Oracle,MySQL,其他PG数据库,文件等)。它使这些连接显示为可通过标准SQL查询的普通表,具体取决于该特定FDW支持的功能。周围的一些人发现了Fabríziode Royes Mello提出的这个要点。
这种方法效果很好,但我认为我可以通过将其转换为PG9.1中也引入的另一个功能:扩展来使其更易于管理。通过扩展,可以更轻松地安装和管理数据库中特定版本的代码。例如,PostgreSQL核心中可用的所有contrib模块现在也都是扩展。这导致创建了PgBouncer外部数据包装器(pgbouncer_fdw)。
尽管从技术上来说pgbouncer_fdw本身并不是FDW,但它确实利用了dblink_fdw的功能,因此名称仍然合适。
使用pgbouncer_fdw
在完成FDW的典型设置,设置SERVER和USER MAPPING之后,pgbouncer_fdw将大多数SHOW命令作为标准视图公开,然后可以使用标准SQL在安装扩展的任何位置进行查询。
CREATE EXTENSION dblink;
复制
CREATE SERVER pgbouncer FOREIGN DATA WRAPPER dblink_fdw OPTIONS (host 'localhost', port '6432', dbname 'pgbouncer'); CREATE USER MAPPING FOR PUBLIC SERVER pgbouncer OPTIONS (user 'ccp_monitoring', password 'mypassword'); CREATE EXTENSION pgbouncer_fdw; GRANT USAGE ON FOREIGN SERVER pgbouncer TO ccp_monitoring; GRANT SELECT ON pgbouncer_clients TO ccp_monitoring; GRANT SELECT ON pgbouncer_config TO ccp_monitoring; GRANT SELECT ON pgbouncer_databases TO ccp_monitoring; GRANT SELECT ON pgbouncer_dns_hosts TO ccp_monitoring; GRANT SELECT ON pgbouncer_dns_zones TO ccp_monitoring; GRANT SELECT ON pgbouncer_lists TO ccp_monitoring; GRANT SELECT ON pgbouncer_pools TO ccp_monitoring; GRANT SELECT ON pgbouncer_servers TO ccp_monitoring; GRANT SELECT ON pgbouncer_sockets TO ccp_monitoring; GRANT SELECT ON pgbouncer_stats TO ccp_monitoring; GRANT SELECT ON pgbouncer_users TO ccp_monitoring;
复制
现在可以通过如上所述的标准GRANT系统控制对这些视图的访问。GRANT语句显示pgbouncer_fdw扩展创建的对象。
所有视图都与PgBouncer本身的类似名称的SHOW命令所提供的视图相对应。尽管不包括所有视图,要么是由于仅在另一个视图中复制了数据(STATS_TOTALS,STATS_AVERAGES等),要么是遵循了源项目的建议(FDS )。
通过设置pgbouncer_fdw,现在使用简单的SELECT语句可以更轻松地随时查看PgBouncer统计信息:
postgres=> SELECT * FROM pgbouncer_pools; -[ RECORD 1 ]--------- database | pgbouncer user | pgbouncer cl_active | 1 cl_waiting | 0 sv_active | 0 sv_idle | 0 sv_used | 0 sv_tested | 0 sv_login | 0 maxwait | 0 maxwait_us | 0 pool_mode | statement -[ RECORD 2 ]--------- database | postgres user | postgres cl_active | 1 cl_waiting | 0 sv_active | 1 sv_idle | 0 sv_used | 0 sv_tested | 0 sv_login | 0 maxwait | 0 maxwait_us | 0 pool_mode | session
复制
该扩展是PostgreSQL许可下的完全开放源代码,可随时从Crunchy Data GitHub存储库中使用。