ProxySQL - MySQL MGR 讀寫分離架構的 Sysbench 只讀壓測報告

作者 | 雷宏婧

編輯 | 冬梅

前    言

在大量併發讀請求、讀多寫少的業務場景下,本文利用 Sysbench 性能測試工具,調研基於【負載均衡 + ProxySQL Cluster + MySQL MGR 的讀寫分離架構】能否有效利用橫向擴展的 MySQL 實例的讀能力,並最終提高應用系統 QPS。

  1. MySQL Group Replication(MGR)於 2016 年 12 月被推出,提供了高可用、高擴展、高可靠的 MySQL 集羣服務。但其僅解決了數據同步問題和集羣內部的自動故障轉移。當 Master 宕機,應用系統可能需要修改數據庫連接地址,才能保證服務的可用性。爲解決上述問題,可在 MRG 上層增加代理層,例如 ProxySQL。

  2. ProxySQL 於 2015 年被推出,是一個開源、高性能、高可用性、協議感知的 MySQL 代理。

    1. 可通過每個節點的 read_only 值,自動調整它們是屬於讀組還是寫組;

    2) 可定製基於用戶、基於 schema、基於語句的規則對 SQL 語句進行路由,實現讀寫分離;

    1. 支持搭建 ProxySQL Cluster 來達到高可用,節點之間的配置可自動同步。
  3. 負載均衡是將流量分發至多臺節點設備上處理的服務。

    1. 可通過消除單點故障,提升應用系統的可用性;

    2. 可減緩大量的併發訪問,提高應用系統的處理能力。

  4. Sysbench 是一個開源的、模塊化的、跨平臺的多線程性能測試工具。

  5. 壓測目的

基於 Sysbench 的 oltpreadonly 壓測模式,對比【負載均衡 + ProxySQL Cluster + MGR 的讀寫分離】和【應用直連 MySQL Master】這兩種架構的只讀性能:

  1. 建立讀寫分離架構的只讀性能基線數據;

  2. 驗證讀寫分離架構在大量併發讀請求場景下的有效性;

  3. 分析各模塊和參數對讀寫分離架構性能的影響。

  4. 壓測結論

在 Sysbench oltpreadonly 壓測模式下,【4 層負載均衡 +ProxySQL Cluster+MGR 讀寫分離】架構的 QPS 與併發線程數關係如下表所示。

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

2.2. 只讀場景下讀寫分離架構的有效性

首先簡單瀏覽下實驗對比架構和結果,

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。實驗結果表明:

  1. 在不引入負載均衡、ProxySQL Cluster 等中間件的理想情況下,【應用直連 MGR 2 個只讀實例】QPS 最大值能達到 100w,爲【應用直連 MySQL Master】的只讀 QPS 最大值 37w 的 2.7 倍。該結果驗證了 MGR 架構在大量併發讀請求場景下的有效性。

但實際上,如要保證應用系統高可用,則需引入負載均衡、ProxySQL Cluster 等中間件,而這些中間件或多或少會帶來性能損失。實驗發現,【4 層負載均衡 +ProxySQL Cluster+MGR 讀寫分離】架構的只讀 QPS 最大值爲 89w,約爲【應用直連 MySQL Master】的只讀 QPS 最大值 37w 的 2.4 倍,該結果驗證了【4 層負載均衡 +ProxySQL Cluster+MGR 讀寫分離】架構在大量併發讀請求場景下的有效性。

2.3. 各模塊和參數對讀寫分離架構性能的影響

  1. 【4 層負載均衡 +ProxySQL Cluster+MGR 讀寫分離】架構的 QPS 最大值約爲【直連 MGR 2 個只讀實例】QPS 最大值 100w 的 89%。其中,ProxySQL Cluster 帶來約 11% 的性能損失,負載均衡幾乎沒有帶來性能損失。但是 ProxySQL 的 CPU 佔用率最高僅 57%,還需後續探索能否進一步有效利用 ProxySQL。

  2. 根據 https://github.com/sysown/ProxySQL/issues/1724,參考 CPU 核數增加 ProxySQL 的 mysql-threads 變量值,即增加 ProxySQL 用於處理 MySQL 流量的後臺線程數,能有效提升 QPS(如將線程數從 4 增加至 16,QPS 提升了 3.3 倍),但目前還沒壓測出 ProxySQL 的 CPU 利用率提升到 100% 的場景。

  3. 橫向拓展 ProxySQL 實例數目,能有效提升 QPS(實例數從 1 增加至 2,QPS 提升 1 倍)。

  4. 將 7 層負載均衡換成 4 層,由在應用層進行流量分發改成在傳輸層,降低網絡性能損耗,在實驗中提升了 1 倍 QPS。

  5. 根據 https://ProxySQL.com/blog/benchmarking-ProxySQL-144/,增大 ProxySQL 的 mysql-max_stmts_per_connection 變量值(20 增加至 100),讓單個連接可以處理更多的 prepared 語句,但實驗中未能影響 QPS。

  6. 壓測詳情

3.1. 壓測環境

此外,還安裝了 nodeexporter、mysqlexporter、proxysql_exporter 來監控 OS、MySQL 和 ProxySQL,方便定位問題。

爲減少誤差,每輪實驗重複 3 次。每次任務執行完之後,等待 300s,讓系統及時處理未完成任務,才進入下一輪壓測。壓測後除了利用 Sysbench 自帶的 cleanup 清理數據,還額外把 binlog 清理乾淨,以防磁盤空間變少而影響下一次壓測。其他模塊設置見下文。

準備數據:

sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=dbtest --tables=1 --table-size=10000000 --report-interval=1 --threads=XXX --rand-type=uniform --time=120 --auto-inc=on /usr/local/share/sysbench/oltp_read_only.lua prepare

運行 workload:

sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=dbtest --tables=1 --table-size=10000000 --report-interval=1 --threads=XXX --rand-type=uniform --time=120 --auto-inc=on --skip_trx=on /usr/local/share/sysbench/oltp_read_only.lua run

清理數據:

sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=dbtest --tables=1 --table-size=10000000 --report-interval=1 --threads=XXX --rand-type=uniform --time=120 --auto-inc=on /usr/local/share/sysbench/oltp_read_only.lua cleanup

普通變量:

重點變量:

https://github.com/akopytov/sysbench/issues/19

總共設計了 6 個實驗場景(架構圖詳見實驗結果分析),實驗目的如下:

實驗目的:

獲取通過應用(sysbench)直連 MGR 的 2 個只讀實例數所能帶來的 QPS 上限,確認該上限和應用直連 mysql Master-Master 中其中 1 臺的 QPS 差異。

實驗結果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗目的:

在儘可能減少應用和 ProxySQL 之間網絡延遲的情況下,確認增加 ProxySQL 中間件會帶來的性能損失

實驗結果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗結論:

在該實驗中,ProxySQL Cluster 帶來約 48% 的性能損失,但此時 ProxySQL 的 CPU 佔用率並不算很高,值得後續探索能否進一步有效利用 ProxySQL。

實驗目的:

確認橫向拓展 ProxySQL 實例數目能否進一步提升 QPS

實驗結果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗結論:

橫向拓展 ProxySQL 實例數目可以進一步提升 QPS 至 89w,相對接近 MGR 的上限 100w。

實驗目的:

增加讀寫分離架構中必不可少的負載均衡服務,並確認其帶來的性能損失

實驗結果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗結論:

增加負載均衡導致性能損失近 50%,可能是因爲網絡、配置問題,需要進一步排查。

實驗目的:

4 層負載均衡工作在 OSI 模型的傳輸層(基於 IP+ 端口),7 層工作在應用層(基於 URL)。

理論上,7 層負載均衡會帶來更多的網絡性能損耗。因此嘗試調整爲 4 層負載均衡,以減少性能損失。

實驗結果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗結論:

將 7 層負載均衡換成 4 層負載均衡後,QPS 最大值爲 89w,負載均衡幾乎沒帶來性能損失。

實驗目的:

根據 https://github.com/sysown/ProxySQL/issues/1724,mysql-threads 變量是 ProxySQL 用於處理 MySQL 流量的後臺線程數,理論上,根據機器 CPU 核數來調整該變量,可提升 ProxySQL 性能。因此嘗試分析該參數對性能的影響。

實驗結****果:

ps:“/” 表示由於 Sysbench 機器 CPU 耗盡,未能完成測試,無實驗結果。

實驗結論:

根據機器 CPU 核數來增加 ProxySQL 的 mysql-threads 變量值,可一定程度上提升 QPS。

  1. 總 結

  2. 【4 層負載均衡 + ProxySQL Cluster + MGR 讀寫分離】架構適用於在大量併發讀請求場景,只讀 QPS 最大能達到 89w,約爲【應用直連 MySQL Master】的只讀 QPS 最大值 37w 的 2.4 倍。

  3. 參考機器的 CPU 核數增加 ProxySQL 的 mysql-threads 變量值,即增加 ProxySQL 用於處理 MySQL 流量的後臺線程數,能有效提升 QPS(如將線程數從 4 增加至 16,QPS 提升了 3.3 倍)。

  4. 橫向拓展 ProxySQL 實例數目,能有效提升 QPS(實例數從 1 增加至 2,QPS 提升 1 倍)。

  5. 將 7 層負載均衡換成 4 層,由在應用層進行流量分發改成在傳輸層,能降低網絡性能損耗並提升 QPS。

  6. 本次實驗中,ProxySQL Cluster 帶來約 11% 的性能損失,負載均衡幾乎沒有帶來性能損失。但是 ProxySQL 的 CPU 佔用率最高僅 57%,還需後續探索能否進一步有效利用 ProxySQL。

參考文獻:

  1. https://dev.MySQL.com/doc/refman/5.7/en/group-replication.html

  2. https://ProxySQL.com/documentation/ProxySQL-Threads/

  3. https://ProxySQL.com/blog/ProxySQL-vs-maxscale-persistent-connection-response-time/

  4. https://www.percona.com/blog/2020/08/28/ProxySQL-overhead-explained-and-measured/

  5. https://github.com/sysown/ProxySQL/issues/1724

  6. https://www.percona.com/blog/2017/04/10/ProxySQL-rules-do-i-have-too-many/

作者簡介:

雷宏婧,網易遊戲 技術部高級數據庫系統工程師。參與海量玩家數據庫生產環境故障排查和優化,熱衷於研究 MySQL 技術原理、災難備份和高可用方案。


本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/kUIXGn-8388VdP3HIQxk4g