前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Galera Cluster for MySQL 详解(四)——性能测试

Galera Cluster for MySQL 详解(四)——性能测试

作者头像
用户1148526
发布2019-11-03 12:15:40
1.6K0
发布2019-11-03 12:15:40
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。undefined本文链接:https://cloud.tencent.com/developer/article/1531816

本篇使用tpcc-mysql压测工具对实验环境的三节点Galera集群进行一系列性能测试。

一、测试目标

  • 验证Galera的同步复制,检查是否存在复制延迟。
  • 对比Galera与MySQL组复制的每秒事务数(TPS)。
  • 验证多线程复制对Galera性能的影响。
  • 验证流控对Galera性能的影响。

二、测试规划

代码语言:txt
复制
    这里采用与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

代码语言:txt
复制
    具体思路与环境参见[https://cloud.tencent.com/developer/article/1486498](https://cloud.tencent.com/developer/article/1486498)。需要注意tpcc-mysql与Galera集群的兼容性,并不是所有版本的tpcc-mysql安装包都支持Galera。在我的环境中,最新的tpcc-mysql-master在Galera Cluster for MySQL 5.7上执行数据装载(tpcc\_load)时就报错。
代码语言:txt
复制
    Galera是多主复制,集群中的多个节点对等。为了便于与MySQL组复制推荐的单主模式进行比较,我们只在Galera集群的节点1上执行压测。Galera使用自己定义的GTID,当前版本也没有提供类似master\_pos\_wait或wait\_for\_executed\_gtid\_set类似功能的函数,因此需要修改测试脚本获得压测在节点2和节点3上的执行时间。修改后的tpcc\_test.sh文件内容如下:
代码语言:javascript
复制
[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]$
代码语言:txt
复制
    当三个节点的last\_committed相等时,它们执行了相同的事务数。如果存在复制延迟,节点2或节点3会比节点1后执行到last\_committed点。

三、测试过程

代码语言:txt
复制
    每次测试只需要执行tpcc\_test.sh即可。

1. 缺省配置

代码语言:txt
复制
    获得缺省配置的测试结果,作为后面不同配置的对比基准。测试结果如下:
代码语言:javascript
复制
TRX: 76472 
Node1 TPS: 212
Elapsed1: 360 Node2 TPS: 212
Elapsed2: 360 Node3 TPS: 212
代码语言:txt
复制
    可以看到,虽然Galera只是虚拟同步复制,每个节点上的事务验证是异步的,但实际测试中没有复制延迟,压测节点1与复制节点2、3的执行时间和TPS相同。这点与组复制大相径庭。单主模式的组复制中,相同压测主库比从库的TPS高一倍。另一方面,缺省配置组复制中主库的TPS比Galera高一倍,也就是说Galera的性能与单主模式组复制中的从库大致相当。因为两者MySQL版本不同,这里的测试结果只作参考。

2. 多线程

代码语言:txt
复制
    上篇文章提到wsrep\_cert\_deps\_distance状态变量指示并行提交的事务序号之差,可用作wsrep\_slave\_threads的参考值。
代码语言:javascript
复制
mysql> show status like 'wsrep_cert_deps_distance';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| wsrep_cert_deps_distance | 56.673657 |
+--------------------------+-----------+
1 row in set (0.00 sec)
代码语言:txt
复制
    wsrep\_cert\_deps\_distance的值为56,因此在三个节点执行下面的SQL命令,指定复制线程数为60。
代码语言:javascript
复制
set global wsrep_slave_threads=60;

再次执行测试,结果如下,TPS提高了40%:

代码语言:javascript
复制
TRX: 106848 
Node1 TPS: 296
Elapsed1: 360 Node2 TPS: 296
Elapsed2: 360 Node3 TPS: 296

3. 流控

代码语言:txt
复制
    查询流控相关的状态变量:
代码语言:javascript
复制
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)
代码语言:txt
复制
    接收队列中的事务数超过gcs.fc\_limit时触发流控,节点将暂停复制,gcs.fc\_limitde的缺省值16显然太小。在三个节点执行下面的SQL命令,指定流控限制为1000。
代码语言:javascript
复制
set global wsrep_provider_options = 'gcs.fc_limit = 1000';

再次执行测试,流控状态变量的值如下,确认没有触发流控。

代码语言:javascript
复制
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)

测试结果如下:

代码语言:javascript
复制
TRX: 103760 
Node1 TPS: 288
Elapsed1: 361 Node2 TPS: 287
Elapsed2: 361 Node3 TPS: 287
代码语言:txt
复制
    可见,是否触发流控对于TPS并没有明显影响。

四、测试结论

  • Galera是同步复制,节点间无延迟。
  • Galera比单主模式组复制中的主库,TPS相差一半。
  • wsrep_slave_threads参数对TPS影响较大。
  • 是否触发流控对TPS没有明显影响。

参考:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、测试目标
  • 二、测试规划
  • 三、测试过程
    • 1. 缺省配置
      • 2. 多线程
        • 3. 流控
        • 四、测试结论
        • 参考:
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档