当前位置: 首页 > 后端技术 > PHP

SMProxy,让你的项目数据库操作快三倍!

时间:2023-03-30 05:57:02 PHP

SMProxyGITHUB:https://github.com/louislivi/...SwooleMySQLProxy是Swoole基于MySQL协议开发的MySQL数据库连接池。其原理是将数据库连接作为对象存储在内存中。当用户需要访问数据库时,会第一次建立连接。不是建立新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用后,用户并没有关闭连接,而是将连接放回连接池中,以供下一次请求访问。连接的建立和断开由连接池自己管理。同时,还可以通过设置连接池的参数来控制连接池的初始连接数、连接数上下限、每个连接的最大使用次数、最大空闲时间等。连接池。还可以通过自身的管理机制监控数据库连接数、使用情况等。如果超过最大连接数,协程会被挂起,关闭一个连接后协程会继续运行。特性支持读写分离支持数据库连接池,有效解决PHP带来的数据库连接瓶颈支持SQL92标准采用协程调度支持多数据库连接,多数据库,多用户,灵活搭配遵守MySQL原生协议,跨语言,跨平台通用中间件代理支持MySQL事务支持HandshakeV10协议版本完美兼容MySQL4.1-8.0兼容各大框架,无缝提升性能设计初衷是PHP没有连接池,所以数据库会高并发时充满连接,Mycat等数据库中间件会出现一些SQL无法使用的情况,比如不支持批量添加等,过于臃肿。所以我写了这个只支持连接池和读写分离的轻量级中间件。使用Swoole协程调度HandshakeV10协议转发,使程序更加稳定。它不需要像Mycat那样解析所有的SQL包,增加了复杂度。环境Swoole2.1+PHP7.0+安装(推荐)直接下载最新发布版本的PHAR文件,解压使用:https://github.com/louislivi/...或者使用Git切换任意版本:gitclonehttps://github.com/louislivi/smproxy.gitcomposerinstall--no-dev#如果你想贡献你的代码,请不要使用--no-dev参数。Run需要给bin/SMProxy执行权限。SMProxy[开始|停止|重启|状态|重新加载][-c|--config<配置路径>]SMProxy-h|--helpSMProxy-v|--versionOptions:startrunservicestopservicerestartrestartrestartservicestatusqueryserviceRunningstatusreload平滑重启-h--helpHelp-v--version查看当前服务版本-c--config设置配置项目录SMProxy连接test测试SMProxy和测试MySQL完全一样,MySQL怎么连接,SMProxy就怎么连接。建议先用命令行测试:(不要用MYSQL8.0客户端连接测试)mysql-uroot-p123456-P3366-h127.0.0.1也可以用工具连接。PHP7.2.6withnoframeworkuseless:0.15148401260376,used:0.040808916091919unusedconnectionpool:0.15148401260376usedconnectionspool:0.040808916091919ThinkPHP5.0unusedconnectionpool:used连接池:usedconnectionpool:usedconnectionspool:Laravel5.7连接池:使用连接池:请参考实际压测、根数据量、网络环境、数据库配置。在测试中,因为超过了最大连接数,协程会被挂起。等到连接关闭,然后恢复协程以继续。ExchangeQQ群:722124111配置文件配置文件位于smproxy/conf目录下,其中大写ROOT代表当前SMProxy根目录。database.json{"database":{"account":{"自定义用户名":{"user":"必填,数据库账号","password":"必填,数据库密码"},"...":"必选一个,自定义用户名对应serverInfo中的账号"},"serverInfo":{"自定义数据库连接信息":{"write":{"host":"必填,用[]表示多个writelibraryaddresses","port":"必填,写库端口","timeout":"必填,写库连接超时时间(秒)","account":"必填,自定义用户名对应账户中自定义用户名"},"read":{"host":"可选,多个读库地址用[]表示","port":"可选,读库端口","timeout":"可选,读库连接超时时间(秒)","account":"可选,自定义用户名对应account中的自定义用户名"}},"...":"必选,自定义数据库连接信息对应serverInfoindatabases,读库不可配置"},"databases":{"数据库名":{"serverInfo":"必填,自定义数据库连接信息对应serverInfo中的自定义数据库连接信息","maxConns":"必填,库服务最大连接数,支持计算","maxSpareConns":"必填,库服务最大空闲连接数,支持计算","startConns":"可选,库服务默认启动连接数,支持计算","maxSpareExp":"可选,库服务空闲连接数的最大空闲时间(秒),默认为0,支持计算","charset":"可选,库的编码格式"},"...":"必选一个,数据库名多个,数据库配置多个"}}}maxConns,maxSpareConns,startConns是建议设置为server.json中swoole_cpu_num()*N个读库配置的worker_num的倍数,写库目前使用随机访问连接。建议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端口,default3366如果需要多个用`,`分隔","mode":"可选,SMProxy运行模式,SWOOLE_PROCESS多进程模式(默认),SWOOLE_BASE基本模式","sock_type":"可选,sock类型,SWOOLE_SOCK_TCPtcp","logs":{"open":"必填,日志开关,trueonfalseoff","config":{"system":{"log_path":"必填,SMProxy系统日志目录","log_file":"必填,SMProxy系统日志文件名","format":"必填,SMProxy系统日志目录日期格式"},"mysql":{"log_path":"必填,SMProxyMySQL日志目录","log_file":"必填,SMProxyMySQL日志文件名","格式":"必填,SMProxyMySQL日志目录日期格式"}}},"swoole":{"worker_num":"必填,SWOOLEworker进程数,支持计算","max_coro_num":"必填,SWOOLE协程数,建议不小于3000","pid_file":"必填,worker进程和manager进程pid目录","open_tcp_nodelay":"可选,关闭Nagle合并算法","daemonize":"可选,daemonize,true为守护进程,false关闭守护进程","heartbeat_check_interval":"可选,心跳检测","heartbeat_idle_time":"可选,心跳检测最大空闲时间","reload_async":"可选,异步重启,true开启异步重启,false关闭异步重启","log_file":"可选,SWOOLElogdirectory"},"swoole_client_setting":{"package_max_length":"可选,SWOOLEClient最大包长度,默认16777216MySQL最大支持包长度"},"swoole_client_sock_setting":{"sock_type":"可选,SWOOLEClientsock类型,默认tcp只支持tcp"}}}user,password,port,host为SMProxy的账号|密码|端口|地址(非Mysql数据库账号|密码|端口|地址)可自由设置SMProxy登录验证例如默认配置登录为mysql-uroot-p123456-P3366-h127.0.0.1SMProxy登录成功MySQLCOMMIT会提示Serverversion:5.6.0-SMProxyworker_num推荐使用swoole_cpu_num()或swoole_cpu_num()*NMySQL8.0SMProxy1.2.4以上可以直接使用SMProxy1.2.4及以下需要做兼容性处理MySQL-8.0默认使用使用更安全的caching_sha2_password插件。如果从5.x升级到其他版本,MySQL的所有功能都可以直接使用。如果是新的MySQL,需要进入MySQL命令行,进行如下操作才能兼容:ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'password';刷新权限;将语句中的'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/