1 测试目的
对平凯数据库(PingCAP TiDB)的压缩比、TEM易用性进行相关测试,了解该数据库的功能特点,并于mysql做oltp性能比对。
2 测试环境
项目 | 配置 | 操作系统 | 版本 | 数据盘 | ip |
---|---|---|---|---|---|
TEM | 4g8c | redhat7.9 | v3.1.0 | / | 192.168.40.50 |
TIDB | 8g16c | redhat7.9 | v7.1.8 | 200G | 192.168.40.51 |
MYSQL | 8g16c | redhat7.9 | 8.0.39 | 200G | 192.168.40.52 |
3 环境部署
3.1 修改操作系统配置
3.1.1 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3.1.2 关闭SELINUX
临时关闭:setenforce 0
永久关闭:vi /etc/selinux/config 修改SELINUX=disabled
3.1.3 安装openssh
yum -y install openssh
3.2 安装TEM
3.2.1 上传安装包并解压
tar -xvf tem-amd64.tar.gz
3.2.2 修改源数据库文件
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.40.50
tidb_servers:
- host: 192.168.40.50
port: 4000
tikv_servers:
- host: 192.168.40.50
3.2.3 修改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.40.50: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.40.50"
port: 8080
mirror_repo: true # 是否开启镜像仓库,多个TEM节点时,最多只允许一个节点的开启
3.2.4 安装tem
./install.sh
su - tidb
source /home/tidb/.bash_profile
export TIUP_HOME=/tem-deploy/.tem
3.2.5 登录tem
账号密码都为admin,内网为192.168.40.50,外网为10.251.22.73
3.3 TEM部署Tidb
3.3.1 添加凭证
TEM设置-凭证-主机-添加凭证,输入tidb虚拟机服务器的用户名和密码
3.3.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.3.3 配置中控机
主机-集群管理中控机-添加中控机
IP地址:192.168.40.51
名称:tidb651
ssh端口:22
服务端口:8090
服务根目录:/root/tidb-cm-service
自动安装TIUP
元数据目录:/root/.tiup
3.3.4 配置集群主机
主机-主机-添加共享主机
3.3.5 创建集群
集群-创建集群 输入集群名称、密码、选择集群中控机,集群种类选择敏捷模式,部署模式共享。
选中添加相关组件:pingkaidb-fusion、tiflash、Prometheus、grafana、alertmanager
安装完成
3.3.6 优化集群参数
# 调整集群参数
set global tidb_runtime_filter_mode=LOCAL;
set global tidb_opt_enable_mpp_shared_cte_execution=on;
set global tidb_rc_read_check_ts=on;
set global tidb_analyze_skip_column_types="json,blob,mediumblob,longblob,mediumtext,longtext";
set global tidb_enable_collect_execution_info=off;
set global tidb_enable_instance_plan_cache=on;
set global tidb_instance_plan_cache_max_size=2GiB;
set global tidbx_enable_tikv_local_call=on;
set global tidbx_enable_pd_local_call=on;
set global tidb_schema_cache_size=0;
-- 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
set global tidb_enable_slow_log=off;
3.4 安装MySQL
(1)安装MySQL、设定用户
#移除mariadb
yum -y remove mariadb*
# 4 添加MySQL仓库(适用于redhat7.9)
yum install install https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
yum module disable mysql # 禁用默认模块
# 5 安装指定版本MySQL
yum -y install mysql-community-server-8.0.39-1.el7 --nogpgcheck
yum install mysql-community-devel-8.0.39-1.el7.x86_64 --nogpgcheck
# 6 启动MySQL
systemctl start mysqld # 启动MySQL
systemctl enable mysqld # 设置开机启动
systemctl status mysqld # 检查状态
# 7 登录MySQL
mysql -u root -p #第一次登录时会要求设置密码
# 8 如没有,可在日志中查找临时密码
grep 'temporary password' /var/log/mysqld.log
# 9 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root_123';
# 10 设置远程登录
CREATE USER 'root'@'%' IDENTIFIED BY 'Root_123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
(2)优化MySQL参数
# 11 在/etc/my.cnf配置文件中增加如下参数
[mysqld]
innodb_buffer_pool_size = 12G
innodb_flush_log_at_trx_commit = 0
sync_binlog = 0
local-infile = 1 # 支持本地文件导入
[client]
loose-local-infile=ON
# 12 innodb_buffer_pool_size = 12G # 建议设为物理内存的70-80%
记得重启数据库
systemctl restart mysqld
3.5 OLTP性能测试
3.5.1 安装Sysbench工具
# 安装依赖包
yum install -y make automake libtool pkgconfig libaio-devel openssl-devel git
#下载tar.gz安装包
git clone https://github.com/akopytov/sysbench.git
tar xvf sysbench-1.0.20.tar.gx
cd sysbench
./autogen.sh
CFLAGS="-std=gnu99" ./configure --with-mysql #redhat7.9需要设置`CFLAGS`环境变量来启用C99标准。
make && make install
# 确认是否安装成功
sysbench --version
3.5.2 mysql性能测试
(1)生成测试数据
# 创建test数据库
mysql -u root -p
create database test;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=Root_123 \
--mysql-db=test \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
prepare
# --tables=5
#生成5张表# --table-size=25000000
#单表2500万行数据
# 数据约52G,执行时间约2个小时
2)执行测试(测试时cpu飙升,内存没啥变化)
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=Root_123 \
--mysql-db=test \
--tables=5 \
--table-size=25000000 \
--threads=64 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > mysql-result.log
3)查看测试结果
# 查看执行结果
more mysql-result.log | grep "transactions:"
more mysql-result.log | grep "avg:"
more mysql-result.log | grep "95th percentile:"
# grep "transactions:" # TPS
# grep "avg:" # 平均延迟
# grep "95th percentile:" # P95延迟
3.5.3 TiDB性能测试
(1)生成测试数据
# 创建远程登录账号
create user 'tidb'@'%' IDENTIFIED WITH mysql_native_password BY 'Root_123';
grant all privileges on *.* to 'tidb'@'%';
flush privileges;
# 远程登录TiDB数据库
mysql -h 192.168.40.51 -u tidb -P 4000 -p
# 创建数据库
create database titest;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=192.168.40.51 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=Root_123 \
--mysql-db=titest \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
--mysql-ignore-errors=all \
--create_secondary=off \
--auto-inc=on \
prepare
#大概耗时两小时10分钟
(2)执行测试
sysbench oltp_read_write \
--mysql-host=192.168.40.51 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=Root_123 \
--mysql-db=titest \
--tables=5 \
--table-size=25000000 \
--threads=128 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > tidb-result.log
(3)查看测试结果
# 查看执行结果
more tidb-result.log | grep "transactions:"
more tidb-result.log | grep "avg:"
more tidb-result.log | grep "95th percentile:"
(1)先压缩:手动 compact 或等待自动 compact 的完成
https://docs.pingcap.com/zh/tidb/stable/tikv-control/#手动-compact-单个-tikv-的数据
cd /root/.tiup/bin
./tiup ctl:v7.1.8-5.2-20250630 tikv --pd="127.0.0.1:2379" compact-cluster
(2)再查看
(1)表逻辑大小
# 方法1:查看 TiKV 中测试表的逻辑大小
SELECT SUM(data_length + index_length) AS total_logical_size
FROM information_schema.TABLES
WHERE table_schema = 'titest' AND table_name IN ('sbtest1', 'sbtest2', 'sbtest3', 'sbtest4', 'sbtest5');
# 方法2:
SELECT
table_name,
DATA_LENGTH,
INDEX_LENGTH,
(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 / 1024 AS total_size_GB
FROM information_schema.TABLES
WHERE table_schema = 'titest';
- 逻辑大小:8074344377 ÷ 1073741824 ≈ 7.52G
(2)表占用物理磁盘大小
- 通过TEM-参数查询,组件选择TiKV,字段data-dir,查询TiKV具体的存储路径。
- 登录tikv主机,查看目录大小
# 登录tikv主机,查看数据目录大小
du -sh /tidb1/tidb-data/tikv-20160/db
物理磁盘占用大小:13 GB
3.7 TEM易用性
3.7.1 支持集群部署以及纳管
3.7.2 支持sql语句分析
3.7.3 支持生成巡检报告
3.8 总结
首先感谢Root先锋大佬的文章提供的测试思路,因为实验的物理机磁盘时机械硬盘,可能对测试结果有一些影响。
(1)TEM的方便了数据库的管理,利用这个平台可以实现集群的快速部署、已有集群的纳管,以及对数据库健康状态的实时监控。 (2)Tidb使用RocksDB作为底层存储,其压缩过程由后台自动触发。其逻辑大小/物理大小大约为0.57,具有较好的压缩性。 (3)吞吐能力高,能达到1.6万/秒(TPS)。 (4)平均延迟低。