SMProxy,讓你的資料庫操作快三倍!
阿新 • • 發佈:2018-11-16
SMProxy
GITHUB:https://github.com/louislivi/smproxy
喜歡請star
swoole msyql proxy 一個基於mysql協議,swoole 開發的mysql資料庫連線池
資料庫連線池
資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;
釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。
這項技術能明顯提高對資料庫操作的效能。
特性
- 支援讀寫分離
- 支援資料庫連線池,能夠有效解決PHP帶來的資料庫連線瓶頸
- 支援SQL92標準
- 遵守Mysql原生協議,跨語言,跨平臺的通用中介軟體代理。
- 支援多個數據庫連線,多個數據庫,多個使用者,靈活搭配。
- 支援mysql事物
- 採用協程排程
- 支援 HandshakeV10 協議版本
完美相容mysql5.6-5.7
設計初衷
php沒有連線池,所以高併發時資料庫會出現連線打滿的情況,
mycat等資料庫中介軟體會出現部分sql無法使用,例如不支援批量新增等,而且過於臃腫。
所以就自己編寫了這個僅支援連線池和讀寫分離的輕量級中介軟體,
使用swoole協程排程HandshakeV10協議轉發使程式更加穩定不用像mycat一樣解析所有sql包體,增加複雜度。環境
- swoole 2.1+
php 7.0+
安裝
下載的檔案直接解壓即可。
執行
- bin/server start : 執行服務
- bin/server stop : 停止服務
- bin/server restart : 重啟服務
- bin/server status : 查詢服務執行狀態
- bin/server reload : 平滑重啟
bin/server -h : 幫助
SMProxy連線測試
測試SMProxy與測試mysql完全一致,mysql怎麼連線,SMProxy就怎麼連線。
推薦先採用命令列測試:
mysql -uroot -p123456 -P3366 -h127.0.0.1
也可採用工具連線。
測試
$start = microtime(true);
print_r(Db::query('select * from account limit 1'));
print_r(microtime(true)-$start);
未使用SMProxy連線池執行:
0.17314600944519
使用SMProxy連線池執行:
0.073625087738037
配置檔案:
ROOT 當前SMProxy跟目錄
database.json
{
"database": {
"account": {
"root": {
"user": "root",
"password": "123456"
}
},
"serverInfo": {
"server1": {
"write": {
"host": "127.0.0.1",
"port": 3306,
"timeout": 0.5,
"flag": 0,
"account": "root"
},
"read": {
"host": "127.0.0.1",
"port": 3306,
"timeout": 0.5,
"flag": 0,
"account": "root"
}
}
},
"databases": {
"db1": {
"serverInfo": "server1",
"maxSpareConns": 10,
"maxConns": 20,
"charset": "utf-8"
}
}
}
}
account 賬號資訊 | serverInfo 服務資訊 | databases 資料庫連線池資訊 |
---|---|---|
account.root 使用者標識 與 serverInfo...account.root 對應 | serverInfo.server1 服務標識 與 databases..serverInfo 對應 | databases.db1 資料庫名稱 |
account..user 使用者名稱 | serverInfo..write 讀寫分離 write 寫庫 read 讀庫 | databases..serverInfo 服務資訊 |
account..password 密碼 | serverInfo..host 資料庫連線地址 | databases..maxSpareConns 最大空閒連線數 |
serverInfo..prot 資料庫埠 | databases..maxConns 最大連線數 | |
serverInfo..timeout 資料庫超時時長(秒) | databases..charset 資料庫編碼格式 | |
serverInfo..flag TCP型別目前支援0阻塞 不支援1.非阻塞 | ||
serverInfo..account 與 databases.account 對應 |
server.json
{
"server": {
"user":"root",
"password":"123456",
"charset":"utf8mb4",
"host": "0.0.0.0",
"port": "3366",
"mode": 3,
"sock_type": 1,
"logs": {
"open":true,
"config": {
"system": {
"log_path": "/var/www/swoole/swoole-mysql-proxy/logs",
"log_file": "system.log",
"format": "Y/m/d"
},
"mysql": {
"log_path": "/var/www/swoole/swoole-mysql-proxy/logs",
"log_file": "mysql.log",
"format": "Y/m/d"
}
}
},
"swoole": {
"worker_num": 2,
"max_coro_num": 16000,
"open_tcp_nodelay": true,
"daemonize": 0,
"heartbeat_check_interval": 60,
"heartbeat_idle_time": 600,
"reload_async": true,
"log_file": "/var/www/swoole/swoole-mysql-proxy/logs/error.log",
"pid_file": "/var/www/swoole/swoole-mysql-proxy/logs/pid/server.pid"
},
"swoole_client_setting": {
"package_max_length": 16777216
},
"swoole_client_sock_setting": {
"sock_type": 1,
"sync_type": 1
}
}
}
user 服務使用者名稱 | password 服務密碼 | charset 服務編碼 | host 連結地址 | port 服務埠 多個以,隔開 | mode | sock_type 1 tcp | logs 日誌配置 | swoole swoole配置 | swoole_client_setting 客戶端配置 | swoole_client_sock_setting 客戶端sock配置 |
---|---|---|---|---|---|---|---|---|---|---|
logs.open 日誌開關 | worker_num work程序數量 | package_max_length 最大包長 | sock_type 1.tcp | |||||||
logs.config 日誌配置項 | max_coro_num 最大攜程數 | sync_type 1.非同步 | ||||||||
logs.system or mysql 配置模組 | open_tcp_nodelay 關閉Nagle合併演算法 | |||||||||
logs..log_path 日誌目錄 | daemonize 守護程序化 | |||||||||
logs..log_file 日誌檔名 | heartbeat_check_interval 心跳檢測 | |||||||||
logs..format 日誌日期格式 | heartbeat_idle_time 最大空閒時間 | |||||||||
reload_async 非同步重啟 | ||||||||||
log_file 日誌目錄 | ||||||||||
pid_file 主程序pid目錄 |
其他學習資料
- mysql協議分析 :https://www.cnblogs.com/davygeek/p/5647175.html
- mysql官方協議文件 :https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake
- mycat原始碼 :https://github.com/MyCATApache/Mycat-Server
- swoole :https://www.swoole.com/