數據庫鏈接池php-cp介紹

php-cp(php-connect-pool)是用php擴展寫的一個數據庫鏈接池。php

咱們知道php開發速度快,適合創業快速迭代,但當流量大了以後,php大量的短鏈接給db層形成多餘的消耗,而php處理請求過程當中鏈接會一直持有再加上進程之間不能共享tcp鏈接會致使撐高mysql的鏈接,mysql的性能會隨着鏈接數的升高而急速降低,因此不少大公司都強轉java,這很大一部分緣由是php沒有鏈接池!固然你能夠用開源的數據庫中間件來緩解這個問題,可是本項目和現有的開源產品有如下幾點不一樣。
一.它不一樣於市面上其餘的開源數據庫中間件產品:html

1.它不須要單獨部署中間件集羣,是跑在應用服務器上的代理進程,減小了一層外部依賴,這樣使得架構更加簡單、清爽、可靠。java

2.性能更高,減小了一次網絡傳輸,它經過高效的ipc方式和php進程通訊,而且避免了協議解析的消耗。mysql

3.同時支持redis和mysql,不須要部署2套單獨的中間件系統。
二.簡單原理圖:linux

數據庫鏈接池php-cp介紹redis


三。 技術特性sql

1.支持最大最小鏈接數配置。數據庫

2.支持壓力小自動回收鏈接(力度和頻率可配置)。後端

3.支持平滑重啓。服務器

4.支持鏈接用光的排隊機制。

5.同時支持mysql和redis。

6.使用簡單,框架簡單整合後(修改new 方法),現有業務一行代碼都不用改便可用上鍊接池。

7.提供了get_disable_list函數,來得到不可用的宕機ip列表,這樣負載均衡也能夠作在客戶端(配置文件所有的ip和宕機ip作差集,而後再隨機便可)。

btw:你也能夠用lvs,可是lvs轉發在系統架構上引入了依賴,dr模式不能跨網段又限制了擴容,並且後端db出問題只能知道lvs的vip。

8.鏈接池進程會啓動ping進程來監聽宕機列表,若是可用會反映到get_disable_list函數的返回值上.

9.作了大量優化,雖然請求通過鏈接池進程轉發,可是基本無qps損耗。
四.使用它

1.把pool.ini文件放到 /etc/ 並按需修改裏面的配置。

2.啓動代理進程

./pool_server start

支持 "start" "stop" "restart" "reload"命令

3.修改php腳本

$db = new PDO(xxxxx);

修改爲 $db = new pdo_connect_pool(xxxx);//dont use persistent

$redis = new Redis();

修改爲 $redis = new redis_connect_pool();//dont use pconnect

提示:儘早調用$db/$redis->release() 來釋放這個進程佔用的鏈接到池子裏面;
五.API

get_disable_list($pdo_config,CP_DEFAULT_PDO_PORT);

get_disable_list($redis_conf,CP_DEFAULT_REDIS_PORT);

- 第一個參數是你的配置文件.

- 若是配置文件變了,不可用列表將會被清空

- 返回失效的數據庫ip.
六.壓力測試:

1.帶有鏈接池:

php腳本以下:

$obj = new pdo_connect_pool('mysql:host=192.168.20.130;dbname=test1',"admin","admin");

$stmt = $obj->query("show tables");

$data = $stmt->fetchAll();

var_dump($data);

$obj->release();

30s完成的請求數:

數據庫鏈接池php-cp介紹 完成了大概19w次請求

mysql服務器cpu佔用:

數據庫鏈接池php-cp介紹mysql服務器消耗52%的cpu

2.短鏈接壓測,不帶鏈接池

php腳本以下:

$obj = new PDO('mysql:host=192.168.20.130;dbname=test1',"admin","admin");

$stmt = $obj->query("show tables");

$data = $stmt->fetchAll();

var_dump($data);

30S完成請求:

數據庫鏈接池php-cp介紹 完成了大概12w次請求

mysql服務器cpu佔用:

數據庫鏈接池php-cp介紹 cpu佔用大概122%

可見鏈接池雖然通過請求轉發,可是減小了創建和釋放tcp的時間,總的QPS有大幅提高,同時對mysql服務器的負載有大幅下降。

以上壓測機器爲debian,4core機器。
七.安裝:

phpize=>./configure=>make install=>echo "extensions=xx/connect_pool.so">php.ini

須要:

PHP 5.3 +(no zts)

linux 2.6+

而且已經安裝了pdo和redis擴展

原文地址:http://blog.sina.com.cn/s/blog_9eaa0f400102v9fd.html

相關文章
相關標籤/搜索