一、环境配置
1.敏捷测试目标
完成在tem上安装部署tidb敏捷版本,进行敏捷版本和mysql数据库的各项功能指标测试
2.敏捷测试数据库版本对比
TIDB:v7.1.8
Mysql:v8.0.43
3.虚拟机及软件软件
配置 | 操作系统 | 版本 | ip地址 | |
---|---|---|---|---|
TEM | 2c4g | rockylinux8.9 | v3.1.0 | 192.168.96.60 |
TIDB | 8c16g | rockylinux8.9 | v7.1.8-5.2 | 192.168.96.61 |
mysql | 2c2g | rockylinux8.9 | v8.0.43 | 192.168.96.62 |
二、环境部署
1.部署前准备
1)关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
临时关闭:setenforce 0
永久关闭:vi /etc/selinux/config 修改SELINUX=disabled
2)配置域名解析连接外网
[root@tem ~]# cat /etc/resolv.conf
nameserver 114.114.114.114
2)安装openssh
yum -y install openssh
2.安装TEM
1)下载tem安装包,上传到tem虚拟机
2)解压按照包
tar -xvf tem-amd64.tar.gz
3)修改源数据库文件
cp metadb_topology_template.yaml metadb_topology.yaml
vi metadb_topology.yaml
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
arch: "amd64"
pd_servers:
- host: 192.168.96.60
tidb_servers:
- host: 192.168.96.60
port: 4000
tikv_servers:
- host: 192.168.96.60
4)修改tem配置文件
vi config.yaml
global:
user: "tidb"
group: "tidb"
ssh_port: 22
deploy_dir: "/tem-deploy"
data_dir: "/tem-data"
arch: "amd64"
log_level: "info"
enable_tls: false
server_configs: #这里指定tem 节点的全局配置
tem_servers:
db_addresses: "192.168.96.60:4000"
db_u: "root"
db_pwd: ""
db_name: "test"
log_filename: "/tem-deploy/tem-server-8080/log/tem.log"
log_tem_level: "info"
log_max_size: 300
log_max_days: 30
log_max_backups: 0
tem_servers:
- host: "192.168.96.60"
port: 8080
mirror_repo: true # 是否开启镜像仓库,多个TEM节点时,最多只允许一个节点的开启
5)安装tem
./install.sh
5)登录tem 默认用户名密码admin
http://192.168.96.60:8080
3.tem部署tidb集群(敏捷版本)
1)添加凭证
TEM设置-凭证-主机-添加凭证,输入tidb虚拟机服务器的用户名和密码
2)上传下载好的敏捷版本安装包,进行组件管理
设置-组件管理-添加组件-选择组件镜像-本地上传
tidb-ee-server-v7.1.8-5.2-20250630-linux-amd64.tar.gz tidb服务整合包
tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-amd64.tar.gz tidb工具整合包
3)配置中控机
主机-集群管理中控机-添加中控机
IP地址:192.168.60.61
名称:tidb61
ssh端口:22
服务端口:8090
服务根目录:/root/tidb-cm-service
自动安装TIUP
添加后的界面如下
4)配置集群主机
主机-主机-添加共享主机
已成功添加共享主机
5)创建集群
集群-创建集群
输入集群名称、密码Xq1211@123、选择集群中控机
tidb版本选择、集群种类敏捷模式、部署模式共享
选中添加相关组件:pingkaidb-fusion、tiflash、Prometheus、grafana、alertmanager
参数默认
集群创建中
集群安装完成
4.安装部署mysql
1)解压安装包
2)初始化mysqld,记录生成的密码
mv mysql-8.0.43-linux-glibc2.28-x86_64 /usr/local/mysql
mkdir -p /usr/local/mysql/{data,log}
groupadd mysql
useradd -g mysql mysql
chown -R mysql.mysql /usr/local/mysql
./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize --lower-case-table-names=1
3)配置文件
[root@mysql bin]# cat /etc/my.cnf
[mysqld]
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
lower_case_table_names=1
[mysqld_safe]
log-error=/usr/local/mysql/log/error.log
pid-file=/usr/local/mysql/mysql.pid
4)设置服务器开机启动mysql
cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld && chkconfig --list mysqld
5)添加快捷方式配置环境变量
ln -s /usr/local/mysql/bin/mysql /usr/bin
配置环境变量 vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
source /etc/profile
6)服务启动 systemctl start mysqld
7)登录并修改密码
mysql -uroot -p -S /usr/local/mysql/mysql.sock
修改密码
alter user 'root'@'localhost' identified with mysql_native_password by 'xq1211';
flush privileges;
设置远程登录
create user 'root'@'%' identified by 'xq1211';
grant all privileges on . to 'root'@'%' with grant option;
flush privileges;
三、安装性能测试工具
1.安装sysbench工具
1)安装依赖包
yum install -y make automake libtool pkgconfig libaio-devel openssl-devel git
2)下载和安装sysbench
git clone https://github.com/akopytov/sysbench.git
cd sysbench
./autogen.sh
./configure --with-mysql
make && make install
2.安装tpc-h
1)下载
官网:http://www.tpc.org/ 有可能无法下载,可自行百度找到对应下载包。
2)配置
unzip TPCH_Tools.zip
cd tpch_2_17_0/dbgen/
cp makefile.suite makefile
vi makefile
CC = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
# SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS,
# SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are: TPCH
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCH
vi tpcd.h 末尾增加
#ifdef MYSQL
#define GEN_QUERY_PLAN ""
#define START_TRAN "START TRANSACTION"
#define END_TRAN "COMMIT"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit %d;\n"
#define SET_DBASE "use %s;\n"
#endif
3)执行make生成dbgen的可执行文件
4)生成tbl数据文件
./dbgen -s 1 #生成1g数据,存放在8个表中。如果之前尝试过生成数据,先make clean ,然后重新make
四、OLTP性能测试与对比
1.mysql oltp性能测试
1)生成测试数据 大约24分钟,数据量51g
# 创建tidbtest数据库
mysql -u root -p
create database tidbtest;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=Root#1234 \
--mysql-db=test \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
prepare
2)执行测试
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=xq1211 \
--mysql-db=tidbtest \
--tables=5 \
--table-size=25000000 \
--threads=64 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > mysql-result.log
3)测试结果
cat mysql-result.log
2.tidb oltp性能测试
1)生成测试数据
# 创建远程登录账号 tidb数据库上操作(需要安装mysql客户端连接)
mysql -h 127.0.0.1 -P 4000 -uroot -pXq1211@123
create user 'tidb'@'%' IDENTIFIED WITH mysql_native_password BY 'xq1211';
grant all privileges on *.* to 'tidb'@'%';
flush privileges;
# 远程登录TiDB数据库
mysql -h 192.168.96.61 -u tidb -P 4000 -pxq1211
# 创建数据库
create database tidbtest2;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=192.168.96.61 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=xq1211 \
--mysql-db=tidbtest2 \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
--mysql-ignore-errors=all \
--create_secondary=off \
--auto-inc=on \
prepare
2)执行测试
sysbench oltp_read_write \
--mysql-host=192.168.96.61 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=xq1211 \
--mysql-db=tidbtest2 \
--tables=5 \
--table-size=25000000 \
--threads=64 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > tidb-result.log
3)测试结果
cat tidb-result.log
3.oltp性能测试对比
指标 | tidb | mysql | 性能对比 |
---|---|---|---|
total transaction num | 110097 | 77420 | 快1.4倍 |
平均延迟ms | 348.85 | 496.31 | 低1.4倍 |
P95延迟ms | 450.77 | 1170.65 | 低2.6倍 |
备注:采用64线程,600s持续压力测试 |
说明:虚拟机本地环境可能优势不是很明显,但是从tps和延迟上看,和mysql对比已经有一些性能上的提升了。
五、OLAP性能测试与对比
1.mysql olap性能测试
1)生成测试数据
# 通过TPC-H生成测试数据
./dbgen -s 10 -f
# 会自动生成8个.tbl文件(lineitem, orders, part等)
# -s 10 表示生成约10GB原始文本数据
# 检查生成的tbl文件
ll *.tbl
2)mysql中创建数据库和表
# 创建数据库
mysql -u root -p
create database tpch;
# 修改TPC工具中的dss.ddl文件
vi /root/tpch_2_17_0/dbgen/dss.ddl
# 在文件开头,加入如下语句
drop database tpch;
create database tpch;
use tpch;
# 在mysql中建表
mysql -u root -p
# 在mysql命令行,执行如下命令,即可创建8张表
\. /root/tpch_2_17_0/dbgen/dss.ddl
3)创建数据导入文件load.ddl
# 在tpc-h工具的安装目录
vi load.ddl
use tpch
load data local INFILE '/root/tpch_2_17_0/dbgen/customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/region.tbl' INTO TABLE REGION FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/nation.tbl' INTO TABLE NATION FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/part.tbl' INTO TABLE PART FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/orders.tbl' INTO TABLE ORDERS FIELDS TERMINATED BY '|';
load data local INFILE '/root/tpch_2_17_0/dbgen/lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';
4)导入数据
# 导入数据
mysql -u root -p
\. /root/tpch_2_17_0/dbgen/load.ddl
# 也可以执行下面的语句
chmod +x load.ddl
source /root/tpch_2_17_0/dbgen/load.ddl
5)创建索引
# 修改dss.ri文件
-- Sccsid: @(#)dss.ri 2.1.8.1
-- tpch Benchmark Version 8.0
-- CONNECT TO tpch;
use tpch;
-- ALTER TABLE tpch.REGION DROP PRIMARY KEY;
-- ALTER TABLE tpch.NATION DROP PRIMARY KEY;
-- ALTER TABLE tpch.PART DROP PRIMARY KEY;
-- ALTER TABLE tpch.SUPPLIER DROP PRIMARY KEY;
-- ALTER TABLE tpch.PARTSUPP DROP PRIMARY KEY;
-- ALTER TABLE tpch.ORDERS DROP PRIMARY KEY;
-- ALTER TABLE tpch.LINEITEM DROP PRIMARY KEY;
-- ALTER TABLE tpch.CUSTOMER DROP PRIMARY KEY;
-- For table REGION
ALTER TABLE tpch.REGION
ADD PRIMARY KEY (R_REGIONKEY);
-- For table NATION
ALTER TABLE tpch.NATION
ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE tpch.NATION
-- ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION;
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION(R_REGIONKEY);
COMMIT WORK;
-- For table PART
ALTER TABLE tpch.PART
ADD PRIMARY KEY (P_PARTKEY);
COMMIT WORK;
-- For table SUPPLIER
ALTER TABLE tpch.SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE tpch.SUPPLIER
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.NATION(N_NATIONKEY);
COMMIT WORK;
-- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
COMMIT WORK;
-- For table CUSTOMER
ALTER TABLE tpch.CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE tpch.CUSTOMER
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.NATION(N_NATIONKEY);
COMMIT WORK;
-- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
COMMIT WORK;
-- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD PRIMARY KEY (O_ORDERKEY);
COMMIT WORK;
-- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.SUPPLIER(S_SUPPKEY);
COMMIT WORK;
ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.PART(P_PARTKEY);
COMMIT WORK;
-- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.CUSTOMER(C_CUSTKEY);
COMMIT WORK;
-- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references tpch.ORDERS(O_ORDERKEY);
COMMIT WORK;
ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
alter table CUSTOMER rename to customer ;
alter table LINEITEM rename to lineitem ;
alter table NATION rename to nation ;
alter table ORDERS rename to orders ;
alter table PART rename to part ;
alter table PARTSUPP rename to partsupp ;
alter table REGION rename to region ;
alter table SUPPLIER rename to supplier ;
COMMIT WORK;
# 创建索引
\. /root/tpch_2_17_0/dbgen/dss.ri
5)生成查询语句
# 将/tpch_2_17_0/dbgen/queries目录中的查询模板文件拷贝至dbgen目录下
cp -r ./queries/* ./
# 使用qgen生成22条SQL查询语句
cd /root/tpch_2_17_0/dbgen
# 在dbgen目录下新建query.sh文件
vi query.sh
for i in {1..22}; do /root/tpch_2_17_0/dbgen/qgen $i > /root/tpch_2_17_0/dbgen/query$i.sql; done
chmod +x query.sh
./query.sh
ll *.sql
6)修改查询语句
# 修改SQL查询语句
# TPC-H查询模板包含limit -1,在MySQL中会报错,需要批量移除
# 将所有 limit -1 替换为 limit 1
sed -i '$s/limit -1/limit 1/' query*.sql
# 去掉脚本中的 date 函数
sed -i 's/ date / /g' query*.sql
# 在个 SQL 文件的第一行 添加 use tpch; 语句
sed -i '1a use tpch; \n' *.sql
# 修改query1.sql文件
# 需要 将 where 条件的内容修改
# where
# l_shipdate <= date '1998-12-01' - interval '118' day (3)
# 修改为 如下
where
l_shipdate <= '1998-12-01' - interval '118' day
7)执行查询测试
# 执行查询语句,并记录执行时间
source query3.sql
source query5.sql
source query7.sql
source query10.sql
source query16.sql
source query20.sql
8)统计执行时间
查询对应的sql | mysql执行时间(s) |
---|---|
query3 | 814.28 |
query5 | 431.68 |
query7 | 1014 |
query10 | 55.18 |
query16 | 58.33 |
query20 | 570.15 |
2.tidb olap性能测试
1)创建数据库和表
# 创建数据库
mysql -utidb -pxq1211 -P 4000 -h 192.168.96.61
create database tpch;
use tpch;
# 创建表
source /root/tpch_2_17_0/dbgen/dss.ddl
2)导入数据
# 安装 tiup-lightning
tar -xvf tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-arm64.tar.gz
cd tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-arm64
tar -xvf tidb-lightning-v7.1.8-5.2-20250630-linux-amd64.tar.gz
tiup install tidb-lightning:v7.1.8
# 从mysql数据库中导出8张表为CSV
use tpch;
SELECT * INTO OUTFILE '/usr/local/mysql/lineitem.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM lineitem;
# 通过tiup-lightning导入数据
# CSV命名规范:tpch.LINEITEM.csv,会自动按tpch数据库LINEITEM表名导入
vi tidb-lightning.toml
[lightning]
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
backend = "local"
# 设置一个容量很大的临时目录路径
sorted-kv-dir = "/home/kv"
[mydumper]
# 指定你的 CSV 文件所在的路径
data-source-dir = "/root/csv"
[mydumper.csv]
separator = ','
delimiter = '"'
header = false # 如果 CSV 第一行是列名,改为 true
not-null = false
[tidb]
host = "192.168.96.61"
port = 4000
user = "tidb"
password = "xq1211"
status-port = 10080
pd-addr = "192.168.96.61:2379"
# 导入数据
/root/.tiup/bin/tiup tidb-lightning -config tidb-lightning.toml
3)执行查询测试
和使用mysql测试的query脚本保持一致
# 执行查询语句,并记录执行时间
source query3.sql
source query5.sql
source query7.sql
source query10.sql
source query16.sql
source query20.sql
4)统计执行时间
查询对应的sql | tidb执行时间(s) |
---|---|
query3 | 46.04 |
query5 | 34.20 |
query7 | 23.28 |
query10 | 4.31 |
query16 | 3.9 |
query20 | 60.22 |
3.olap性能测试对比
查询脚本 | tidb执行时间(s) | mysql执行时间(s) | 性能对比 |
---|---|---|---|
query3 | 46.04 | 814.28 | 提升17.9% |
query5 | 34.20 | 431.68 | 提升12.7% |
query7 | 23.28 | 1014 | 提升43.56% |
query10 | 4.31 | 55.18 | 提升12.8% |
query16 | 3.9 | 58.33 | 提升14.96% |
query20 | 60.22 | 570.15 | 提升9.5% |
复杂sql分析型查询优势明显如query7,在分布式架构中对数据聚合操作,多表关联显著高于mysql。
六、总结
首先感谢root先锋的文章,本文测试部分参考了root先锋的相关测试流程,特此感谢。
tem的优势显而易见,无论是集群版本部署,还是敏捷版本部署,通过tem可以方便快捷的进行安装部署,大大节省了人力成本。另外从运维和dba角度上看,tem的功能如备份恢复、巡检、告警等大大简化了dba的工作,从tem上可以全局了解各个集群的运行状态,并做出对应的调整。
tidb敏捷版通过和mysql的oltp和olap的性能对比,已经明显优于mysql。传统行业、银行、政府单位等需要使用oltp的场景在事务处理、延迟上tidb分布式数据库事务处理能力更强。最主要的是支持htap,根据sql的语句和表数据量自动分析到对应的tikv或tiflash进行查询,这个比传统的关系型数据库更加方便和实用。