SMProxy
GITHUB:https://github.com/louislivi/...
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/davyg...
- mysql官方協議文檔 :https://dev.mysql.com/doc/int...::Handshake
- mycat源碼 :https://github.com/MyCATApach...
- swoole :https://www.swoole.com/