在這篇博文裡,我們準備來看一下 ProxySQL 是如何提高 MySQL 的 SSL 連線效能的。
當用 SSL 部署 MySQL 時,主要的問題是如果沒有使用連線池(例如:PHP 中的 mysqlnd-mux,python中 的 mysql.connector.pooling 等等),初始握手會造成大量的開銷。不斷的關閉連線、建立新的連線會對你的查詢時間造成很大的影響。客戶和同事最近讓我知道了,雖然你可以用現代的英特爾處理器 AES-NI 硬體擴充套件來提升 SSL 加密/解密效能,但實際上,建立 SSL 連線時的開銷來自於多次伺服器和客戶端建立連線時需要的握手。
使用 ProxySQL 支援 SSL 的後端連線和連線池,我們可以將它應用在任何應用程式上、同一個伺服器(說明如下):
在這種情況下,ProxySQL 執行在同一臺伺服器上的一個應用下,並且通過本地套接字與 MySQL 連線。MySQL 資料就不需要通過不安全的 TCP 流進行傳輸了。
我使用一個 PHP 指令碼簡單地在一個單執行緒中建立了 1 萬個連線,來看看效能表現如何:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $i = 10000; $user = 'percona'; $pass = 'percona'; while($i>=0) { $mysqli = mysqli_init(); // Use SSL //$link = mysqli_real_connect($mysqli, "192.168.56.110", $user, $pass, "", 3306, "", MYSQL_CLIENT_SSL) // No SSL //$link = mysqli_real_connect($mysqli, "192.168.56.110", $user, $pass, "", 3306 ) // OpenVPN //$link = mysqli_real_connect($mysqli, "10.8.99.1", $user, $pass, "", 3306 ) // ProxySQL $link = mysqli_real_connect($mysqli, "localhost", $user, $pass, "", 6033, "/tmp/proxysql.sock") or die(mysqli_connect_error()); $info = mysqli_get_host_info($mysqli); $i--; mysqli_close($mysqli); unset($mysqli); } ?> |
沒有使用 SSL 直接連線 MySQL:
1 2 3 4 |
[root@ad ~]# time php php-test.php real 0m20.417s user 0m0.201s sys 0m3.396s |
使用 SSL 直接連線 MySQL:
1 2 3 4 |
[root@ad ~]# time php php-test.php real1m19.922s user0m29.933s sys0m9.550s |
在 OpenVPN 隧道下沒有使用 SSL 直接連線 MySQL:
1 2 3 4 |
[root@ad ~]# time php php-test.php real 0m15.161s user 0m0.493s sys 0m0.803s |
接下來,使用 ProxySQL 通過本地套接字檔案連線:
1 2 3 4 |
[root@ad ~]# time php php-test.php real0m2.791s user0m0.402s sys0m0.436s |
下面是這些資料的對比圖:
如你所見,使用 SSL 和不使用 SSL 情況下的開銷差距大約是 400% —— 對某些負載來說還是很可怕的。
通過 OpenVPN 連線大體上都比 SSL 好。有趣的是,OpenVPN 伺服器需要部署在另一臺伺服器上,與 MySQL 伺服器和應用分開。
這種方法允許應用伺服器和 MySQL 伺服器(包括副本/叢集節點)在同一個安全網路上進行通訊,但會建立一個單一的故障點。另外,當有一個新的遠端 master 的時候,在 MySQL 伺服器上部署 OpenVPN 意味著如果你要新增一個額外的高可用效能的擴充套件會變得相當複雜。總之,OpenVPN 增加了許多額外的部件。
ProxySQL 的漂亮之處在於,你可以在所有應用程式伺服器執行它,只要將其指向到正確的 MySQL 伺服器(主伺服器)即可正常工作,或者使用複製組功能來識別權威主機。
最後,需要注意的是,這些測試都是在 CentOS 7.3 + OpenSSL 1.0.1e + Percona Server for MySQL 5.7.19 + ProxySQL 1.4.1 + PHP 5.4 + OpenVPN 2.4.3 上面進行的。
祝您使用愉快。