由于PHP 沒有Mysql連接池的概念蹄皱,所以當(dāng)并發(fā)高的時(shí)候,常常會(huì)造成Mysql阻塞等現(xiàn)象。而SMProxy可以幫我們緩減這個(gè)問(wèn)題屁使。下面先簡(jiǎn)單介紹一下SMProxy:
簡(jiǎn)介:
SMProxy 的全稱是 Swoole MySQL Proxy减细,是一個(gè)基于 Swoole 開發(fā)的 MySQL 數(shù)據(jù)庫(kù)連接池匆瓜。官方鏈接
原理:
將數(shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí)未蝌,首次會(huì)建立連接驮吱,后面并非建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對(duì)象萧吠。 使用完畢后左冬,用戶也并非將連接關(guān)閉,而是將連接放回連接池中纸型,以供下一個(gè)請(qǐng)求訪問(wèn)使用拇砰。而連接的建立、斷開都由連接池自身來(lái)管理狰腌。同時(shí)除破,還可以通過(guò)設(shè)置連接池的參數(shù)來(lái)控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個(gè)連接的最大使用次數(shù)琼腔、最大空閑時(shí)間等等瑰枫。 也可以通過(guò)其自身的管理機(jī)制來(lái)監(jiān)視數(shù)據(jù)庫(kù)連接的數(shù)量、使用情況等丹莲。超出最大連接數(shù)會(huì)采用協(xié)程掛起光坝,等到有連接關(guān)閉再恢復(fù)協(xié)程繼續(xù)操作。
特性:
1.支持讀寫分離
2.支持?jǐn)?shù)據(jù)庫(kù)連接池甥材,能夠有效解決 PHP 帶來(lái)的數(shù)據(jù)庫(kù)連接瓶頸
3.支持 SQL92 標(biāo)準(zhǔn)
4.采用協(xié)程調(diào)度
5.支持多個(gè)數(shù)據(jù)庫(kù)連接盯另,多個(gè)數(shù)據(jù)庫(kù),多個(gè)用戶洲赵,靈活搭配
6.遵守 MySQL 原生協(xié)議鸳惯,跨語(yǔ)言,跨平臺(tái)的通用中間件代理
7.支持 MySQL 事物
8.支持 HandshakeV10 協(xié)議版本
9.完美兼容 MySQL4.1 - 8.0
10.兼容各大框架板鬓,無(wú)縫提升性能
安裝:
swoole
版本必須大于等于2.1.3
,php
版本必須大于等于7.0
方式一:通過(guò)git
悲敷,git clone https://github.com/louislivi/smproxy.git
,克隆之后用composer
安裝依賴俭令,composer install --no-dev
后德,如果想要給官方提交代碼,請(qǐng)去掉--no-dev
參數(shù)
方式二:直接下載壓縮包抄腔,解壓使用,點(diǎn)此鏈接,然后選擇smproxy.tar.gz
或者smproy.zip
點(diǎn)擊下載瓢湃,解壓
運(yùn)行:
進(jìn)入bin
目錄理张,然后運(yùn)行./SMProxy -v
,出現(xiàn)版本信息則說(shuō)明成功
配置:
找到conf
目錄,里面有兩個(gè)文件绵患,一個(gè)是database.json
和server.json
雾叭,這兩個(gè)文件,一個(gè)是設(shè)置我們的連接池信息落蝙,一個(gè)是設(shè)置我們的服務(wù)信息
database.json
{
"database": {
"account": {
"root": "自定義用戶名"{
"user": "必選织狐,數(shù)據(jù)庫(kù)賬戶",
"password": "必選,數(shù)據(jù)庫(kù)密碼"
},
"...": "必選1個(gè)筏勒,自定義用戶名 與serverInfo中的account相對(duì)應(yīng)"
},
"serverInfo": {
"server1": "自定義數(shù)據(jù)庫(kù)連接信息" {
"write": {
"host": "必選移迫,寫庫(kù)地址 多個(gè)用[]表示",
"port": "必選,寫庫(kù)端口",
"timeout": "必選管行,寫庫(kù)連接超時(shí)時(shí)間(秒)",
"account": "必選厨埋,自定義用戶名 與 account中的自定義用戶名相對(duì)應(yīng)",
"maxConns": "重載,對(duì)應(yīng)databases",
"maxSpareConns": "重載捐顷,對(duì)應(yīng)databases",
"startConns": "重載荡陷,對(duì)應(yīng)databases",
"maxSpareExp": "重載,對(duì)應(yīng)databases"
},
"read": {
"host": "可選迅涮,讀庫(kù)地址 多個(gè)用[]表示",
"port": "可選废赞,讀庫(kù)端口",
"timeout": "可選,讀庫(kù)連接超時(shí)時(shí)間(秒)",
"account": "可選逗柴,自定義用戶名 與 account中的自定義用戶名相對(duì)應(yīng)",
"maxConns": "重載蛹头,對(duì)應(yīng)databases",
"maxSpareConns": "重載,對(duì)應(yīng)databases",
"startConns": "重載戏溺,對(duì)應(yīng)databases",
"maxSpareExp": "重載,對(duì)應(yīng)databases"
}
},
"...": "必選1個(gè)屠尊,自定義數(shù)據(jù)庫(kù)連接信息 與databases中的serverInfo相對(duì)應(yīng),read讀庫(kù)可不配置"
},
"databases": {
"數(shù)據(jù)庫(kù)別名": {
"databaseName": "可選旷祸,指定真實(shí)鏈接數(shù)據(jù)庫(kù)名稱(默認(rèn)不指定與別名相同)",
"serverInfo": "必選,自定義數(shù)據(jù)庫(kù)連接信息 與serverInfo中的自定義數(shù)據(jù)庫(kù)連接信息相對(duì)應(yīng)",
"maxConns": "必選讼昆,該庫(kù)服務(wù)最大連接數(shù)托享,支持計(jì)算",
"maxSpareConns": "必選,該庫(kù)服務(wù)最大空閑連接數(shù)浸赫,支持計(jì)算",
"startConns": "可選闰围,該庫(kù)服務(wù)默認(rèn)啟動(dòng)連接數(shù),支持計(jì)算",
"maxSpareExp": "可選既峡,該庫(kù)服務(wù)空閑連接數(shù)最大空閑時(shí)間(秒)羡榴,默認(rèn)為0,支持計(jì)算",
"charset": "可選运敢,該庫(kù)編碼格式"
},
"...": "必選1個(gè)校仑,數(shù)據(jù)庫(kù)名稱 多個(gè)數(shù)據(jù)庫(kù)配置多個(gè)"
}
}
}
具體的例子忠售,可以參照database.json.example
參數(shù)說(shuō)明:
參數(shù)名稱 | 參數(shù)描述 |
---|---|
maxSpareExp | 活動(dòng)連接的最大空閑時(shí)間,單位為秒 超過(guò)此時(shí)間的連接會(huì)被釋放到連接池中,針對(duì)未被關(guān)閉的活動(dòng)連接。 |
maxSpareConns | 連接池中最多可空閑maxConns個(gè)連接 迄沫,這里取值為20稻扬,表示即使沒有數(shù)據(jù)庫(kù)連接時(shí)依然可以保持20空閑的連接,而不被清除羊瘩,隨時(shí)處于待命狀態(tài)泰佳。 |
maxConns | 連接池支持的最大連接數(shù),這里取值為20尘吗,表示同時(shí)最多有20個(gè)數(shù)據(jù)庫(kù)連接逝她。一般把maxConns設(shè)置成可能的并發(fā)量就行了。 |
startConns | 初始化連接數(shù)目,服務(wù)啟動(dòng)時(shí)生成連接數(shù)摇予。 |
server.json
{
"server": {
"user": "必選汽绢,SMProxy服務(wù)用戶",
"password": "必選,SMProxy服務(wù)密碼",
"charset": "可選侧戴,SMProxy編碼宁昭,默認(rèn)utf8mb4",
"host": "可選,SMProxy地址酗宋,默認(rèn)0.0.0.0",
"port": "可選积仗,SMProxy端口,默認(rèn)3366 如需多個(gè)以`,`隔開",
"mode": "可選蜕猫,SMProxy運(yùn)行模式寂曹,SWOOLE_PROCESS多進(jìn)程模式(默認(rèn)),SWOOLE_BASE基本模式",
"sock_type": "可選回右,sock類型隆圆,SWOOLE_SOCK_TCP tcp",
"logs": {
"open":"必選,日志開關(guān)翔烁,true 開 false 關(guān)",
"config": {
"system": {
"log_path": "必選渺氧,SMProxy系統(tǒng)日志目錄",
"log_file": "必選,SMProxy系統(tǒng)日志文件名",
"format": "必選蹬屹,SMProxy系統(tǒng)日志目錄日期格式"
},
"mysql": {
"log_path": "必選侣背,SMProxyMySQL日志目錄",
"log_file": "必選,SMProxyMySQL日志文件名",
"format": "必選慨默,SMProxyMySQL日志目錄日期格式"
}
}
},
"swoole": {
"worker_num": "必選贩耐,SWOOLE worker進(jìn)程數(shù),支持計(jì)算",
"max_coro_num": "必選厦取,SWOOLE 協(xié)程數(shù)潮太,推薦不低于3000",
"pid_file": "必選,worker進(jìn)程和manager進(jìn)程pid目錄",
"open_tcp_nodelay": "可選蒜胖,關(guān)閉Nagle合并算法",
"daemonize": "可選消别,守護(hù)進(jìn)程化抛蚤,true 為守護(hù)進(jìn)程 false 關(guān)閉守護(hù)進(jìn)程",
"heartbeat_check_interval": "可選,心跳檢測(cè)",
"heartbeat_idle_time": "可選寻狂,心跳檢測(cè)最大空閑時(shí)間",
"reload_async": "可選岁经,異步重啟,true 開啟異步重啟 false 關(guān)閉異步重啟",
"log_file": "可選蛇券,SWOOLE日志目錄"
},
"swoole_client_setting": {
"package_max_length": "可選缀壤,SWOOLE Client 最大包長(zhǎng),默認(rèn)16777216MySQL最大支持包長(zhǎng)"
},
"swoole_client_sock_setting": {
"sock_type": "可選纠亚,SWOOLE Client sock 類型塘慕,默認(rèn)tcp 僅支持tcp"
}
}
}
具體的例子,可以參照server.json.example
laravel蒂胞、lumen配置:
#.env文件
DB_CONNECTION=mysql
DB_HOST=server.json中配置的host
DB_PORT=server.json中配置的port
DB_DATABASE=databse.json中配置的數(shù)據(jù)庫(kù)名稱
DB_USERNAME=server.json中配置的user
DB_PASSWORD=server.json中配置的password
THINKPHP配置:
#database.php
'type' => 'mysql',
// 服務(wù)器地址
'hostname' => 'server.json中配置的host',
// 數(shù)據(jù)庫(kù)名
'database' => 'databse.json中配置的數(shù)據(jù)庫(kù)名稱',
// 用戶名
'username' => 'server.json中配置的user',
// 密碼
'password' => 'server.json中配置的password',
// 端口
'hostport' => 'server.json中配置的port',
附:SMProxy
命令:
命令參數(shù) | 命令描述 |
---|---|
start | 運(yùn)行服務(wù) |
stop | 停止服務(wù) |
restart | 重啟服務(wù) |
status | 查看運(yùn)行狀態(tài) |
reload | 重載配置 |
-h --help | 幫助信息 |
-v --version | 版本信息 |
-c --config | 設(shè)置配置項(xiàng)目錄 |
--console | 前臺(tái)運(yùn)行(SMProxy>=1.2.5 |
-f --force | 強(qiáng)制執(zhí)行(SMProxy>=1.3.0) |
都配置好了以后图呢,如果訪問(wèn)出現(xiàn)1044問(wèn)題,就是我們的數(shù)據(jù)庫(kù)賬號(hào)權(quán)限問(wèn)題了骗随,只需要重新賦予權(quán)限蛤织,其他問(wèn)題可以查看SMProxy
的日志