代码改变世界

PostgreSQL Replication之第八章 与pgbouncer一起工作(1)

2015-08-22 09:13  DataBases  阅读(565)  评论(0编辑  收藏  举报

当您在使用大规模的设施工作,可能有时候,您必须处理许多并发打开的连接。没有人会使用十台服务器来为两个并发用户提供服务--在许多情况下,这根本没有意义。大量的设施通常会处理成百上千的并发连接。引入连接池,例如pgbouncer,会有助于挤出您的系统的更多的性能。

通常创建成千上万个连接可以说是一笔相当的开销,因为每次一个连接到PostgreSQL的连接被创建需要调用fork()。如果一个连接仅使用较短的时间,这可是昂贵的事。这是需要使用pgbouncer的时候。基本上,pgbouncer不是一个复制相关的工具—但是,我们已经决定把它列入本书,因为它经常和复制联合使用来使它更有效地工作。

在本章中,我们将深入地学习pgbouncer,看看 它是如何被安装的,怎样加速您的设施。这并不意味着pgbouncer的一个全面的指导,不能替代官方文档。

本章将讲述如下主题:

• pgbouncer的目的

•连接池的基本概念

•安装pgbouncer

•配置和管理pgbouncer

•性能调优

•使pgbouncer与Java一起工作

8.1 理解pgbouncer的基本概念

如前所述,pgbouncer的基本思想是节省连接相关的成本。当用户创建一个新的数据库连接,通常意味着用掉几百KB内存。这由20Kb左右的共享内存组成,这些内存由提供连接服务的进程自己使用。尽管内存消耗本身可能不是问题,但是,实际连接的创建过程较为耗时。耗时意味着什么呢?如果您创建一个连接并使用它,您可能不会注意到PostgreSQL需要分配出来一个连接的时间。但是,让我们考虑一下,一个典型的网站做什么。它打开一个连接,发出几个简单的语句,断开连接—即便创建一个连接不能被注意到,和所有剩下的工作相比它仍然是相当大量的工作。查找几个手机号码或者其它琐碎的信息花费多久?因此,在一个连接的生命周期中一个连接做的工作越少,实际创建连接的时间就变得越重要。

pgbouncer通过把它自己置于实际数据库服务器与频繁使用的应用程序之间来解决这个问题。对于应用程序来说,pgbouncer看起来像一个PostgreSQL服务器。在pgbouncer内部会保存保存一组开放的连接,并把它们集中起来。无论应用什么时候请求一个连接,pgbouncer将给请求一个池化的连接。从某种程度上说,它的行为像一个代理。

这里的主要要点是:pgbouncer可以快速地给应用提供一个连接,因为真正的数据库连接已经在幕后存在了。另外可以观察到非常低的内存占用。用户报告一个占用空间为每个连接占用2KB。这使得pgbouncer成为一个理想的大连接池。