当前位置: 首页 > 工具软件 > SMProxy > 使用案例 >

支持连接池和读写分离的轻量级中间件SMProxy

严升
2023-12-01

Swoole MySQL Proxy

一个基于 MySQL 协议,Swoole 开发的支持连接池和读写分离的轻量级MySQL数据库连接池中间件。

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

安装

git clone https://github.com/louislivi/SMProxy.git
composer install --no-dev # 如果你想贡献你的代码,请不要使用 --no-dev 参数

配置

配置文件位于 smproxy/conf 目录中,其中大写 ROOT 代表当前 SMProxy 根目录

database.json

{
  "database": {
    "account": {
      "自定义用户名": {
        "user": "必选,数据库账户",
        "password": "必选,数据库密码"
      },
      "...": "必选1个,自定义用户名 与serverInfo中的account相对应"
    },
    "serverInfo": {
      "自定义数据库连接信息": {
        "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个,数据库名称 多个数据库配置多个"
    }
  }
}

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"
    }
  }
}

运行

需要给予 bin/SMProxy 执行权限。

  SMProxy [ start | stop | restart | status | reload ] [ -c | --config <configuration_path> | --console | -f | --force ]
  SMProxy -h | --help
  SMProxy -v | --version

start 运行服务
stop 停止服务
restart 重启服务
status 查询服务运行状态
reload 平滑重启
-h --help 帮助
-v --version 查看当前服务版本
-c --config 设置配置项目录
–console 前台运行(SMProxy>=1.2.5)
-f --force 强制执行(SMProxy>=1.3.0)

总结

  1. SMProxy采用协程调度实现线程池,有效解决数据库瓶颈。如果只是读写分离,解决数据库连接瓶颈,用smproxy也足够了,入门快上手简单
  2. 相比于mycat,SMProxy 更简单不会实现各种表的本片(分库分表)数据整合等功能,但我认为这种简单更纯粹,根据业务取舍即可

转自https://smproxy.louislivi.com/

 类似资料: