数据库连接池:SMProxy+Laravel

数据库连接池:SMProxy+Laravel

需求环境:

swoole 2.1.3+
php 7.0+

本机环境:

Laravel 5.7
smproxy 1.3.1
mysql 5.7.26
swoole 4.1.1
php 7.1.30

Swoole Mysql Proxy
一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。

文档:https://smproxy.louislivi.com
或者:https://smproxy.gitee.louislivi.com/
https://xueyuanjun.com/post/9681

代码:https://github.com/louislivi/SMProxy

原理
将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。

同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。

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

设计初衷
PHP 没有连接池,所以高并发时数据库会出现连接打满的情况,Mycat 等数据库中间件会出现部分 SQL 无法使用,例如不支持批量添加等,而且过于臃肿。 所以就自己编写了这个仅支持连接池和读写分离的轻量级中间件,使用 Swoole 协程调度 HandshakeV10 协议转发使程序更加稳定,不用像 Mycat 一样解析所有 SQL 包体,增加复杂度。

下载源码

git clone https://github.com/louislivi/SMProxy.git
composer install --no-dev

如果不想看源码,,可直接下载phar包

wget https://github.com/louislivi/SMProxy/releases/download/v1.3.1/smproxy.tar.gz
tar -xf smproxy.tar.gz

本例采用git方式下载

首先编辑 conf/server.json

修改 user 和 password 即可

{
  "server": {
    "user": "raoxiaoya", // 外部程序连接smproxy的账户
    "password": "raoxiaoya", // 外部程序连接smproxy的密码
    "charset": "utf8mb4",
    "host": "0.0.0.0",
    "port": "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"
    }
  }
}

编辑数据库配置 conf/database.conf

{
  "database": {
    "account": {
      "root": { // 数据库的连接账户
        "user": "root",
        "password": "Rxy123**"
      }
    },
    "serverInfo": {
      "server1": {
        "write": {
          "host": ["127.0.0.1"],
          "port": 3306,
          "timeout": 2,
          "account": "root"
        },
        "read": {
          "host": ["127.0.0.1"],
          "port": 3306,
          "timeout": 2,
          "account": "root",
          "startConns": "swoole_cpu_num()*10",
          "maxSpareConns": "swoole_cpu_num()*10",
          "maxSpareExp": 3600,
          "maxConns": "swoole_cpu_num()*20"
        }
      }
    },
    "databases": {
      "data": {
        "serverInfo": "server1",
        "startConns": "swoole_cpu_num()*2",
        "maxSpareConns": "swoole_cpu_num()*2",
        "maxSpareExp": 3600,
        "maxConns": "swoole_cpu_num()*2",
        "charset": "utf8mb4"
      }
    }
  }
}

启动服务

./bin/SMProxy start
./bin/SMProxy status

发现启动失败,查看日志mysql.log

2020-02-12 14:16:59 [warning] query timeout (phar:///mydata/data/smproxy/SMProxy/src/SMProxyServer.php:319)

查看mysqld.log

2020-02-13T12:47:43.001610Z 1100 [Note] Got an error reading communication packets

查看当前连接的客户端ip和连接数

select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;

是的,启动失败了!!

根据日志判断,是连接数据库失败了。应该是软件版本问题,因为大家都使用的好好的。mysql5.7是符合要求的,而且我的navicat可以连;SMProxy已经是最新版本了不会有问题的,php7.1.30不会有问题的;其实据我了解,swoole的各版本之间差异还是比较大的,于是尝试着安装最新版本的swoole

// 卸载swoole-4.1.1
pecl uninstall swoole

// 先打开 https://pecl.php.net/package/swoole 查看最新版本,安装
pecl install swoole-4.4.15

php -m | grep swoole

./bin/SMProxy start
./bin/SMProxy status

启动成功了。

连接测试:

mysql h127.0.0.a -P3366 -uraoxiaoya -praoxiaoya

顺利登入。

使用PHP内置web服务器:
进入laravel 根目录
php -S 0.0.0.0:8888 server.php

访问测试:
curl http://127.0.0.1:8888/info

压力测试:
ab -n 1000 -c 100 http://127.0.0.1:8888/info
1、使用了 SMProxy 的情况
使用Laravel,修改.env文件,连接SMProxy

DB_CONNECTION=mysql
DB_HOST=192.168.2.200
DB_PORT=3366
DB_DATABASE=data
DB_USERNAME=raoxiaoya
DB_PASSWORD=raoxiaoya

2、改回原来的直连mysql配置

DB_CONNECTION=mysql
DB_HOST=192.168.2.200
DB_PORT=3306
DB_DATABASE=data
DB_USERNAME=root
DB_PASSWORD=Rxy123**
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值