PgBouncer简述

来源:互联网 发布:淘宝空间在哪里 编辑:程序博客网 时间:2024/05/16 15:10

PgBouncer是为PostgreSQL数据库提供的一个轻量级的连接池工具。

为什么需要数据库连接池呢?

1、我们知道PostgreSQL是进程模式的数据库,每次应用程序连接数据库的时候,PostgreSQL主进程都会fork一个服务进程来为应用程序服务 ,在关闭连接后,PostgreSQL会自动释放掉这个进程。这种方式对于不频繁且连接持有时间较长的生产场景来说,效果是比较好的。但是对于存在大量短连接场景。如果频繁的创建和销毁服务进程,那么会消耗掉比较多的资源。这时我们就需要一个连接池来将后端PostgreSQL数据库的连接缓存住,在应用程序有新的连接请求过来的时候,连接池工具会将连接池中的一个空闲连接分配给应用程序,应用程序断开后连接会重新放回连接池中,而不需要创建和销毁新的连接,从而降低资源的消耗。

2、理论上,如果后台进程数与服务器的cpu核数相同的时候,cpu的利用率是最高的,因为cpu不需要再多个进程间进行频繁的切换。但限制数据库的连接数与cpu的核数相同是不现实的。一般来说,连接数会设置为cpu核数的4倍,如果超过4倍,cpu的利用率会大大的下降。然而即使限制连接数是cpu核数的4倍,对于很多应用来说仍然不够。这时候,连接池的作用就体现出来了,PGBouncer是线程模式,并且允许前端创建多个连接,把前端连接聚合到适量的后端数据库连接上。

此外,使用PGBouncer还有一些其它原因,比如:

可以对客户端连接进行限制,预防过多的连接或恶意的连接请求。

PGBouncer使用libevent进行socket通信,通信方式效率更高。

PGBouncer的每个连接仅消耗2KB内存,资源消耗少。


PGBouncer的连接池模式共有三种,分别是会话级、事物级、语句级。

会话级:即session级别连接。客户端会一直持有这个连接,直到客户端断开连接,才会将连接放回连接池中。

事务级别:Transaction级别。客户端的每个事物结束后,数据库连接都会释放回连接池总,新的事物再从连接池中获取新的连接。

语句级:statement级别。每执行完一个SQL语句,连接都会释放回连接池中,再次执行SQL语句,需要再次从连接池中获取新的连接。这种模式意味着客户端强制“autocommit”模式。


需注意的是,如果应用中使用了PostgreSQL的二阶段提交(prepare statement)、绑定变量那么必须使用session级别模式,因为如果使用trasaction或者statement模式,server pool复用时创建的prepared name可能已经被分配给其它的客户端或者已经不存在了。

1 0
原创粉丝点击