本文轉載自http://www.cnblogs.com/lchb/articles/3542744.html

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);
?>

 

arrow
arrow
    全站熱搜

    痞客興 發表在 痞客邦 留言(0) 人氣()