在大型的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>