Galera Cluster for MySQL 詳解(四)——性能測試
- 2019 年 11 月 3 日
- 筆記
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/wzy0623/article/details/102840342
本篇使用tpcc-mysql壓測工具對實驗環境的三節點Galera集群進行一系列性能測試。
一、測試目標
- 驗證Galera的同步複製,檢查是否存在複製延遲。
- 對比Galera與MySQL組複製的每秒事務數(TPS)。
- 驗證多線程複製對Galera性能的影響。
- 驗證流控對Galera性能的影響。
二、測試規劃
這裡採用與MySQL組複製性能測試相同的環境和方法,但組複製與Galera使用的MySQL版本不同。組複製測試用的是MySQL 8.0.16版本,而Galera測試用的是Galera Cluster for MySQL 5.7。之所以版本不同,是因為我在測試時使用的都是當時的最新版本。
節點1:172.16.1.125 節點2:172.16.1.126 節點3:172.16.1.127
具體思路與環境參見https://cloud.tencent.com/developer/article/1486498。需要注意tpcc-mysql與Galera集群的兼容性,並不是所有版本的tpcc-mysql安裝包都支持Galera。在我的環境中,最新的tpcc-mysql-master在Galera Cluster for MySQL 5.7上執行數據裝載(tpcc_load)時就報錯。
Galera是多主複製,集群中的多個節點對等。為了便於與MySQL組複製推薦的單主模式進行比較,我們只在Galera集群的節點1上執行壓測。Galera使用自己定義的GTID,當前版本也沒有提供類似master_pos_wait或wait_for_executed_gtid_set類似功能的函數,因此需要修改測試腳本獲得壓測在節點2和節點3上的執行時間。修改後的tpcc_test.sh文件內容如下:
[mysql@hdp1~/tpcc-mysql]$more tpcc_test.sh # 初始化tpcc數據 mysql -uwxy -pP@sswo2d -h172.16.1.125 -Dtpcc_test < tpcc_test.sql # 獲取節點1的last_committed用於比較 read last_committed < <(mysql -uwxy -pP@sswo2d -h172.16.1.125 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{prin t $2}' | sed "s/\n//g") # 等待其它兩個節點執行完初始化複製 read last_committed_1 < <(mysql -uwxy -pP@sswo2d -h172.16.1.126 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{pr int $2}' | sed "s/\n//g") read last_committed_2 < <(mysql -uwxy -pP@sswo2d -h172.16.1.127 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{pr int $2}' | sed "s/\n//g") while [ $last_committed_1 -lt $last_committed -o $last_committed_2 -lt $last_committed ] do read last_committed_1 < <(mysql -uwxy -pP@sswo2d -h172.16.1.126 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{print $2}' | sed "s/\n//g") read last_committed_2 < <(mysql -uwxy -pP@sswo2d -h172.16.1.127 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{print $2}' | sed "s/\n//g") done # 開始時間 start_time=`date '+%s'` # 開始事務序號 read start_last_committed < <(mysql -uwxy -pP@sswo2d -h172.16.1.125 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{print $2}' | sed "s/\n//g") # 節點1執行壓測,10個倉庫,32個並發線程,預熱1分鐘,壓測5分鐘 tpcc_start -h172.16.1.125 -d tpcc_test -u wxy -p "P@sswo2d" -w 10 -c 32 -r 60 -l 300 > tpcc_test.log 2>&1 # 獲取節點1的last_committed用於比較 read last_committed < <(mysql -uwxy -pP@sswo2d -h172.16.1.125 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{prin t $2}' | sed "s/\n//g") # 等待其它兩個節點執行完複製 read last_committed_1 < <(mysql -uwxy -pP@sswo2d -h172.16.1.126 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{pr int $2}' | sed "s/\n//g") read last_committed_2 < <(mysql -uwxy -pP@sswo2d -h172.16.1.127 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{pr int $2}' | sed "s/\n//g") while [ $last_committed_1 -lt $last_committed -o $last_committed_2 -lt $last_committed ] do if [ $last_committed_1 -lt $last_committed ] then read last_committed_1 < <(mysql -uwxy -pP@sswo2d -h172.16.1.126 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{print $2}' | sed "s/\n//g") else end_time1=`date '+%s'` fi if [ $last_committed_2 -lt $last_committed ] then read last_committed_2 < <(mysql -uwxy -pP@sswo2d -h172.16.1.127 -e "show status like 'wsrep_last_committed';" --skip-column-names | awk '{print $2}' | sed "s/\n//g") else end_time2=`date '+%s'` fi done if [ ! $end_time1 ]; then end_time1=`date '+%s'` fi if [ ! $end_time2 ]; then end_time2=`date '+%s'` fi # 複製執行時長 elapsed1=$(($end_time1 - $start_time)) elapsed2=$(($end_time2 - $start_time)) # 執行的事務數 trx=$(($last_committed - $start_last_committed)) # 計算三個節點的TPS Master_TPS=`expr $trx / 360` Slave1_TPS=`expr $trx / $elapsed1` Slave2_TPS=`expr $trx / $elapsed2` # 打印輸出 echo "TRX: $trx" echo "Node1 TPS: $Master_TPS" echo "Elapsed1: $elapsed1" "Node2 TPS: $Slave1_TPS" echo "Elapsed2: $elapsed2" "Node3 TPS: $Slave2_TPS" [mysql@hdp1~/tpcc-mysql]$
當三個節點的last_committed相等時,它們執行了相同的事務數。如果存在複製延遲,節點2或節點3會比節點1後執行到last_committed點。
三、測試過程
每次測試只需要執行tpcc_test.sh即可。
1. 缺省配置
獲得缺省配置的測試結果,作為後面不同配置的對比基準。測試結果如下:
TRX: 76472 Node1 TPS: 212 Elapsed1: 360 Node2 TPS: 212 Elapsed2: 360 Node3 TPS: 212
可以看到,雖然Galera只是虛擬同步複製,每個節點上的事務驗證是異步的,但實際測試中沒有複製延遲,壓測節點1與複製節點2、3的執行時間和TPS相同。這點與組複製大相徑庭。單主模式的組複製中,相同壓測主庫比從庫的TPS高一倍。另一方面,缺省配置組複製中主庫的TPS比Galera高一倍,也就是說Galera的性能與單主模式組複製中的從庫大致相當。因為兩者MySQL版本不同,這裡的測試結果只作參考。
2. 多線程
上篇文章提到wsrep_cert_deps_distance狀態變量指示並行提交的事務序號之差,可用作wsrep_slave_threads的參考值。
mysql> show status like 'wsrep_cert_deps_distance'; +--------------------------+-----------+ | Variable_name | Value | +--------------------------+-----------+ | wsrep_cert_deps_distance | 56.673657 | +--------------------------+-----------+ 1 row in set (0.00 sec)
wsrep_cert_deps_distance的值為56,因此在三個節點執行下面的SQL命令,指定複製線程數為60。
set global wsrep_slave_threads=60;
再次執行測試,結果如下,TPS提高了40%:
TRX: 106848 Node1 TPS: 296 Elapsed1: 360 Node2 TPS: 296 Elapsed2: 360 Node3 TPS: 296
3. 流控
查詢流控相關的狀態變量:
mysql> show status like 'wsrep_flow_control_%'; +------------------------------+--------------+ | Variable_name | Value | +------------------------------+--------------+ | wsrep_flow_control_paused_ns | 947249076448 | | wsrep_flow_control_paused | 0.037075 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 932 | +------------------------------+--------------+ 4 rows in set (0.00 sec)
接收隊列中的事務數超過gcs.fc_limit時觸發流控,節點將暫停複製,gcs.fc_limitde的缺省值16顯然太小。在三個節點執行下面的SQL命令,指定流控限制為1000。
set global wsrep_provider_options = 'gcs.fc_limit = 1000';
再次執行測試,流控狀態變量的值如下,確認沒有觸發流控。
mysql> show status like 'wsrep_flow_control_%'; +------------------------------+--------------+ | Variable_name | Value | +------------------------------+--------------+ | wsrep_flow_control_paused_ns | 947249076448 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | +------------------------------+--------------+ 4 rows in set (0.00 sec)
測試結果如下:
TRX: 103760 Node1 TPS: 288 Elapsed1: 361 Node2 TPS: 287 Elapsed2: 361 Node3 TPS: 287
可見,是否觸發流控對於TPS並沒有明顯影響。
四、測試結論
- Galera是同步複製,節點間無延遲。
- Galera比單主模式組複製中的主庫,TPS相差一半。
- wsrep_slave_threads參數對TPS影響較大。
- 是否觸發流控對TPS沒有明顯影響。
參考:
- https://blog.csdn.net/chenhaifeng2016/article/details/77530569
- https://www.percona.com/blog/2017/04/19/performance-improvements-percona-xtradb-cluster-5-7-17/
- http://mysqlhighavailability.com/performance-evaluation-mysql-5-7-group-replication/?spm=5176.100239.blogcont66550.17.T4N8cZ


