背景
最近要上一个新项目,原来提供的是一个主从mysql数据库,两台16C64G的主机(还有个预发环境也是mysql主从,2个4C8G主机),感觉不是很靠谱,所以想要切换成tidb,所以对两边进行了压测(包括预发),两边磁盘都是垃圾机械盘,性能不说了,但是两边都垃圾,对比数据还是比较靠谱的。
实践过程
下载
通过 https://github.com/akopytov/sysbench/releases 下载源码
\# ls -lh sysbench-1.0.20.tar.gz
\-rw-r--r-- 1 root root 1.5M Apr 27 17:12 sysbench-1.0.20.tar.gz
\# tar -zxf sysbench-1.0.20.tar.gz
\# ls sysbench-1.0.20
autogen.sh COPYING m4 README.md scripts third\_party
ChangeLog debian Makefile.am README-Oracle.md snap
config doc missing README-WIN.txt src
configure.ac install-sh mkinstalldirs rpm tests
- CentOS7.9下安装sysbench版本1.0.20,支持MySQL
yum -y install make automake libtool pkgconfig libaio-devel
- 如果本身openssl版本高,安装mariadb-devel报错
- 直接下载新版的mariadb来安装
Judy-1.0.5-8.el7.x86\_64.rpm
thrift-0.9.1-15.el7.x86\_64.rpm
mariadb-10.4.32-rhel-7-x86\_64-rpms.tar
rpm -e mariadb-libs-5.5.68-1.el7.x86\_64 --nodeps
rpm -e mariadb-5.5.68-1.el7.x86\_64 --nodeps
rpm -ivh Judy-1.0.5-8.el7.x86\_64.rpm
rpm -ivh thrift-0.9.1-15.el7.x86\_64.rpm
tar -xvf mariadb-10.4.32-rhel-7-x86\_64-rpms.tar
cd mariadb-10.4.32-rhel-7-x86\_64-rpms
yum localinstall \*.rpm -y
cd sysbench-1.0.20
\# yum install mariadb mariadb-devel
- 不安装MySQL和MySQL Dev包,make时会出现如下报错:
drv\_mysql.c:37:19: fatal error: mysql.h: No such file or directory
\#include \<mysql.h>
\# ./autogen.sh
\# ./configure --prefix=/usr/local/sysbench --with-mysql
\# make -j
\# make install
\# ls /usr/local/sysbench/
bin share
\# /usr/local/sysbench/bin/sysbench --version
sysbench 1.0.20
- tidb需要set global tidb_disable_txn_auto_retry = off;
set global tidb\_prepared\_plan\_cache\_size=1000;
- mysql需要 set global max_prepared_stmt_count=1048576;
其他全部用默认参数,不做修改。
调整
调整 Sysbench 脚本创建索引的顺序。Sysbench 按照“建表->插入数据->创建索引”的顺序导入数据。对于 TiDB 而言,该方式会花费更多的导入时间。你可以通过调整顺序来加速数据的导入。
假设使用的 Sysbench 版本为 1.0.20,可以通过以下两种方式来修改:
- 直接下载为 TiDB 修改好的 oltp_common.lua 文件,覆盖 /usr/local/sysbench/share/sysbench/oltp_common.lua 文件。
- 将 /usr/local/sysbench/share/sysbench/oltp_common.lua 的第 235-240 行移动到第 198 行以后。
分别配置mysql和tidb的配置文件
vi config
mysql-host=\*.\*.\*.\*
mysql-port=3806
mysql-user=root
mysql-password=\*\*\*\*\*\*
mysql-db=sbtest
time=600
threads=100
report-interval=10
db-driver=mysql
测试过程
首先压预发和tidb,只压4张表每张10W数据,准备数据
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=4 --table-size=100000 prepare
数据预热与统计信息收集
数据预热可将磁盘中的数据载入内存的 block cache 中,预热后的数据对系统整体的性能有较大的改善,建议在每次重启集群后进行一次数据预热。
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=4 --table-size=100000 prewarm
Point select 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=4 --table-size=100000 --db-ps-mode=auto --rand-type=uniform run
Update index 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_update_index --tables=4--table-size=100000 --db-ps-mode=auto --rand-type=uniform run
Read Write 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=4--table-size=100000 --db-ps-mode=auto --rand-type=uniform run
Read-only 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_only --tables=4--table-size=100000 --db-ps-mode=auto --rand-type=uniform run
清理
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=4--table-size=100000 --db-ps-mode=auto --rand-type=uniform cleanup
结果截图
然后压生产和预发,16张表每张50W数据,准备数据
/usr/local/sysbench/bin/sysbench --config-file=config oltp\_point\_select --tables=16 --table-size=500000 prepare
数据预热与统计信息收集
数据预热可将磁盘中的数据载入内存的 block cache 中,预热后的数据对系统整体的性能有较大的改善,建议在每次重启集群后进行一次数据预热。
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=16 --table-size=500000 prewarm
Point select 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=16 --table-size=500000 --db-ps-mode=auto --rand-type=uniform run
Update index 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_update_index --tables=16--table-size=500000 --db-ps-mode=auto --rand-type=uniform run
Read Write 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=16--table-size=500000 --db-ps-mode=auto --rand-type=uniform run
Read-only 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_only --tables=16--table-size=500000 --db-ps-mode=auto --rand-type=uniform run
清理
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=16--table-size=500000 --db-ps-mode=auto --rand-type=uniform cleanup
结果截图
最后本来想再压下生产和tidb的,但是由于生产在用,就没压了,只是单压tidb,看看数据量级上来之后tidb的性能如何。
16张表每张1000W数据,准备数据
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=16 --table-size=10000000 prepare
数据预热与统计信息收集
数据预热可将磁盘中的数据载入内存的 block cache 中,预热后的数据对系统整体的性能有较大的改善,建议在每次重启集群后进行一次数据预热。
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=16 --table-size=10000000 prewarm
Point select 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_point_select --tables=16 --table-size=10000000 --db-ps-mode=auto --rand-type=uniform run
Update index 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_update_index --tables=16--table-size=10000000 --db-ps-mode=auto --rand-type=uniform run
Read Write 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=16--table-size=10000000 --db-ps-mode=auto --rand-type=uniform run
Read-only 测试命令
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_only --tables=16--table-size=10000000 --db-ps-mode=auto --rand-type=uniform run
清理
/usr/local/sysbench/bin/sysbench --config-file=config oltp_read_write --tables=16--table-size=10000000 --db-ps-mode=auto --rand-type=uniform cleanup
结果截图
结论
本来觉得在低配置,低数据量的情况下,tidb并不比mysql占优的,实际出乎我的想象。