数据库的连接池,众所周知没有不需要的,所以对于数据库的连接池给出答案,一定是需要的。
在给出答案的同时,如果有人问你为什么要连接池,到底连接池起到什么作用,Postgresql 到底那个连接池用的不错? 如果你一时回答不了这些问题,follow me .
首先我们假设,如果我们的数据库没有连接池会怎么样?
数据库在没有任何连接池的情况下,应用程序必须直接访问数据库来建立连接。当然我们可能认为这是连接到数据库快速的方法,可是到底是这样的吗?你在打开一个和数据库直接的连接,说明本身数据库没有给你开启一个连接,而如此的情况下打开的一个连接的消耗,关闭一个连接的消耗,或者你使用加密的连接,还要有其他相关的消耗,而这样的消耗,伴随着你打开的连接越多,则消耗的就越多。尤其是互联网上的一些短连接,可能同时并发的连接多,但占用这个连接的时间很短。这就会引起另一个问题,你设置的连接数和突入起来的连接数不匹配的情况,最后就会造成拒绝连接的问题。
所以这就对数据库的连接提出一个问题,复用,连接的复用对数据库非常重要,这可以降低某些快速连接,快速断开的连接的数据库访问对数据库性能的消耗和产生的一些不必要的麻烦。
说到这里如果你是 developer 估计很快会对我下面的东西失去兴趣,因为你会说,我有连接池,每个程序的框架都有连接池,我不需要你的连接池。
really ? 你们的那些叫 Framework pooling 我今天说的是Persistent 连接与standlone 连接池。
为什么我会提出这个问题,因为一个数据库不可能仅仅接受你一个程序的连接,而一个程序必然应该有自己的连接池,但一个数据库可不仅仅为你一个应用的程序服务,所以当数据库接受多个从程序来的连接,本身对数据库的保护在哪里?
PG 在接受连接的时候,会分配出一些内存已应对连接带来的一些数据的使用的针对这个连接的内存消耗,其实别的数据库也是一样。PGA SGA 这样的概念在 PG 中也是存在的。
所以过多的连接必然会消耗PGA,导致内存出现泄露,导致一些重大的数据库性能和安全的问题。
通过软件的架构的连接池对数据库进行连接(图一)
采用软件连接池的方式对数据库进行连接(图二)
目前的主要的PostgreSQL的连接池主要有PGPOOL-II 和 PgBouncer
两种,PgBouncer. 与 PGPOOL 对比 PgBouncer 的名气要小很多,其实他的功能对比 PGPOOL 也是要精简的,那为什么推荐 PgBouncer 而不是PGPOOL,主要是PgBouncer 在连接池方面做的不比PGPOOL-II 要差,并且安装配置管理都要更为简单,配合 Repmgr 可以进行 PostgreSQL 超级高可用模式,这算是PostgreSQL 的一种高可用的解决方案。
安装是很简单的
$ ./configure --prefix=/usr/local --with-libevent=libevent-prefix
$ make
$ make install
废话不说我们先开始配置先使用起来
我们配置几点 1 2 3
1 建立一个连接当前数据库的账户
2 配置配置文件
3 配置账户文件
PgBouncer 有一个配置文件 pgbouncer.ini 还有一个用户账户文件 userlist.txt
配置的ini 文件有两块,一块是database 一块是 pgbouncer database 是配置一个连接实际数据库的认证,另一个是配置pgbouncer 监听的信息以及一些基本的配置
[databases]
test_database = host=192.168.198.123 port=5432 dbname=postgre user=admin password='password'
[pgbouncer]
listen_port = 1818
listen_addr = 192.168.198.123
auth_type = md5
auth_file = /usr/local/pgbouncer/share/doc/pgbouncer/userlist.txt
logfile = /usr/local/pgbouncer/pgbouncer.log
pidfile = /usr/local/pgbouncer/pgbouncer.pid
admin_users = admin
pool_mode = Transaction
然后我们在userlist.txt 文件中将用以连接服务器的账户和密码填入
Ok我们可以通过pgbouncer 来连接到 PG
上面启动pgbouncer
然后我们尝试,登录到数据库中
psql -h 192.168.198.123 -p 1818 -U admin test_database
在登录后,我们可以查看pgbouncer 本身的数据库,里面有一些命令是pgbouncer 独有的。
通过一些命令我们可以了解到服务器的一些配置情况
而最终的问题是,使用PGBOUNCER 到底有什么好处
1 pg现在有5个连接通过PG 连入 实体服务器
2 实体服务器现在抛出系统的连接,以及本地的连接,真正外部的连接只有4个
这说明数据库接受的连接和实际连接数据库的客户端是有出入的,实际连接的客户端的数据量要大于数据库体现的连接数据库的量,说明Pgbouncer起到了连接池的作用。