Galera Cluster for MySQL 详解(四)——性能测试
目录
一、测试目标
二、测试规划
三、测试过程
1. 缺省配置
2. 多线程
3. 流控
四、测试结论
参考:
本篇使用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://wxy0327.blog.csdn.net/article/details/97782304#2.%20%E6%B5%8B%E8%AF%95%E8%A7%84%E5%88%92。需要注意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 ]
doread 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 ]
doif [ $last_committed_1 -lt $last_committed ] thenread 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")elseend_time1=`date '+%s'`fiif [ $last_committed_2 -lt $last_committed ] thenread 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")elseend_time2=`date '+%s'`fi
doneif [ ! $end_time1 ]; thenend_time1=`date '+%s'`
fiif [ ! $end_time2 ]; thenend_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
Galera Cluster for MySQL 详解(四)——性能测试相关推荐
- Galera Cluster for MySQL 详解(二)——安装配置
目录 一.Galera集群实验环境 二.初始安装 1. 安装galera-3.mysql-wsrep-5.7.Percona-XtraBackup-2.4.15 2. 修改配置文件 3. 初始化集群 ...
- Galera Cluster for MySQL 详解(一)——基本原理
目录 一.同步复制 二.Galera复制架构 1. wsrep api 2. 全局事务ID(global transaction id,GTID) 3. Galera复制插件 4. 组通信插件 三.G ...
- Galera Cluster for MySQL 详解(三)——管理监控
目录 一.管理 1. 在线DDL (1)TOI (2)RSU (3)pt-online-schema-change 2. 恢复主组件 (1)了解主组件状态 (2)修改保存的主组件状态 3. 重置仲裁 ...
- mysql数据库设计四大范性_数据库篇-mysql详解( 四 )之范式与数据高级骚操作
标题.png 一 : 主键 primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.一张表只能有最多一个主键 操作 增 ...
- MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解
MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...
- MySql详解(四)
MySql详解(四) MySql的DML操作 插入: 一.方式一 语法: insert into 表名(字段名,...) values(值,...); 特点: 1.要求值的类型和字段的类型要一致或兼容 ...
- 大数据WEB阶段(六)MySql详解(二)
MySql详解(二) 一.分组查询 语法: select col_name1,col_name2... from tb_name group by having ...; 练习: 执行下面的SQL,创 ...
- MySql详解(六)
MySql详解(六) MySql事务 一.含义 事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行 二.特点(ACID) A 原子性:一个事务是不可再分割的整体,要么都执 ...
- Mysql详解——索引优化
本篇文章是对Mysql索引的创建以及优化进行一个介绍,关于索引的底层原理可以看我另一篇文章:Mysql详解--索引详解 文章目录 一.索引的创建和设计原则 1. 索引的声明和使用 1.1 索引的分类: ...
最新文章
- 小撒、金晨都想拥有!百度全球首款汽车机器人亮相,车内躺着看星星
- 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
- css元素捕捉,css元素选择器
- Python爬虫对json数据解析爬取
- App设计灵感之十二组精美的租车类App设计案例
- swagger 使用指南
- Openlayer 3 最简单的弹出框
- ik分词 java_Java实现使用IK Analyzer实现中文分词
- word2016 图片去底灰_87平开门见厅,镜面扩容,将黑白灰用到极致,不奢华但精致...
- 【2022新版】全套Java教程-300集完整版
- 2018第三方支付牌照公司
- 以个性化为需求如何选择ITSM系统?
- 产品线 产品宽度 产品的深度 产品的相关度(理解工厂模式)
- php扩展 sockets,php sockets扩展安装配置详解
- Flask05_ORM单表
- python股票接口_股市python接口
- linux下关于笔记本的显卡驱动安装archlinux
- NFA转DFA与DFA简化
- Git Bash中怎么复制与粘贴
- 京东java电话面试问题_【京东Java面试】京东电话技术面试,面试题目完全没思路。-看准网...
热门文章
- 2023 多签提币接口通道HTML源码
- 干货分享:PCB防静电设计的必要性
- google名称的由来
- 什么是A/D转换和D/A转换
- Java选择题【1】
- MIT-JOS系列4:内存管理
- MCTK批处理MODIS L2 swath产品
- 实验室(教学室)智能同传,把某台电脑的操作系统、软件、设置等全部克隆到其他电脑里面。
- 对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串?
- Several ports (8005, 8080, 8009) required by Tomcat v8.0 Server at localhost are already in use.