8.5 维护 pgbouncer
除了我们在本章已经说明的,pgbouncer有一个很好的能够执行基本管理和监控任务的交互式管理界面。
它是如何工作的呢?pgbouncer提供给您一个虚假的称为pgbouncer的数据库。它不能被用于查询,因为它只提供简单的语法来处理基本的管理任务。
[如果您正在使用pgbouncer,请不要使用普通的数据库名为pgbouncer—它将会导致混乱,它将不会产生好处。]
8.5.1 配置管理接口
为了配置这个接口,我们必须改写我们的配置文件。在我们的例子中,我们将简单地添加一行到配置文件(在该文件的pgbouncer部分):
admin_users = zb
我们想让Zoltan,用户名为zb,管理管理数据库,因此我们简单地把他在这里。如果我们想让许多用户都能够访问系统,我们可以把他们一个一个地列出来(用逗号隔开)。
重新启动pgbouncer,我们可以尝试连接到系统:
psql -p 6432 -U zb pgbouncer
psql (9.2.4, server 1.5.4/bouncer)
WARNING: psql version 9.2, server version 1.5.
Some psql features might not work.
Type "help" for help.
不要担心警告信息—它只是告诉我们,我们已经连接到一个看起来不像一个原生的PostgreSQL数据库实例的东西。
8.5.2 使用管理数据库
一旦我们连接到这个虚拟的管理数据库,我们可以检查哪个命令是可用的。要做到这一点,我们可以运行SHOW HELP:
pgbouncer=# SHOW HELP;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
SHOW STATS|FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW DNS_HOSTS|DNS_ZONES
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
KILL <db>
SUSPEND
SHUTDOWN
SHOW
正如我们所提到的,系统将只接受管理命令;在这个虚拟数据库中正常的SELECT语句是不可用的。
pgbouncer=# SELECT 1+1;
ERROR: invalid command 'SELECT 1+1;', use SHOW HELP;
8.5.3 提取运行时信息
您可以使用管理界面做的一件重要事情是弄清楚为系统配置了那些数据库。要做到这一点,您可以调用SHOW DATABASES 命令:
pgbouncer=# x
Expanded display is on.
pgbouncer=# SHOW DATABASES;
-[ RECORD 1 ]+----------
name | p0
host | localhost
port | 5432
database | p0
force_user |
pool_size | 20
reserve_pool | 0
-[ RECORD 2 ]+----------
name | p1
host | localhost
port | 5432
database | p1
force_user |
pool_size | 20
reserve_pool | 0
-[ RECORD 3 ]+----------
name | pgbouncer
host |
port | 6432
database | pgbouncer
force_user | pgbouncer
pool_size | 2
reserve_pool | 0
正如您可以看到的,我们有两个生产数据库和虚拟pgbouncer数据库 。这里重要的看点是,包含池大小以及预留池大小的列表。看看在您的bouncer设置中在做什么,是一个很好的检查。
一旦您已经检查了您系统上的数据库列表,您可以把您的注意力转移到您的系统中的客户端。为了提取活跃的客户的列表,pgbouncer提供了SHOW CLIENTS指令:
pgbouncer=# x
Expanded display is on.
pgbouncer=# SHOW CLIENTS;
-[ RECORD 1 ]+--------------------
type | C
user | zb
database | pgbouncer
state | active
addr | unix
port | 6432
local_addr | unix
local_port | 6432
connect_time | 2013-04-29 11:08:54
request_time | 2013-04-29 11:10:39
ptr | 0x19e3000
link |
目前,我们恰好有一个到pgbouncer数据库的用户连接。我们可以看到连接来自哪里以及它是何时创建的。如果系统上有成百上千的服务器SHOW CLIENTS是特别重要的。
有时候,从系统中提取汇总信息是非常有用的。SHOW STATUS将为您提供您的系统在做什么事情的=统计信息。它显示平均执行了多少请求和执行了多少查询:
pgbouncer=# SHOW STATS;
-[ RECORD 1 ]----+----------
database | pgbouncer
total_requests | 3
total_received | 0
total_sent | 0
total_query_time | 0
avg_req | 0
avg_recv | 0
avg_sent | 0
avg_query | 0
最后,我们可以看一下我们面临的内存消耗。如果SHOW MEM被执行,pgbouncer将返回这个信息:
pgbouncer=# SHOW MEM;
name | size | used | free | memtotal
--------------+------+------+------+----------
user_cache | 184 | 4 | 85 | 16376
db_cache | 160 | 3 | 99 | 16320
pool_cache | 408 | 1 | 49 | 20400
server_cache | 360 | 0 | 0 | 0
client_cache | 360 | 1 | 49 | 18000
iobuf_cache | 2064 | 1 | 49 | 103200
(6 rows)
正如您可以看到的,pgbouncer真的是轻量级的,和其它的连接池相比不消耗太多的内存。
8.5.4 挂起与恢复操作
使用交互式虚拟数据库的重要原因之一是能够挂起和恢复正常操作。在系统运行时重新加载配置文件是可能的,正如下面的例子所显示的:
pgbouncer=# RELOAD;
RELOAD
RELOAD会重新读取配置文件,使得没有必要为了大多数小的改变重新启动整个bouncer。如果有一个新用户或者类似的事情,这是特别有用的。
pgbounce的另外一个特征是使操作停止一段时间的能力。为什么有时候有人会想要停止查询呢?让我们假设您想在基础设施的某个地方做一个小的改变。只是简单地中断操作而不引发实际的错误。当然,您必须要小心一点,以确保您的前端基础设施可以很好地处理这样的中断。从数据库方面来看,可以手动执行。
要暂时停止查询,我们可以调用SUSPEND:
pgbouncer=# SUSPEND;
SUSPEND
一旦您完成了您的更改之后,您可以很容易地恢复正常操作:
pgbouncer=# RESUME;
RESUME
一旦这个命令被调用,您可以继续给服务器发送查询。
最后,您甚至可以从交互式的shell停止pgbouncer。强烈建议,当您这样做的时候,您要小心。
pgbouncer=# SHUTDOWN;
The connection to the server was lost. Attempting reset: Failed.
!>
该系统将立即关闭。
8.6 总结
在本章中,我们学习了如何为高度可扩展的web应用程序减少永久连接创建的开销而使用pgboucner。我们看到了如何配置系统以及我们如何使用虚拟管理数据库。
在接下来的一章,将会为您介绍pgpool,一个执行复制和连接池的工具。就像pgbouncer,pgpool是开放源代码的,可以和PostgreSQL一起使用来改善您的集群的设置。