數據庫連接池php-cp介紹

jopen 9年前發布 | 152K 次閱讀 php-cp 數據庫連接池

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

        我們知道php開發速度快,適合創業快速迭代,但當流量大了之后,php大量的短連接給db層造成多余的消耗,而php處理請求過程中連接會一直持有再加上進程之間不能共享tcp連接會導致撐高mysql的連接,mysql的性能會隨著連接數的升高而急速下降,所以很多大公司都強轉java,這很大一部分原因是php沒有連接池!當然你可以用開源的數據庫中間件來緩解這個問題,但是本項目和現有的開源產品有以下幾點不同。

一.它不同于市面上其他的開源數據庫中間件產品:

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

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

3.同時支持redis和mysql,不需要部署2套單獨的中間件系統。

二.簡單原理圖:

數據庫連接池php-cp介紹

               

三。 技術特性

 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!