php+sqlrelay+mysql实现连接池及读写负载均衡

本文主要介绍sqlrelay的配置安装。通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接。

什么是sqlrelay?

Sqlrelay是一个开源的数据库连接池软件。它可以预建立数据库连接,同时可作为数据库连接代理和负载均衡器使用。


SQL Relay is a persistent database connection pooling, proxying and load balancing system for Unix and Linux.


Sqlrelay项目主页 http://sqlrelay.sourceforge.net/
Sqlrelay源码下载 http://sqlrelay.sourceforge.net/download.html

Sqlrelay原理示意:

连接池示意图:

负载均衡示意图:

1、 sqlrelay的安装

下载源代码(因为不能yum或者apt-get)
#wget http://prdownloads.sourceforge.net/sqlrelay/sqlrelay-0.41.tar.gz?download
解压缩
#tar –zxvf sqlrelay-0.41.tar.gz
配置
#cd sqlrelay-0.41
#./configure –prefix=/opt/sqlrelay –with-mysql-prefix=/opt/mysql-5.0.22 –with-php-prefix=/opt/php-5.2.6 –disable-python
注释:因为我用的python版本跟sqlrelay版本稍有纠结,所以显式得去声明不增加python下的api。
为啥我软件编译目标路径是/opt,我也不知道,也许第一次看见某人这么做的,我也就一直这么做。大家别问了,没啥道理,其实编译到 /shit 下边,也不影响正常的运行。
查看编译好的文件:
#cd /opt/sqlrelay
#ls
Bin etc include lib share var
如果出现下列目录,安装“基本完毕”。
2、 sqlrelay的配置
sqlrelay有个问题,如果指定了prefix,而$prefix/bin/目录如果不在环境变量中,则主进程运行是有问题的。因为,编译完后,我们在/etc/profile中增加一条命令:
PATH=$PATH:/opt/sqlrelay/bin #此目录就是你prefix的目录

配置文件:


< ?xml version=”1.0″?>
< !DOCTYPE instances SYSTEM “sqlrelay.dtd”>
<instances>
<instance id=”mysqlpool” port=”9002″ socket=”/tmp/sqlrelay.socket” dbase=”mysql” connections=”20″ maxconnections=”50″ maxqueuelength=”5″ growby=”1″ ttl=”60″ maxsessioncount=”10″ endofsession=”commit” sessiontimeout=”600″ runasuser=”nobody” runasgroup=”nobody” cursors=”5″ authtier=”listener” handoff=”pass” deniedips=”" allowedips=”" debug=”none” maxquerysize=”65536″ maxstringbindvaluelength=”4000″ maxlobbindvaluelength=”71680″ idleclienttimeout=”-1″ maxlisteners=”-1″ listenertimeout=”0″ reloginatstart=”no” timequeriessec=”-1″ timequeriesusec=”-1″>
</instance>
</instances>

这样,就配置了一个id为mysqlpool的连接池。
Port=9002 sqlrelay提供服务的端口是 9002
Dbase=mysql 要连接mysql
Connections=20 起始创建20个连接
Maxconnections=50 最大连接数 50
其他参数可以自己琢磨,在具体应用中还需要修改后边的参数,都啥含义,看字面或者看手册皆可。

启动sqlrelay:
#./sqlr-start –id mysqlpool //启动刚才定义的id为mysqlpool的连接池
关闭sqlrelay
#./sqlr-stop

3、 sqlrelayPHP api的配置

sqlrelay 的PHP api扩展在编译的时候已经生成,在php的./lib/php/extensions/no-debug-non-zts-20060613/ 目录下,修改php.ini中extension_dir的值:extension_dir=”/opt/php-5.2.6/lib/php /extensions/no-debug-non-zts-20060613/”
而后增加引用声明:extension=sql_relay.so

重启php,执行 php –m 查看是否有 sql_relay 如果有,则证明配置成功。

4、sqlrelay的使用

$con=sqlrcon_alloc(“mysqlpool”,9002,””,”root”,”123456”,0,1);
Var_dump($con);

这样,利用sqlrelay的phpapi,就可以跟mysql建立链接。


下面是我之前搜集的资料,是上面的资料的补充。

一、SQL Relay是什么?

SQL Relay是一个开源的数据库池连接代理服务器

二、SQL Relay支持哪些数据库?

* Oracle
* MySQL
* mSQL
* PostgreSQL
* Sybase
* MS SQL Server
* IBM DB2
* Interbase
* Sybase
* SQLite
* Lago
* ODBC
* MS Access

三、安装和配置;

不说废话了,开始安装SQL Relay,到 http://sqlrelay.sourceforge.net/ 去下载相应的软件
安装SQL Relay需要先安装Rudiments, 在 http://sqlrelay.sourceforge.net/download.html 可以找到

1、安装Rudiments:

# tar vxzf rudiments-0.28.2.tar.gz
# cd rudiments-0.28.2
# ./configure –prefix=/usr/local/rudiments
# make
# make install

至此,rudiments安装结束

2、安装SQL Relay:

# tar vxzf sqlrelay-0.36.4.tar.gz
# cd sqlrelay-0.36.4
# ./configure –prefix=/usr/local/sqlrelay –with-rudiments-prefix=/usr/local/rudiments –with-mysql-prefix=MySQL安装路径 –with-freetds-prefix=FreeTDS安装路径 –with-oracle-home=Oracle安装路径 –with-php-prefix=PHP安装路径
# make

 

# make install

安装结束,以上编译参数根据个人需要来设定,因为我同时需要Oracle SQLserver MySQL,所以才加了这么多参数的

3、设置PHP:

修改php.ini
extension_dir = “./”

把以上内容修改为:
extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922″

根据PHP安装的路径来修改,并不是每个版本的PHP都是这个路径
在php.ini中添加如下内容
extension=sql_relay.so

接下来,介绍SQL Relay如何连接SQL Server
修改FreeTDS的配置文件freetds.conf
加入如下内容:
[msde]
host = 172.16.20.203
port =1433
tds version = 8.0
client charset = GB2312

请根据个人需求来修改

4、修改SQL Relay的配置文件

# cd /usr/local/sqlrelay/etc
# cp sqlrelay.conf.example sqlrelay.conf

把sqlrelay.conf的内容改为:
<?xml version=”1.0″?>
<!DOCTYPE instances SYSTEM “sqlrelay.dtd”>
<instances>
<instance id=”msdetest” port=”9000″ socket=”/tmp/msdetest.socket” dbase=”freetds” connections=”5″ maxconnections=”10″ maxqueuelength=”0″ growby=”1″ ttl=”60″ endofsession=”commit” sessiontimeout=”5″ runasuser=”nobody” runasgroup=”nobody” cursors=”5″ authtier=”listener” handoff=”pass”>
<users>
<user user=”sa” password=”sa”/>
</users>
<connections>
<connection connectionid=”msdetest” string=”server=msde;db=pubs;user=sa;password=sa;” metric=”1″/>
</connections>
</instance>
</instances>

四、启动SQL Relay,并测试;

1、启动 SQL Relay

# export PATH=$PATH:/usr/local/sqlrelay/bin
# sqlr-start -id msdetest

2、使用SQL工具:

# sqlrsh -id msdetest

可以直接输入SQL语句

停止SQL Relay:
# sqlr-stop msdetest

3、测试PHP:

写一个PHP文件,内容如下:
<?
$con=sqlrcon_alloc(“msdetest”,9000,”/tmp/msdetest.socket”,”sa”,”sa”,0,1);
$cur=sqlrcur_alloc($con);

 

sqlrcur_sendQuery($cur,”select * from t_gifts”);
for ($row=0; $row<sqlrcur_rowCount($cur); $row++) {
for ($col=0; $col<sqlrcur_colCount($cur); $col++) {
echo sqlrcur_getField($cur,$row,$col);
echo “,”;
}
echo “<br>\n”;
}
sqlrcur_free($cur);
sqlrcon_free($con);
?>

posted @ 2014-02-10 13:54  孤火  阅读(1658)  评论(2编辑  收藏  举报