1. 程式人生 > >SMProxy,讓你的資料庫操作快三倍!

SMProxy,讓你的資料庫操作快三倍!

SMProxy

GITHUB:https://github.com/louislivi/smproxy

喜歡請star

swoole msyql proxy 一個基於mysql協議,swoole 開發的mysql資料庫連線池

資料庫連線池

資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;
釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。
這項技術能明顯提高對資料庫操作的效能。 

特性

  • 支援讀寫分離
  • 支援資料庫連線池,能夠有效解決PHP帶來的資料庫連線瓶頸
  • 支援SQL92標準
  • 遵守Mysql原生協議,跨語言,跨平臺的通用中介軟體代理。
  • 支援多個數據庫連線,多個數據庫,多個使用者,靈活搭配。
  • 支援mysql事物
  • 採用協程排程
  • 支援 HandshakeV10 協議版本
  • 完美相容mysql5.6-5.7

    設計初衷

    php沒有連線池,所以高併發時資料庫會出現連線打滿的情況,
    mycat等資料庫中介軟體會出現部分sql無法使用,例如不支援批量新增等,而且過於臃腫。
    所以就自己編寫了這個僅支援連線池和讀寫分離的輕量級中介軟體,
    使用swoole協程排程HandshakeV10協議轉發使程式更加穩定不用像mycat一樣解析所有sql包體,增加複雜度。

    環境

  • swoole 2.1+
  • php 7.0+

    安裝

    下載的檔案直接解壓即可。

    執行

  • bin/server start : 執行服務
  • bin/server stop : 停止服務
  • bin/server restart : 重啟服務
  • bin/server status : 查詢服務執行狀態
  • bin/server reload : 平滑重啟
  • bin/server -h : 幫助

    SMProxy連線測試

    測試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);

未使用SMProxy連線池執行:

0.17314600944519

使用SMProxy連線池執行:

0.073625087738037

配置檔案:

ROOT 當前SMProxy跟目錄

database.json

{
  "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.json

{
  "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目錄

其他學習資料