GITHUB:https://github.com/louislivi/smproxy
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
这项技术能明显提高对数据库操作的性能。
php 没有连接池,所以高并发时数据库会出现连接打满的情况,
mycat 等数据库中间件会出现部分 sql 无法使用,例如不支持批量添加等,而且过于臃肿。
所以就自己编写了这个仅支持连接池和读写分离的轻量级中间件,
使用 swoole 协程调度 HandshakeV10 协议转发使程序更加稳定不用像 mycat 一样解析所有 sql 包体,增加复杂度。
下载的文件直接解压即可。
测试 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);
0.17314600944519
0.073625087738037
ROOT 当前 SMProxy 跟目录
{
"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": {
"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 目录 | | |
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.