美文网首页
SMProxy加速laravel/lumen/tp等项目

SMProxy加速laravel/lumen/tp等项目

作者: 阳光下丶憧憬 | 来源:发表于2020-07-22 16:17 被阅读0次
    由于PHP 没有Mysql连接池的概念,所以当并发高的时候,常常会造成Mysql阻塞等现象。而SMProxy可以帮我们缓减这个问题。下面先简单介绍一下SMProxy:

    简介:

    SMProxy 的全称是 Swoole MySQL Proxy,是一个基于 Swoole 开发的 MySQL 数据库连接池。官方链接

    原理:

    将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。

    特性:

    1.支持读写分离
    2.支持数据库连接池,能够有效解决 PHP 带来的数据库连接瓶颈
    3.支持 SQL92 标准
    4.采用协程调度
    5.支持多个数据库连接,多个数据库,多个用户,灵活搭配
    6.遵守 MySQL 原生协议,跨语言,跨平台的通用中间件代理
    7.支持 MySQL 事物
    8.支持 HandshakeV10 协议版本
    9.完美兼容 MySQL4.1 - 8.0
    10.兼容各大框架,无缝提升性能

    安装:

    swoole版本必须大于等于2.1.3,php版本必须大于等于7.0
    方式一:通过gitgit clone https://github.com/louislivi/smproxy.git,克隆之后用composer安装依赖,composer install --no-dev,如果想要给官方提交代码,请去掉--no-dev参数
    方式二:直接下载压缩包,解压使用,点此链接,然后选择smproxy.tar.gz或者smproy.zip点击下载,解压

    运行:

    进入bin目录,然后运行./SMProxy -v,出现版本信息则说明成功

    配置:

    找到conf目录,里面有两个文件,一个是database.jsonserver.json,这两个文件,一个是设置我们的连接池信息,一个是设置我们的服务信息

    database.json
    {
      "database": {
        "account": {
          "root": "自定义用户名"{
            "user": "必选,数据库账户",
            "password": "必选,数据库密码"
          },
          "...": "必选1个,自定义用户名 与serverInfo中的account相对应"
        },
        "serverInfo": {
         "server1": "自定义数据库连接信息" {
            "write": {
              "host": "必选,写库地址 多个用[]表示",
              "port": "必选,写库端口",
              "timeout": "必选,写库连接超时时间(秒)",
              "account": "必选,自定义用户名 与 account中的自定义用户名相对应",
              "maxConns": "重载,对应databases",
              "maxSpareConns": "重载,对应databases",
              "startConns": "重载,对应databases",
              "maxSpareExp": "重载,对应databases"
            },
            "read": {
              "host": "可选,读库地址 多个用[]表示",
              "port": "可选,读库端口",
              "timeout": "可选,读库连接超时时间(秒)",
              "account": "可选,自定义用户名 与 account中的自定义用户名相对应",
              "maxConns": "重载,对应databases",
              "maxSpareConns": "重载,对应databases",
              "startConns": "重载,对应databases",
              "maxSpareExp": "重载,对应databases"
            }
          },
          "...": "必选1个,自定义数据库连接信息 与databases中的serverInfo相对应,read读库可不配置"
        },
        "databases": {
          "数据库别名": {
            "databaseName": "可选,指定真实链接数据库名称(默认不指定与别名相同)",
            "serverInfo": "必选,自定义数据库连接信息 与serverInfo中的自定义数据库连接信息相对应",
            "maxConns": "必选,该库服务最大连接数,支持计算",
            "maxSpareConns": "必选,该库服务最大空闲连接数,支持计算",
            "startConns": "可选,该库服务默认启动连接数,支持计算",
            "maxSpareExp": "可选,该库服务空闲连接数最大空闲时间(秒),默认为0,支持计算",
            "charset": "可选,该库编码格式"
          },
          "...": "必选1个,数据库名称 多个数据库配置多个"
        }
      }
    }
    

    具体的例子,可以参照database.json.example
    参数说明:

    参数名称 参数描述
    maxSpareExp 活动连接的最大空闲时间,单位为秒 超过此时间的连接会被释放到连接池中,针对未被关闭的活动连接。
    maxSpareConns 连接池中最多可空闲maxConns个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。
    maxConns 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接。一般把maxConns设置成可能的并发量就行了。
    startConns 初始化连接数目,服务启动时生成连接数。
    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"
        }
      }
    }
    

    具体的例子,可以参照server.json.example

    laravel、lumen配置:
    #.env文件
    DB_CONNECTION=mysql
    DB_HOST=server.json中配置的host
    DB_PORT=server.json中配置的port
    DB_DATABASE=databse.json中配置的数据库名称
    DB_USERNAME=server.json中配置的user
    DB_PASSWORD=server.json中配置的password
    
    
    THINKPHP配置:
    #database.php
    'type' => 'mysql',
    // 服务器地址
    'hostname' => 'server.json中配置的host',
    // 数据库名
    'database' => 'databse.json中配置的数据库名称',
    // 用户名
    'username' => 'server.json中配置的user',
    // 密码
    'password' => 'server.json中配置的password',
    // 端口
    'hostport' => 'server.json中配置的port',
    

    附:SMProxy命令:

    命令参数 命令描述
    start 运行服务
    stop 停止服务
    restart 重启服务
    status 查看运行状态
    reload 重载配置
    -h --help 帮助信息
    -v --version 版本信息
    -c --config 设置配置项目录
    --console 前台运行(SMProxy>=1.2.5
    -f --force 强制执行(SMProxy>=1.3.0)

    都配置好了以后,如果访问出现1044问题,就是我们的数据库账号权限问题了,只需要重新赋予权限,其他问题可以查看SMProxy的日志

    相关文章

      网友评论

          本文标题:SMProxy加速laravel/lumen/tp等项目

          本文链接:https://www.haomeiwen.com/subject/nrqtlktx.html