国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SMProxy,讓你的項目數據庫操作快三倍!

MartinHan / 1976人閱讀

摘要:一個基于協議,開發的數據庫連接池。也可以通過其自身的管理機制來監視數據庫連接的數量使用情況等。超出最大連接數會采用協程掛起,等到有連接關閉再恢復協程繼續操作。

SMProxy

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

Swoole MySQL Proxy

一個基于 MySQL 協議,Swoole 開發的MySQL數據庫連接池。

原理

將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,首次會建立連接,后面并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。
使用完畢后,用戶也并非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。

同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閑時間等等。
也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。超出最大連接數會采用協程掛起,等到有連接關閉再恢復協程繼續操作。

特性

支持讀寫分離

支持數據庫連接池,能夠有效解決 PHP 帶來的數據庫連接瓶頸

支持 SQL92 標準

采用協程調度

支持多個數據庫連接,多個數據庫,多個用戶,靈活搭配

遵守 MySQL 原生協議,跨語言,跨平臺的通用中間件代理

支持 MySQL 事務

支持 HandshakeV10 協議版本

完美兼容 MySQL4.1 - 8.0

兼容各大框架,無縫提升性能

設計初衷

PHP 沒有連接池,所以高并發時數據庫會出現連接打滿的情況,Mycat 等數據庫中間件會出現部分 SQL 無法使用,例如不支持批量添加等,而且過于臃腫。
所以就自己編寫了這個僅支持連接池和讀寫分離的輕量級中間件,使用 Swoole 協程調度 HandshakeV10 協議轉發使程序更加穩定,不用像 Mycat 一樣解析所有 SQL 包體,增加復雜度。

環境

Swoole 2.1+

PHP 7.0+

安裝

(推薦)直接下載最新發行版的 PHAR 文件,解壓即用:

https://github.com/louislivi/...

或者使用 Git 切換任意版本:

git clone https://github.com/louislivi/smproxy.git
composer install --no-dev # 如果你想貢獻你的代碼,請不要使用 --no-dev 參數。
運行

需要給予 bin/SMProxy 執行權限。

  SMProxy [ start | stop | restart | status | reload ] [ -c | --config  ]
  SMProxy -h | --help
  SMProxy -v | --version

Options:

start 運行服務

stop 停止服務

restart 重啟服務

status 查詢服務運行狀態

reload 平滑重啟

-h --help 幫助

-v --version 查看當前服務版本

-c --config 設置配置項目錄

SMProxy連接測試

測試SMProxy與測試MySQL完全一致,MySQL怎么連接,SMProxy就怎么連接。

推薦先采用命令行測試:
(請勿使用MYSQL8.0客戶端鏈接測試)

mysql -uroot -p123456 -P3366 -h127.0.0.1

也可采用工具連接。

沒用框架的 PHP 7.2.6

沒用:0.15148401260376,用了:0.040808916091919

未使用連接池: 0.15148401260376

使用連接池: 0.040808916091919

ThinkPHP 5.0

未使用連接池:

使用連接池:

Laravel 5.7

未使用連接池:

使用連接池:

MySQL 連接數

未使用連接池:

使用連接池:

請以實際壓測為準,根數據量,網絡環境,數據庫配置有關。
測試中因超出最大連接數會采用協程掛起 等到有連接關閉再恢復協程繼續操作,
所有并發量與配置文件maxConns設置的不合適,會導致比原鏈接慢,主要是為了控制連接數。

交流

QQ群:722124111

配置文件

配置文件位于 smproxy/conf 目錄中,其中大寫 ROOT 代表當前 SMProxy 根目錄。

database.json
{
  "database": {
    "account": {
      "自定義用戶名": {
        "user": "必選,數據庫賬戶",
        "password": "必選,數據庫密碼"
      },
      "...": "必選1個,自定義用戶名 與serverInfo中的account相對應"
    },
    "serverInfo": {
      "自定義數據庫連接信息": {
        "write": {
          "host": "必選,寫庫地址 多個用[]表示",
          "port": "必選,寫庫端口",
          "timeout": "必選,寫庫連接超時時間(秒)",
          "account": "必選,自定義用戶名 與 account中的自定義用戶名相對應"
        },
        "read": {
          "host": "可選,讀庫地址 多個用[]表示",
          "port": "可選,讀庫端口",
          "timeout": "可選,讀庫連接超時時間(秒)",
          "account": "可選,自定義用戶名 與 account中的自定義用戶名相對應"
        }
      },
      "...": "必選1個,自定義數據庫連接信息 與databases中的serverInfo相對應,read讀庫可不配置"
    },
    "databases": {
      "數據庫名稱": {
        "serverInfo": "必選,自定義數據庫連接信息 與serverInfo中的自定義數據庫連接信息相對應",
        "maxConns": "必選,該庫服務最大連接數,支持計算",
        "maxSpareConns": "必選,該庫服務最大空閑連接數,支持計算",
        "startConns": "可選,該庫服務默認啟動連接數,支持計算",
        "maxSpareExp": "可選,該庫服務空閑連接數最大空閑時間(秒),默認為0,支持計算",
        "charset": "可選,該庫編碼格式"
      },
      "...": "必選1個,數據庫名稱 多個數據庫配置多個"
    }
  }
}

maxConns,maxSpareConns,startConns

推薦設置為server.json中配置的worker_num的倍數swoole_cpu_num()*N

多個讀庫,寫庫

目前采取的是隨機獲取連接,推薦將maxConns,startConnsstartConns至少設置為max(讀庫,寫庫)*worker_num 的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"
    }
  }
}

user,password,port,host

SMProxy的賬戶|密碼|端口|地址(非Mysql數據庫賬戶|密碼|端口|地址)

可隨意設置用于SMProxy登錄驗證

例如默認配置登錄為mysql -uroot -p123456 -P 3366 -h 127.0.0.1

SMProxy登錄成功MySQL COMMIT會提示Server version: 5.6.0-SMProxy

worker_num

推薦使用swoole_cpu_num()swoole_cpu_num()*N

MySQL8.0

SMProxy1.2.4及以上可直接使用

SMProxy1.2.4以下需要做兼容處理

MySQL-8.0默認使用了安全性更強的caching_sha2_password插件,其他版本如果是從5.x升級上來的, 可以直接使用所有MySQL功能, 如是新建的MySQL, 需要進入MySQL命令行執行以下操作來兼容:

ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "password";
flush privileges;

將語句中的 "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/

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29661.html

相關文章

發表評論

0條評論

MartinHan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<