作者: sherq1989 原文来源:https://tidb.net/blog/11a6f555
一、环境配置
1. 敏捷测试目标
完成在 tem 上安装部署 tidb 敏捷版本,进行敏捷版本和 mysql 数据库的各项功能指标测试
2. 敏捷测试数据库版本对比
TIDB:v7.1.8
Mysql:v8.0.43
3. 虚拟机及软件软件
二、环境部署
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 性能测试对比
说明:虚拟机本地环境可能优势不是很明显,但是从 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)统计执行时间
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)统计执行时间
3.olap 性能测试对比
复杂 sql 分析型查询优势明显如 query7,在分布式架构中对数据聚合操作,多表关联显著高于 mysql。
六、总结
首先感谢 root 先锋的文章,本文测试部分参考了 root 先锋的相关测试流程,特此感谢。
tem 的优势显而易见,无论是集群版本部署,还是敏捷版本部署,通过 tem 可以方便快捷的进行安装部署,大大节省了人力成本。另外从运维和 dba 角度上看,tem 的功能如备份恢复、巡检、告警等大大简化了 dba 的工作,从 tem 上可以全局了解各个集群的运行状态,并做出对应的调整。
tidb 敏捷版通过和 mysql 的 oltp 和 olap 的性能对比,已经明显优于 mysql。传统行业、银行、政府单位等需要使用 oltp 的场景在事务处理、延迟上 tidb 分布式数据库事务处理能力更强。最主要的是支持 htap,根据 sql 的语句和表数据量自动分析到对应的 tikv 或 tiflash 进行查询,这个比传统的关系型数据库更加方便和实用。
评论