首页 > 系统 > linux > 正文

php+sqlrelay+mysql实现连接池及读写负载均衡
2013-08-07 15:27:54 点击:

在大型的web应用中数据库经常成为并发访问的一个瓶颈,为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访...
php+sqlrelay+mysql实现连接池及读写负载均衡 - PHP程序员 - 李国华【PHP程序员C++】博客
 
在大型的web应用中数据库经常成为并发访问的一个瓶颈,为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量。
master-slave模式是为了数据同步的问题。
sqlrelay解决连接池问题以及实现读写分离的均衡负载。
sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router,负责调度应用。
php通过A还是通过B连接数据库。
在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。
一、MySQL master/slave配置
################
#mster/slave配置
################
master:192.168.1.51
slave:192.168.1.50
1、master配置
/etc/my.cnf 中加入
binlog-do-db=book book为数据库名
确保
server-id=1
log-bin=mysql-bin
授权给rep用户进行复制操作
GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';
重启master服务
2、配置slave
vi /etc/my.cnf
设置下面4行
server-id       = 2
master-host     =   192.168.1.51
master-user     =   rep
master-password =   123456
重启slave
3、把master的原始数据导入slave。
二、sqlrelay配置
当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。
sqlreplay支持的语言:
C C++ Perl  Python PHP Ruby  Java TCL Zope
sqlreplay支持的数据库:
Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server   IBM DB2 Interbase Sybase SQLite ODBC MS Access
sqlreplay的网站
http://sqlrelay.sourceforge.net/


基本思路:
1、配置2个实例用以最终处理业务
clubs-read
clubi-write
其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。
2、配置一个instance来调度读写操作,即clubr
通过router来区分读写连接不同的mysql数据库。

<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">
<instances>
        <!-- club Instance -->
        <instance id="clubs" port="9002" socket="/tmp/clubs.socket" dbase="mysql" connections="10" maxconnections="20" maxqueuelength="5" growby="1" ttl="60" 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">
                <users>
                        <user user="club" password="edb:club"/>
                </users>
                <connections>
                        <connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
                        <connection connectionid="slave50" string="host=192.168.1.50;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
                </connections>
        </instance>
        <instance id="clubi" port="9003" socket="/tmp/clubi.socket" dbase="mysql" connections="10" maxconnections="40" maxqueuelength="5" growby="1" ttl="60" 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">
                <users>
                        <user user="club" password="edb:club"/>
                </users>
                <connections>
                        <connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
                </connections>
        </instance>


相关热词搜索:php+sqlrelay+mysql 实现 连接池

上一篇:Facebook后台技术探秘
下一篇:Linux 新手必备的 10个命令