数据库连接池
数据库连接池的概念对于任何有开发经验的人来说都是并不陌生,其数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
对于数据库连接池的运用,几乎每种编程语言都是拥有自己的连接池组件,比如java就具有多种开源的数据库连接池。本章要介绍的是基于oneproxy的数据库连接池,简单的去理解这个数据库连接池从代码的编写工作中剥离出来,对用户以及开发者都可以是透明的。下面将重点介绍oneproxy实现的透明连接池的优势。
传统编码式连接池
采用编程式的数据库连接池的劣势:
1.并不是所有编程语言都有像java那样的优秀的连接池组件,但是对于部分语言,比如PHP,这种十分流行的编程语言却在连接池的编写效果上非常一般。
2.对于一个庞大复杂的系统,是经常需要用多种编程语言去实现多种功能模块,那么问题就来了,这会导致数据库连接池无法共享而导致维护成本的增加。
3.就算是开发语言的统一,但一旦服务器上部署上千个应用实例,那么同样会给后端数据库带来巨大的负担
4.另外,也是必要重要的一点,系统不会是一成不变的,当一旦决定要在业务上做扩展,那么就要涉及到代码的改动,那么将会不能避免去改动连接池这块的代码,将大大增加扩容的难度
oneproxy的数据库连接池的优势就在于能解决以上所有的问题。接下来先对实验这种连接池的功能。
在OneProxy里配置好“proxy-master-addresses”参数,启动OneProxy的命令如下:
[root@ANYSQLSRV1
oneproxy]# cat start.sh
#/bin/bash
#
PHP One
Proxy OneSQL
if [ -e
"/usr/local/oneproxy/log/oneproxy.pid" ]
then
kill -INT $(cat
/usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
/usr/local/oneproxy/oneproxy
--proxy-address=0.0.0.0:3307 \
--proxy-master-addresses=192.168.42.145:3306
\
--proxy-user-list=test:A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
\
--proxy-database=test
--proxy-charset=utf8_general_ci \
--log-file=/usr/local/oneproxy/log/oneproxy.log
\
--pid-file=/usr/local/oneproxy/log/oneproxy.pid
然后用MySQL客户端,或者PHP页面去做测试,如下所示:
这里使用mydbtest进行测试,下载地址
编辑测试脚本,在下面的测试文件中,提定测试程序连接池OneProxy的端口地址,两次请求之间等待100ms。
option
user
yfy/123@192.168.42.140:3307:default
time
1m
log
/dev/null
wait
1000
declare
id1
int 200000 400000
begin
select * from t where id = :id1;
end
启动256个并发进行压力测试
./mydbtest_linux64.bin query=test.sql
degree=256
这个时候登陆到后端MYSQL会发现实际上只有不到20个session
mysql> show processlist;
+------+------+----------------------+-------------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id| User | Host|
db| Command| Time | State| Info|
+------+------+----------------------+-------------+-------------+------+-----------------------------------------------------------------------+------------------+
|1 | repl | 192.168.42.143:32785 | NULL| Binlog Dump | 6496 | Master has sent
all binlog to slave; waiting for binlog to be updated | NULL|
| 2559 | yfy| 192.168.42.140:56221 | NULL| Sleep|1 || NULL|
| 2639 | yfy| 192.168.42.140:60844 | fieldworker |
Sleep|24 ||
NULL|
| 2640 | yfy| 192.168.42.140:32897 | fieldworker |
Sleep|24 || NULL|
| 2641 | yfy| 192.168.42.140:32898 | fieldworker |
Query|0 | init| show processlist |
| 2642 | yfy| 192.168.42.140:32899 | fieldworker |
Sleep|25 || NULL|
| 2643 | yfy| 192.168.42.140:32925 | fieldworker |
Sleep|24 || NULL|
| 2644 | yfy| 192.168.42.140:32926 | fieldworker |
Sleep|24 || NULL|
| 2645 | yfy| 192.168.42.140:32927 | fieldworker |
Sleep|24 || NULL|
| 2646 | yfy| 192.168.42.140:32953 | fieldworker |
Sleep|24 || NULL|
| 2647 | yfy| 192.168.42.140:32954 | fieldworker | Sleep|24 || NULL|
| 2648 | yfy| 192.168.42.140:32980 | fieldworker |
Sleep|25 || NULL|
| 2649 | yfy| 192.168.42.140:33028 | fieldworker |
Sleep|24 || NULL|
| 2650 | yfy| 192.168.42.140:33058 | fieldworker |
Sleep|24 ||
NULL|
| 2651 | yfy| 192.168.42.140:33105 | fieldworker |
Sleep|25 || NULL|
| 2652 | yfy| 192.168.42.140:33160 | fieldworker |
Sleep|24 || NULL|
| 2653 | yfy| 192.168.42.140:33311 | fieldworker |
Sleep|64 ||
NULL|
| 2654 | yfy| 192.168.42.140:33312 | fieldworker |
Sleep|64 || NULL|
| 2655 | yfy| 192.168.42.140:33313 | fieldworker |
Sleep|24 || NULL|
| 2656 | yfy| 192.168.42.140:33314 | fieldworker |
Sleep|24 || NULL|
| 2657 | yfy| 192.168.42.140:33315 | fieldworker |
Sleep|24 || NULL|
+------+------+----------------------+-------------+-------------+------+-----------------------------------------------------------------------+------------------+
21 rows in set (0.00 sec)
总结:oneproxy脱离应用代码和后端数据库可以独立部署提供数据连接池,而对于应用来说的透明程度就可以看成一台mysql服务器,不管前端应有采用什么语言,怎样的系统架构都是共享的一个数据库连接池。OneProxy对于闲置超过两分钟的连接会自动回收,不过目前可以对于连接池的可控性并没有那么完善。