php mysql欄目介紹ProxySQL如何提升PHP/MySQL的性能。
前些天我介紹了如何通過(guò) Twemproxy 實(shí)現(xiàn) Redis 連接池,進(jìn)而提升 PHP/Redis 的性能。今天我要介紹一下 ProxySQL,通過(guò)它可以實(shí)現(xiàn) MySQL 連接池,進(jìn)而提升 PHP/MySQL 的性能,實(shí)際上原理是差不多的,本來(lái)沒(méi)必要再寫(xiě)一篇文章贅述,不過(guò)我在配置使用 ProxySQL 的過(guò)程中,遇到了一些小問(wèn)題,感覺(jué)還是應(yīng)該記錄一下。

關(guān)于安裝過(guò)程,官方 Wiki 里有詳細(xì)描述。主要看配置文件 /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 = "..."
}
)最應(yīng)該注意的是:ProxySQL 使用 SQLite 來(lái)保存配置信息,配置文件只在第一次啟動(dòng)的時(shí)候有效,后續(xù)都是從 SQLite 獲取配置。如果你想強(qiáng)制使用配置文件,需要使用 initial 命令。更多信息可以參考:ProxySQL之安裝及配置詳解。此外,還有一些小細(xì)節(jié)需要注意:
首先,注意 admin_variables 里的 admin_credentials,缺省值是「admin:admin」,表示缺省用戶(hù)名和密碼都是 admin,還有 mysql_ifaces,其缺省值是「0.0.0.0:6032」,表示監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口的 6032 端口,設(shè)想你有一個(gè)外網(wǎng)能訪問(wèn)的網(wǎng)絡(luò)接口,那么惡意用戶(hù)將能使用缺省的用戶(hù)名密碼進(jìn)入到你的 admin 系統(tǒng),所以不要用缺省的用戶(hù)名和密碼,也不要缺省監(jiān)聽(tīng)外網(wǎng)接口,切記!切記!切記!
其次,注意 mysql_variables 里的 interfaces,因?yàn)?PHP 要通過(guò)本地的 Unix Domain Socket 來(lái)請(qǐng)求 ProxySQL 的連接池,所以 interfaces 不要使用 ip:port 的形式,而是設(shè)置成本地Unix Domain Socket 的形式,本例中設(shè)置為 /var/run/proxysql.sock,需要提醒的是很多人喜歡把 Socket 文件放到 /tmp 路徑下,這不是一個(gè)好習(xí)慣,畢竟 /tmp 從名字上看就不像是一個(gè)良家婦女,大家都想弄兩下,搞不好誰(shuí) rm 了一下就糟了。
最后,注意 mysql_variables 里的 monitor_username 和 monitor_password,它設(shè)置了監(jiān)控用戶(hù)的相關(guān)信息,以便 ProxySQL 隨時(shí)掌握后端 MySQL 服務(wù)器的狀態(tài),一定要記得提前在后端 MySQL 服務(wù)器上創(chuàng)建相應(yīng)的帳號(hào),我一開(kāi)始就沒(méi)創(chuàng)建監(jiān)控帳號(hào),結(jié)果 ProxySQL 運(yùn)行一段時(shí)間就沒(méi)響應(yīng)了,這是因?yàn)楫?dāng) ProxySQL 不斷用配置里的監(jiān)控帳號(hào)和密碼嘗試去訪問(wèn)后端服務(wù)器的時(shí)候,會(huì)生成很多「Access denied for user ‘monitor’@’…’」的錯(cuò)誤,當(dāng)達(dá)到一定閾值,就會(huì)導(dǎo)致「Host ‘…’ is blocked because of many connection errors」,此時(shí) ProxySQL 就無(wú)法響應(yīng)請(qǐng)求了,必須在 MySQL 上「mysqladmin flush-hosts」才行。相關(guān)的日志信息可以在「SELECT * FROM monitor.mysql_server_ping_log」里查看到。
下面讓我們壓測(cè)看看性能怎么樣,測(cè)試腳本 test.php 如下:
<?php
$host = '...';
$user = '...';
$password = '...';
$database = '...';
$charset = 'utf8mb4';
$socket = '/var/run/proxysql.sock';
$dsn = "mysql:dbname={$database};charset={$charset}";
if (empty($_GET['proxysql'])) {
$dsn .= ";host={$host}";
} else {
$dsn .= ';unix_socket={$socket}';
}
$dbh = new PDO($dsn, $user, $password);
$sql = 'SELECT * FROM foo LIMIT 10';
$value = $dbh->query($sql);
foreach ($value as $v) {
var_dump($v);
}
?>通過(guò) ab 模擬一個(gè)高并發(fā)的場(chǎng)景,壓測(cè)看看性能有沒(méi)有提升:
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"
最終,我在一臺(tái)一般配置的服務(wù)器上,不通過(guò) ProxySQL 得到了大約 1500 的 RPS,通過(guò) ProxySQL 得到了大約 2000 的 RPS,也就是說(shuō),ProxySQL 帶來(lái)了 25% 的性能提升。
想了解更多相關(guān)文章,敬請(qǐng)關(guān)注php mysql欄目!
網(wǎng)站題目:詳解通過(guò)ProxySQL提升PHP/MySQL的性能
地址分享:http://chinadenli.net/article34/cgjppe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、App設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)、企業(yè)建站、全網(wǎng)營(yíng)銷(xiāo)推廣、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)