Swoole MySQL Proxy
SMProxy文档地址
一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。
原理
将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。
同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。
特性
支持读写分离
支持数据库连接池,能够有效解决 PHP 带来的数据库连接瓶颈
支持 SQL92 标准
采用协程调度
支持多个数据库连接,多个数据库,多个用户,灵活搭配
遵守 MySQL 原生协议,跨语言,跨平台的通用中间件代理
支持 MySQL 事务
支持 HandshakeV10 协议版本
完美兼容 MySQL5.5 - 8.0
兼容各大框架,无缝提升性能
环境要求:
PHP 7.0+
SWOOLE 2.1.3+
SMProxy
Laravel
MySQL
安装
1、安装swoole
pecl install swoole
2、安装 SMProxy
(推荐)直接下载最新发行版的 PHAR 文件,解压即用:
https://github.com/louislivi/SMProxy/releases/latest
或者使用 Git 切换任意版本:
git clone https://github.com/louislivi/SMProxy.git
composer install --no-dev # 如果你想贡献你的代码,请不要使用 --no-dev 参数。
我是使用的推荐方式,下载压缩包,并解压,放到你服务器的任意位置,我是放到我的所有软件包一起
配置
1、配置database.json
配置文件位于 smproxy/conf 目录中,其中大写 ROOT 代表当前 SMProxy 根目录。
{
"database": {
"account": {
"crown": { //自定义用户名,随便取,只需要跟下面serverInfo中的account相对应即可
"user": "root",//mysql数据库用户名
"password": "Kmrgs2019"//mysql数据库密码
}
},
"serverInfo": {
"server1": { //自定义数据库连接信息,随便取,只需要跟下面databases中的serverInfo相对应,read读库可不配置
"write": {//写库
"host": ["39.97.187.5"],//写库地址 多个用[]表示
"port": 3306,//写库端口
"timeout": 2,//写库连接超时时间(秒)
"account": "crown"//跟上面自定义的用户名一致
},
"read": {//读库,没有可删掉read列 或填写与写库数据一致内容
"host": ["39.97.187.5"],
"port": 3306,
"timeout": 2,
"account": "crown",
"startConns": "swoole_cpu_num()*10",
"maxSpareConns": "swoole_cpu_num()*10",
"maxSpareExp": 3600,
"maxConns": "swoole_cpu_num()*20"
}
}
},
"databases": {
"crown": {//数据库别名
"databaseName":"crown", //可选,指定真实链接数据库名称(默认不指定与别名相同)
"serverInfo": "server1",//自定义数据库连接信息 与serverInfo中的自定义数据库连接信息相对应
"startConns": "swoole_cpu_num()*2",
"maxSpareConns": "swoole_cpu_num()*2",
"maxSpareExp": 3600,
"maxConns": "swoole_cpu_num()*2",
"charset": "utf8mb4"
}
}
}
}
注意注释项,是需要自己修改的,其他的参数意思可查看SMProxy文档
2、配置server.json
配置文件位于 smproxy/conf 目录中,其中大写 ROOT 代表当前 SMProxy 根目录。
{
"server": {
"user": "smp_root",//SMProxy服务用户,自己随便取,只需后面项目中配置一致即可
"password": "smp_root",//SMProxy服务密码,同上
"charset": "utf8mb4",
"host": "0.0.0.0",//SMProxy地址,默认0.0.0.0
"port": "3366",//SMProxy端口,默认3366 如需多个以`,`隔开
"mode": "SWOOLE_PROCESS",
"sock_type": "SWOOLE_SOCK_TCP",
"logs": {
"open":true,
"config": {
"system": {
"log_path": "ROOT/logs",
"log_file": "system.log",
"format": "Y/m/d"
},
"mysql": {
"log_path": "ROOT/logs",
"log_file": "mysql.log",
"format": "Y/m/d"
}
}
},
"swoole": {
"worker_num": "swoole_cpu_num()",
"max_coro_num": 6000,
"open_tcp_nodelay": true,
"daemonize": true,
"heartbeat_check_interval": 60,
"heartbeat_idle_time": 600,
"reload_async": true,
"log_file": "ROOT/logs/swoole.log",
"pid_file": "ROOT/logs/pid/server.pid"
},
"swoole_client_setting": {
"package_max_length": 16777215
},
"swoole_client_sock_setting": {
"sock_type": "SWOOLE_SOCK_TCP"
}
}
}
启动 SMProxy 服务(SMProxy [ start | stop | restart | status | reload ])
./SMProxy start
3、在项目中如何进行配置
Laravel框架.env文件
DB_CONNECTION=mysql
DB_HOST=0.0.0.0 //server.json中配置的host
DB_PORT=3366 //server.json中配置的port
DB_DATABASE=crown //databse.json中配置的数据库名称
DB_USERNAME=smp_root //server.json中配置的user
DB_PASSWORD=smp_root //server.json中配置的password
其他框架配置查看SMProxy文档
MySQL8.0
SMProxy1.2.4及以上可直接使用
SMProxy1.2.4以下需要做兼容处理
测试 Laravel 是否能够正常连接数据库(随便写一个查询数据库接口即可测试链接是否正确)
出现错误请检查 SMProxy 日志,日志文件路径在server.json中配置,如果没有改动与conf目录同级