首頁  >  文章  >  專題  >  詳解透過ProxySQL提升PHP/MySQL的效能

詳解透過ProxySQL提升PHP/MySQL的效能

coldplay.xixi
coldplay.xixi轉載
2020-11-17 16:50:112859瀏覽

php mysql欄位介紹ProxySQL如何提升PHP/MySQL的效能。

詳解透過ProxySQL提升PHP/MySQL的效能

前些天我介紹如何透過 Twemproxy 實作 Redis 連線池,進而提升 PHP/Redis 的效能。今天要介紹一下ProxySQL,透過它可以實現MySQL 連線池,進而提升PHP/MySQL 的效能,其實原理是差不多的,本來沒必要再寫一篇文章贅述,不過我在設定使用ProxySQL 的過程中,遇到了一些小問題,感覺還是該記錄。

關於安裝過程,官方 Wiki 裡有詳細描述。主要看設定檔/etc/proxysql.cnf :

datadir="/var/lib/proxysql"

admin_variables=
{
	admin_credentials="admin:admin"
	mysql_ifaces="0.0.0.0:6032"
}

mysql_variables=
{
	threads=4
	max_connections=2048
	default_query_delay=0
	default_query_timeout=36000000
	have_compress=true
	poll_timeout=2000
	interfaces="/var/run/proxysql.sock"
	default_schema="information_schema"
	stacksize=1048576
	server_version="5.5.30"
	connect_timeout_server=3000
	monitor_username="monitor"
	monitor_password="monitor"
	monitor_history=600000
	monitor_connect_interval=60000
	monitor_ping_interval=10000
	monitor_read_only_interval=1500
	monitor_read_only_timeout=500
	ping_interval_server_msec=120000
	ping_timeout_server=500
	commands_stats=true
	sessions_sort=true
	connect_retries_on_failure=10
}

mysql_servers =
(
	{
		address="..."
		port=3306
	}
)

mysql_users:
(
	{
		username = "..."
		password = "..."
	}
)

   

最應該注意的是:ProxySQL 使用SQLite 來保存設定訊息,設定檔只在第一次啟動的時候有效,後續都是從SQLite 取得配置。如果你想強制使用設定文件,需要使用 initial        指令。更多資訊可參考:ProxySQL之安裝及設定詳解。另外,還有一些小細節要注意:

首先,注意admin_variables 裡的 admin_credentials,缺省值是「admin:admin」,表示預設使用者名稱和密碼都是admin,還有mysql_ifaces,其缺省值是「0.0.0.0:6032」,表示監聽所有網路介面的6032 端口,設想你有一個外網能訪問的網絡接口,那麼惡意用戶將能使用缺省的用戶名密碼進入到你的admin 系統,所以不要用預設的用戶名和密碼,也不要缺省監聽外網接口,切記!切記!切記!

其次,注意 mysql_variables 裡的 interfaces,因為PHP 要透過本地的Unix Domain Socket 來請求ProxySQL 的連接池,所以interfaces 不要使用ip:port 的形式,而是設定成本地Unix Domain Socket 的形式,本例設定為/var/run/proxysql.sock,需要提醒的是很多人喜歡把Socket 檔案放到/tmp 路徑下,這不是一個好習慣,畢竟/tmp 從名字上看就不像是一個良家婦女,大家都想弄兩下,搞不好誰        rm 了一下就糟了。

最後,注意 mysql_variables 裡的 monitor_username 和 monitor_password,它設定了監控用戶的相關信息,以便ProxySQL 隨時掌握後端MySQL 伺服器的狀態,一定要記得提前在後端MySQL 伺服器上建立對應的帳號,我一開始就沒建立監控帳號,結果ProxySQL 運作一段時間就沒回應了,這是因為當ProxySQL 不斷用設定裡的監控帳號和密碼嘗試去存取後端伺服器的時候,會產生很多「Access denied for user 'monitor'@'…'”的錯誤,當達到一定閾值,就會導致“Host '…' is blocked because of many connection errors”,此時ProxySQL 就無法響應請求了,必須在MySQL 上“mysqladmin flush-hosts」才行。相關的日誌資訊可以在「SELECT * FROM monitor.mysql_server_ping_log」裡查看。

下面讓我們壓測看看效能怎麼樣,測試腳本test.php 如下:

<?php

$host = &#39;...&#39;;
$user = &#39;...&#39;;
$password = &#39;...&#39;;
$database = &#39;...&#39;;
$charset = &#39;utf8mb4&#39;;
$socket = &#39;/var/run/proxysql.sock&#39;;

$dsn = "mysql:dbname={$database};charset={$charset}";

if (empty($_GET[&#39;proxysql&#39;])) {
    $dsn .= ";host={$host}";
} else {
    $dsn .= &#39;;unix_socket={$socket}&#39;;
}

$dbh = new PDO($dsn, $user, $password);

$sql = &#39;SELECT * FROM foo LIMIT 10&#39;;

$value = $dbh->query($sql);

foreach ($value as $v) {
    var_dump($v);
}

?>

透過ab 模擬一個高並發的場景,壓測看看效能有沒有提升:

shell> ab -k -n 10000 -c 100 "http://path/test.php?proxysql=0"
shell> ab -k -n 10000 -c 100 "http://path/test.php?proxysql=1"

最終,我在一台一般配置的伺服器上,不透過ProxySQL 得到了大約1500 的RPS,透過ProxySQL 得到了大約2000 的RPS,也就是說,ProxySQL 帶來了25% 的效能提升。

想了解更多相關文章,請關注php mysql欄位!

#

以上是詳解透過ProxySQL提升PHP/MySQL的效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除