摘要:一個基于協議,開發的數據庫連接池。也可以通過其自身的管理機制來監視數據庫連接的數量使用情況等。超出最大連接數會采用協程掛起,等到有連接關閉再恢復協程繼續操作。
SMProxy
GITHUB:https://github.com/louislivi/...
Swoole MySQL Proxy一個基于 MySQL 協議,Swoole 開發的MySQL數據庫連接池。
原理將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,首次會建立連接,后面并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。
使用完畢后,用戶也并非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。
同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閑時間等等。
也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。超出最大連接數會采用協程掛起,等到有連接關閉再恢復協程繼續操作。
支持讀寫分離
支持數據庫連接池,能夠有效解決 PHP 帶來的數據庫連接瓶頸
支持 SQL92 標準
采用協程調度
支持多個數據庫連接,多個數據庫,多個用戶,靈活搭配
遵守 MySQL 原生協議,跨語言,跨平臺的通用中間件代理
支持 MySQL 事務
支持 HandshakeV10 協議版本
完美兼容 MySQL4.1 - 8.0
兼容各大框架,無縫提升性能
設計初衷PHP 沒有連接池,所以高并發時數據庫會出現連接打滿的情況,Mycat 等數據庫中間件會出現部分 SQL 無法使用,例如不支持批量添加等,而且過于臃腫。
所以就自己編寫了這個僅支持連接池和讀寫分離的輕量級中間件,使用 Swoole 協程調度 HandshakeV10 協議轉發使程序更加穩定,不用像 Mycat 一樣解析所有 SQL 包體,增加復雜度。
Swoole 2.1+
PHP 7.0+
安裝(推薦)直接下載最新發行版的 PHAR 文件,解壓即用:
https://github.com/louislivi/...
或者使用 Git 切換任意版本:
git clone https://github.com/louislivi/smproxy.git composer install --no-dev # 如果你想貢獻你的代碼,請不要使用 --no-dev 參數。運行
需要給予 bin/SMProxy 執行權限。
SMProxy [ start | stop | restart | status | reload ] [ -c | --config] SMProxy -h | --help SMProxy -v | --version
Options:
start 運行服務
stop 停止服務
restart 重啟服務
status 查詢服務運行狀態
reload 平滑重啟
-h --help 幫助
-v --version 查看當前服務版本
-c --config
測試SMProxy與測試MySQL完全一致,MySQL怎么連接,SMProxy就怎么連接。
推薦先采用命令行測試:
(請勿使用MYSQL8.0客戶端鏈接測試)
mysql -uroot -p123456 -P3366 -h127.0.0.1
也可采用工具連接。
沒用框架的 PHP 7.2.6沒用:0.15148401260376,用了:0.040808916091919
未使用連接池: 0.15148401260376
使用連接池: 0.040808916091919
ThinkPHP 5.0未使用連接池:
使用連接池:
Laravel 5.7未使用連接池:
使用連接池:
MySQL 連接數未使用連接池:
使用連接池:
請以實際壓測為準,根數據量,網絡環境,數據庫配置有關。
測試中因超出最大連接數會采用協程掛起 等到有連接關閉再恢復協程繼續操作,
所有并發量與配置文件maxConns設置的不合適,會導致比原鏈接慢,主要是為了控制連接數。
QQ群:722124111
配置文件配置文件位于 smproxy/conf 目錄中,其中大寫 ROOT 代表當前 SMProxy 根目錄。
database.json{ "database": { "account": { "自定義用戶名": { "user": "必選,數據庫賬戶", "password": "必選,數據庫密碼" }, "...": "必選1個,自定義用戶名 與serverInfo中的account相對應" }, "serverInfo": { "自定義數據庫連接信息": { "write": { "host": "必選,寫庫地址 多個用[]表示", "port": "必選,寫庫端口", "timeout": "必選,寫庫連接超時時間(秒)", "account": "必選,自定義用戶名 與 account中的自定義用戶名相對應" }, "read": { "host": "可選,讀庫地址 多個用[]表示", "port": "可選,讀庫端口", "timeout": "可選,讀庫連接超時時間(秒)", "account": "可選,自定義用戶名 與 account中的自定義用戶名相對應" } }, "...": "必選1個,自定義數據庫連接信息 與databases中的serverInfo相對應,read讀庫可不配置" }, "databases": { "數據庫名稱": { "serverInfo": "必選,自定義數據庫連接信息 與serverInfo中的自定義數據庫連接信息相對應", "maxConns": "必選,該庫服務最大連接數,支持計算", "maxSpareConns": "必選,該庫服務最大空閑連接數,支持計算", "startConns": "可選,該庫服務默認啟動連接數,支持計算", "maxSpareExp": "可選,該庫服務空閑連接數最大空閑時間(秒),默認為0,支持計算", "charset": "可選,該庫編碼格式" }, "...": "必選1個,數據庫名稱 多個數據庫配置多個" } } }
maxConns,maxSpareConns,startConns
推薦設置為server.json中配置的worker_num的倍數swoole_cpu_num()*N
多個讀庫,寫庫
目前采取的是隨機獲取連接,推薦將maxConns,startConns,startConns至少設置為max(讀庫,寫庫)*worker_num 的1倍以上
server.json{ "server": { "user": "必選,SMProxy服務用戶", "password": "必選,SMProxy服務密碼", "charset": "可選,SMProxy編碼,默認utf8mb4", "host": "可選,SMProxy地址,默認0.0.0.0", "port": "可選,SMProxy端口,默認3366 如需多個以`,`隔開", "mode": "可選,SMProxy運行模式,SWOOLE_PROCESS多進程模式(默認),SWOOLE_BASE基本模式", "sock_type": "可選,sock類型,SWOOLE_SOCK_TCP tcp", "logs": { "open":"必選,日志開關,true 開 false 關", "config": { "system": { "log_path": "必選,SMProxy系統日志目錄", "log_file": "必選,SMProxy系統日志文件名", "format": "必選,SMProxy系統日志目錄日期格式" }, "mysql": { "log_path": "必選,SMProxyMySQL日志目錄", "log_file": "必選,SMProxyMySQL日志文件名", "format": "必選,SMProxyMySQL日志目錄日期格式" } } }, "swoole": { "worker_num": "必選,SWOOLE worker進程數,支持計算", "max_coro_num": "必選,SWOOLE 協程數,推薦不低于3000", "pid_file": "必選,worker進程和manager進程pid目錄", "open_tcp_nodelay": "可選,關閉Nagle合并算法", "daemonize": "可選,守護進程化,true 為守護進程 false 關閉守護進程", "heartbeat_check_interval": "可選,心跳檢測", "heartbeat_idle_time": "可選,心跳檢測最大空閑時間", "reload_async": "可選,異步重啟,true 開啟異步重啟 false 關閉異步重啟", "log_file": "可選,SWOOLE日志目錄" }, "swoole_client_setting": { "package_max_length": "可選,SWOOLE Client 最大包長,默認16777216MySQL最大支持包長" }, "swoole_client_sock_setting": { "sock_type": "可選,SWOOLE Client sock 類型,默認tcp 僅支持tcp" } } }
user,password,port,host
為SMProxy的賬戶|密碼|端口|地址(非Mysql數據庫賬戶|密碼|端口|地址)
可隨意設置用于SMProxy登錄驗證
例如默認配置登錄為mysql -uroot -p123456 -P 3366 -h 127.0.0.1
SMProxy登錄成功MySQL COMMIT會提示Server version: 5.6.0-SMProxy
worker_num
推薦使用swoole_cpu_num() 或 swoole_cpu_num()*N
MySQL8.0SMProxy1.2.4及以上可直接使用
SMProxy1.2.4以下需要做兼容處理
MySQL-8.0默認使用了安全性更強的caching_sha2_password插件,其他版本如果是從5.x升級上來的, 可以直接使用所有MySQL功能, 如是新建的MySQL, 需要進入MySQL命令行執行以下操作來兼容:
ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "password"; flush privileges;
將語句中的 "root"@"%" 替換成你所使用的用戶, password 替換成其密碼.
如仍無法使用, 應在my.cnf中設置 default_authentication_plugin = mysql_native_password
其他學習資料MySQL協議分析 :https://www.cnblogs.com/davyg...
MySQL官方協議文檔 :https://dev.MySQL.com/doc/int...
Mycat源碼 :https://github.com/MyCATApach...
Swoole :https://www.swoole.com/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29661.html
閱讀 765·2019-08-29 16:32
閱讀 836·2019-08-29 12:31
閱讀 3208·2019-08-26 18:26
閱讀 3152·2019-08-26 12:20
閱讀 1728·2019-08-26 12:00
閱讀 3006·2019-08-26 10:58
閱讀 2811·2019-08-23 17:08
閱讀 2309·2019-08-23 16:32