詳解通過ProxySQL提升PHP/MySQL的性能

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之安裝及配置詳解。此外,還有一些小細節需要注意:

立即學習PHP免費學習筆記(深入)”;

首先,注意 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 = '...'; $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); }  ?>

通過 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欄目!

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享