GITHUB:https://github.com/louislivi/...php
一个基于 MySQL 协议,Swoole 开发的MySQL数据库链接池。html
将数据库链接做为对象存储在内存中,当用户须要访问数据库时,首次会创建链接,后面并不是创建一个新的链接,而是从链接池中取出一个已创建的空闲链接对象。
使用完毕后,用户也并不是将链接关闭,而是将链接放回链接池中,以供下一个请求访问使用。而链接的创建、断开都由链接池自身来管理。node
同时,还能够经过设置链接池的参数来控制链接池中的初始链接数、链接的上下限数以及每一个链接的最大使用次数、最大空闲时间等等。
也能够经过其自身的管理机制来监视数据库链接的数量、使用状况等。超出最大链接数会采用协程挂起,等到有链接关闭再恢复协程继续操做。mysql
PHP 没有链接池,因此高并发时数据库会出现链接打满的状况,Mycat 等数据库中间件会出现部分 SQL 没法使用,例如不支持批量添加等,并且过于臃肿。
因此就本身编写了这个仅支持链接池和读写分离的轻量级中间件,使用 Swoole 协程调度 HandshakeV10 协议转发使程序更加稳定,不用像 Mycat 同样解析全部 SQL 包体,增长复杂度。git
(推荐)直接下载最新发行版的 PHAR 文件,解压即用:github
https://github.com/louislivi/...算法
或者使用 Git 切换任意版本:sql
git clone https://github.com/louislivi/smproxy.git composer install --no-dev # 若是你想贡献你的代码,请不要使用 --no-dev 参数。
须要给予 bin/SMProxy 执行权限。数据库
SMProxy [ start | stop | restart | status | reload ] [ -c | --config <configuration_path> ] SMProxy -h | --help SMProxy -v | --version
Options:json
测试SMProxy与测试MySQL彻底一致,MySQL怎么链接,SMProxy就怎么链接。
推荐先采用命令行测试:
(请勿使用MYSQL8.0客户端连接测试)
mysql -uroot -p123456 -P3366 -h127.0.0.1
也可采用工具链接。
没用:0.15148401260376,用了:0.040808916091919
未使用链接池: 0.15148401260376
使用链接池: 0.040808916091919
未使用链接池:
使用链接池:
未使用链接池:
使用链接池:
未使用链接池:
使用链接池:
请以实际压测为准,根数据量,网络环境,数据库配置有关。
测试中因超出最大链接数会采用协程挂起 等到有链接关闭再恢复协程继续操做,
全部并发量与配置文件maxConns设置的不合适,会致使比原连接慢,主要是为了控制链接数。
QQ群:722124111
smproxy/conf
目录中,其中大写 ROOT
表明当前 SMProxy 根目录。{ "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": { "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
SMProxy1.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