0
0
0
0
专栏/.../

给敏捷模式做下体检——多方位平凯数据库TiDB敏捷模式和MySQL的性能测试(上)|金融行业可参考

 TiDBer_FvfLzhd0  发表于  2025-09-19

一、前言

  1. 企业 & 行业背景

本人从事金融行业运维工作,日常工作中偶尔涉及数据库相关操作。在当前信息技术应用创新和国产化替代的背景下,大环境下正积极引入具备分布式架构、强一致性且具备良好扩展性的数据库产品。TiDB 作为一款领先的分布式 NewSQL 数据库,其“敏捷模式”吸引了我的关注,本次重点围绕该模式展开技术调研与测试验证。

  1. 目前遇到的数据库挑战

随着业务规模不断扩大和监管政策趋严,行业临诸多关键挑战:传统集中式数据库(如Oracle、MySQL)在面对高并发实时交易和海量数据批量处理时扩展能力有限,运维复杂度高、成本攀升;同时,在国产化转型过程中,需保障系统平滑迁移、数据一致性及业务连续性,对数据库产品的兼容性、稳定性及生态完整性提出了极高要求。

3.敏捷模式的体验总结

敏捷模式的使用体验TiDB 在敏捷模式下表现良好,通过标准基准测试及真实业务仿真,其在写入吞吐量、低延迟查询和故障恢复等关键指标上均符合预期,展现出良好的技术成熟度和工程可用性。

二、平凯数据库敏捷模式功能体验

本测试案例及数据分析均由研究者独立完成。鉴于个人研究条件的局限性,实验设计可能存在优化空间,数据采集与处理环节或有待完善之处。诚挚欢迎同行专家与读者对研究中任何不当之处提出宝贵意见。

1. 敏捷模式集群部署

1.1 概述

体验 TiDB 敏捷模式的部署与管理流程,通过 TiDB TEM 快速部署一套 TiDB 敏捷版集群,并验证其基本功能与性能优化效果。

1.2.环境部署

1.2.1 硬件配置

  • TiDB 服务器:1台 8核16GB内存
  • TEM 管理服务器:1台 2核4GB内存
  • 操作系统:RHEL 9.2 x86_64

2.2 软件准备

  • 配置阿里云 CentOS Stream 9 yum 源
  • 安装必要软件包:openssh-clients, openssh-server, tar
  • 关闭防火墙和 SELinux
  • 配置 SSH 互信

1.2.3 TEM 部署流程

系统初始化

# 配置yum源
cat > /etc/yum.repos.d/ali.repo << EOF
[ali_baseos]
name=Aliyun CentOS Stream 9 - BaseOS
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/
enabled=1
gpgcheck=0

[ali_appstream]
name=Aliyun CentOS Stream 9 - AppStream
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/
enabled=1
gpgcheck=0
EOF

# 安装基础软件
yum -y install openssh-clients openssh-server tar

# 关闭防火墙和SELinux
systemctl stop firewalld.service
systemctl disable firewalld.service
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# 配置SSH互信
su - tidb
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.151.101

TEM 安装

  1. 下载 TEM 安装包(tem-package-v3.0.0-linux-amd64.tar.gz)
  2. 解压并进入目录
  3. 修改配置文件中的 IP 地址为 TEM 主机 IP

image.png

4.执行 install.sh 完成安装

image.png

# 访问TEM,http://<TEM 部署ip地址>:<port>/login

TEM 默认⽤户为 admin, 默认密码为 admin(请在登录后在 TEM 页面-设置-用户与角色-用户尽快修改)。

通过 http://192.168.151.100:8080/login 访问 TEM

  • 默认用户:admin
  • 默认密码:admin

1.2.4 TiDB 敏捷集群部署

TEM 配置

  1. 配置凭证:设置 → 凭证 → 主机 → 添加凭证

image.png

2.导入组件:设置 → 组件管理 → 添加组件(导入 TiDB 敏捷模式安装包)image.png

3.配置中控机:主机 → 集群管理中控机 → 添加中控机

image.png

  • IP 地址:中控机 IP
  • SSH 端口:22(默认)
  • 服务端口:9090(默认)
  • 凭证:之前添加的 SSH 凭证
  • 服务根目录:/root/tidb-cm-service
  • 启用自动安装 TiUP

添加主机

  • 主机 → 主机 → 添加共享主机
  • 填写主机 IP、SSH 端口和对应凭证
  • image.png

创建集群

  1. 集群 → 创建集群
  2. 配置集群基本信息: image.png
    • 集群名称:自定义
    • Root 用户密码:设置数据库 root 密码
    • CPU 架构:x86_64
    • 部署用户:tidb
  3. 选择中控机和集群版本
  4. 选择"共享"部署模式
  5. 规划集群节点:
    • 必须组件:PingKaiDB Fusion、Grafana、Prometheus、Alertmanager
    • 可选组件:TiFlash(用于 HTAP 功能测试)
  6. 完成创建并等待集群部署完成image.png

1.2.5 集群验证

通过 TiDB Dashboard 验证

image.png

  • 访问地址:{pd-ip}:{pd-port}/dashboard
  • 使用 root 用户和设置的密码登录
  • 验证集群各组件状态正常

通过 Grafana 监控验证

image.png

  • 访问地址:{Grafana-ip}:3000
  • 默认账户:admin/admin
  • 查看 Overview 页面,确认监控数据正常

Prometheus 检查

image.png

1.2.6.集群优化

image.png

通过 TEM SQL 编辑器执行以下优化参数:

-- 调整集群性能参数
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;
set global tidb_enable_slow_log=off;

1.2.7.MySQL 部署与配置

MySQL 8.4 安装

# 下载并安装MySQL仓库
wget -c https://dev.mysql.com/get/mysql84-community-release-el9-5.noarch.rpm
sudo rpm -ivh mysql84-community-release-el9-5.noarch.rpm

# 安装MySQL服务器
sudo yum reinstall mysql-community-server

# 启动MySQL服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

MySQL 优化配置

在 /etc/my.cnf.d/mysql-server.cnf 中添加:

[mysqld]
innodb_buffer_pool_size = 12G
innodb_flush_log_at_trx_commit = 0
sync_binlog = 0
local-infile = 1

1.2.8 测试工具部署

部署sysbench

1. 概览

  • Sysbench 用于 OLTP 场景(短事务、高并发),我们以 oltp_read_write 为示例。Sysbench 通过 MySQL 协议连接到 TiDB 的 MySQL 端口。
  • 记录每一步的时间戳与日志,便于后续把性能变化与扩容操作关联。

2. 安装 Sysbench

sudo yum groupinstall "Development Tools" -y
sudo yum install -y openssl-devel mariadb-devel
sudo yum install -y epel-release
sudo yum install -y sysbench

校验:

sysbench --version

3. Sysbench 使用示例(在 TiDB 上执行 OLTP 测试)

准备数据库(在 TiDB 上创建 sbtest DB)

# 在任意客户端连接 TiDB:
mysql -h 192.168.151.101 -P4000 -u root -p
# 创建数据库并退出
CREATE DATABASE sbtest;

准备 sysbench 数据(在压力机上)

示例命令:

export MYSQL_PWD='Tidb123!'
sysbench oltp_read_write \
  --db-driver=mysql \
  --mysql-host=192.168.151.101 \
  --mysql-port=4000 \
  --mysql-user=root \
  --mysql-db=sbtest \
  --mysql-password=$MYSQL_PWD \
  --tables=5 \
  --table-size=2000000 \
  --threads=64 \
  --time=600 \
  --report-interval=10 \
  prepare
  • --tables--table-size 根据测试需求调整。
  • prepare 阶段会在 sbtest 下建立表并插入数据。

运行(示例)

sysbench oltp_read_write --db-driver=mysql \
  --mysql-host=192.168.151.101 --mysql-port=4000 \
  --mysql-user=root --mysql-db=sbtest --mysql-password=$MYSQL_PWD \
  --threads=64 --time=600 --report-interval=10 run > sysbench_run.log 2>&1

清理

sysbench ... cleanup

关键命令

Sysbench prepare / run / cleanup



# prepare
sysbench oltp_read_write --db-driver=mysql \
  --mysql-host=192.168.151.101 --mysql-port=4000 \
  --mysql-user=root --mysql-db=sbtest --mysql-password=$MYSQL_PWD \
  --tables=5 --table-size=2000000 --threads=64 prepare

# run
sysbench oltp_read_write --db-driver=mysql \
  --mysql-host=192.168.151.101 --mysql-port=4000 \
  --mysql-user=root --mysql-db=sbtest --mysql-password=$MYSQL_PWD \
  --threads=64 --time=600 --report-interval=10 run > sysbench_run.log 2>&1

# cleanup
sysbench ... cleanup

3. 性能进行对比分析

TiDB 与 MySQL Sysbench OLTP 性能测试对比

3.1 概述

本报告基于标准的 Sysbench OLTP 基准测试,对比了 TiDB 和 MySQL 在两个关键维度的性能表现:吞吐量 和 延迟。测试采用 128 个并发线程,持续运行约 10 分钟,以模拟高并发压力场景。

3.2 测试配置

项目 参数
测试工具 Sysbench 1.1.0
测试类型 OLTP (Read/Write)
并发线程数 128
数据量 5 张表,每张表 25000000 行
总测试时长 ~600 秒
监控指标 TPS, QPS, 95%延迟

3.3 总体性能数据对比

性能指标 MySQL TiDB 差值 性能提升
总事务数 (Transactions) 12,500 18,179 +5,679 +45.4%
平均 TPS 20.68 30.23 +9.55 +46.2%
总查询数 (Queries) 250,000 363,580 +113,580 +45.4%
平均 QPS 413.70 604.62 +190.92 +46.2%
平均延迟 (Avg Latency) 6161.54 ms 4230.85 ms -1930.69 ms -31.3%
95% 延迟 (95th Latency) 10722.67 ms 7346.49 ms -3376.18 ms -31.5%
最大延迟 (Max Latency) 96548.47 ms 12082.19 ms -84466.28 ms -87.5%

结论:在吞吐量(TPS/QPS)和延迟(平均延迟、95%延迟、最大延迟)所有关键指标上,TiDB 优于 MySQL,性能提升约 46%,延迟降低约 31%。

3.4 详细分析

3.4.1 吞吐量 随时间变化分析

  • TiDB:

    • 启动后快速爬升,在 40 秒后进入稳定状态。
    • 在整个测试过程中表现极其稳定,TPS 稳定在 25-35 之间,且后期随着可能的热点优化,性能略有提升,峰值达到 37.29。
    • 体现了分布式架构良好的扩展性和稳定性。
  • MySQL:

    • 启动阶段性能波动巨大。
    • 在 130s 至 150s 期间,出现了长达 20秒 的性能崩溃,TPS 降至 0。这通常是由于严重的锁竞争、缓冲池不足、或磁盘 I/O 瓶颈导致的系统僵死。
    • 恢复后性能波动依然明显,TPS 在 20-25 之间震荡。

3.4.2 延迟 (95th Percentile) 随时间变化分析

  • TiDB:

    • 初始延迟较高,但迅速下降。
    • 整个测试期间,95% 延迟非常稳定地集中在 6000ms - 8000ms 之间,表现出良好的性能。
  • MySQL:

    • 延迟表现不稳定,出现了多次延迟尖峰。
    • 在测试中期(100s-200s),95% 延迟多次飙升至 20000ms (20秒) 以上,甚至最高达到 ~65000ms (65秒)。
    • 这意味着在此期间,95% 的用户请求需要等待数十秒才能得到响应。

稳定性与可靠性分析

  • TiDB:测试曲线平滑,无异常抖动或中断,证明了其分布式架构在高并发负载下的卓越稳定性。
  • MySQL:出现了严重的性能中断和极高的延迟抖动,表明在 128 线程的高并发压力下,单机架构遇到了严重的资源竞争或瓶颈。

3.5. 结论

结论

在此次 Sysbench OLTP 高并发测试中,TiDB 在性能、延迟和稳定性方面全方位显著优于 MySQL。

  1. 性能:TiDB 的吞吐量比 MySQL 高出 46%。
  2. 延迟:TiDB 的 95% 延迟比 MySQL 低 31%,且最大延迟降低了 87%,表现更加优秀。
  3. 稳定性:TiDB 提供了平滑稳定的性能输出,而 MySQL 出现了长时间的性能崩溃和剧烈的延迟抖动。


4. 压缩比测试

4.1 测试目标

  • 对比对象:TiDB(使用 TiKV 存储引擎,默认启用压缩) vs MySQL(使用 InnoDB 存储引擎)。
  • 核心指标压缩比,计算公式为 MySQL 数据物理大小 / TiDB 数据物理大小

4.2 测试环境与数据准备

  • 测试数据:使用 Sysbench 的 oltp_write_only 脚本在两库中生成完全相同的测试数据集(sbtest 库下的 sbtest1sbtest5 表)。
  • 数据规模:确保两库中的数据行数及表结构完全一致。经查询,两库中 5 张表的总行数均约为 1.28 亿行

4.3 测试步骤

确保 TiKV 压缩完成

  • 使用RocksDB作为底层存储,其压缩过程由后台自动触发。为确保数据压缩到最紧凑状态,在测量前手动触发全集群压缩并等待完成。
  • # 登录到 TiKV 节点机器,找到 tikv-ctl 工具路径
  • image.png
  • 操作命令
    # 使用 tiup 工具连接任一 TiKV 节点并执行压缩命令
    tiup ctl:<cluster-version> tikv --host <tikv-ip>:<tikv-status-port> compact-cluster
    
  • 等待压缩操作在后台完全结束(通常需等待数十分钟,取决于数据量)。
  • image.png
  1. 测量物理磁盘空间

    • MySQL:测量其数据目录的总大小。 image.png
      # 假设 MySQL 数据目录为 /var/lib/mysql
      du -sh /var/lib/mysql
      # 输出:51G
      
    • TiDB:测量所有 TiKV 实例数据目录的总大小。 image.png
      # 假设 TiKV 数据目录为 /tidb1/tidb-data
      du -sh /tidb1/tidb-data
      # 输出:27G
      
  2. 查询逻辑数据大小

    • 分别在 MySQL 和 TiDB 中执行 SQL,查询测试表的逻辑数据长度,用于辅助分析压缩效率。
    • 查询语句
      SELECT
          table_name AS 'Table',
          round(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)',
          table_rows AS 'Rows'
      FROM information_schema.TABLES
      WHERE table_schema = 'sbtest' AND table_name LIKE 'sbtest%'
      ORDER BY table_name;
      
      
      

tidb:

  • image.png

mysql:

  • image.png

4.4 测试结果与分析

1. 物理磁盘空间使用对比

数据库 物理磁盘空间使用量
MySQL 51 GB
TiDB 27 GB
  • 压缩比计算:51 GB / 27 GB ≈ 1.96
  • 结论:在此测试中,TiDB 的存储效率约为 MySQL 的 2 倍。存储相同规模的数据,TiDB 所需磁盘空间比 MySQL 节省了近 50%。

2. 逻辑数据大小对比(参考)

数据库 逻辑数据大小 (MB) 总行数 (百万) 行存储密度 (行/MB)
MySQL 25,551 ~123 ~4,813
TiDB 1,964 ~128 ~65,200
  • 分析:逻辑大小与物理大小的差异揭示了不同的存储机制。TiDB 显示出极高的逻辑行存储密度,这得益于其优化的存储格式和压缩算法。而物理大小的对比则直接体现了压缩算法在磁盘上的实际节省效果。

4.5 综合结论

  1. 优秀的压缩能力:TiDB 凭借其先进的存储引擎和默认启用的压缩算法,在此次测试中实现了 1.96:1 的压缩比,显著降低了磁盘空间使用,存储成本降低。
  2. 性能与压缩的平衡:结合前面的性能测试可知,TiDB 在提供高达 46% 性能提升的同时,并未因压缩操作而牺牲性能或带来显著延迟。其压缩过程在后台异步进行,对前端业务影响极小。
  3. 成本效益显著:对于数据密集型应用,采用 TiDB 不仅可以获得更好的性能和高可用性,还能有效削减存储成本,实现“降本增效”的双重目标。

5. Online DDL测试

5.1 概述

对比MySQL和TiDB数据库在持续OLTP读写负载下执行各类DDL操作时的性能表现和对在线业务的影响。测试通过Sysbench模拟业务压力,并在后台执行13种不同类型的DDL操作,通过DDL执行时间和Sysbench TPS波动两个关键指标来评估数据库的Online DDL能力。

5.2 测试环境与方法

5.2.1 环境配置

  • 数据库版本: mysql 8.4.6, TiDB 敏捷模式
  • 硬件配置: VMware虚拟机,8核CPU,16GB内存,普通SSD
  • 测试表: sbtest1 (约200万行数据)
  • 负载工具: Sysbench 1.0.20+
  • 并发设置: 8线程
  • 测试时长: 单次DDL测试时间不等,总测试时间较长

5.2.2 测试方法

  1. 数据初始化: 使用Sysbench准备sbtest1表,包含约200万行数据。

创建主测试表

CREATE TABLE IF NOT EXISTS `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 负载模拟: 使用Sysbench oltp_read_write脚本,启动8个线程,进行持续的读写混合负载

3. 性能监控: Sysbench每秒报告一次TPS(每秒事务数)、QPS、延迟及错误率。

4. DDL执行: 在负载稳定运行后,在后台依次执行13项预定义的DDL操作。每个DDL操作后等待系统稳定.

5. 度量标准:

  • DDL执行时间 (秒): 从执行开始到结束的耗时。

3. 详细DDL操作对比分析

DDL操作类型

MySQL执行时间(秒) MySQL TPS影响 TiDB执行时间(秒) TiDB TPS影响 性能差异
增加索引 29.597 1303→0  9.231 66-146  TiDB快3.2倍
删除索引 26.181 停止26秒 0.639 136-152  TiDB快41倍
重命名索引 0.056 1146-1227  0.231 121-132 MySQL快4.1倍
混合索引操作 523.766 多次降至0,持续500+秒 19.453 58-149 TiDB快27倍
添加VIRTUAL列 20.611 1334→0  0.64 91-129  TiDB快32倍
删除VIRTUAL列 0.064 几乎无影响 0.703 128-138 MySQL快11倍
修改列为NULL 26.85 1306→0  0.19 126-140  TiDB快141倍
设列默认值 30.151 1334→0 (完全停止) 0.231 122-145  TiDB快131倍
修改自增列值 0.056 1213-1278  0.161 122-143  MySQL快2.9倍
增加列类型长度 250.773 多次降至0,持续250秒 0.202 119-139  TiDB快1241倍
中间加列 0.057 1313-1417  0.755 119-141  MySQL快13.2倍
重排列 126.051 0-63  0.197 121-132  TiDB快640倍
修改列类型 295.31 多次降至0,持续295秒 90.667 129→46  

DDL 1: 增加索引(普通索引)

ALTER TABLE sbtest1 ADD INDEX idx_k (k);

指标

  • TiDB:执行时间 ~9.23 s;平均 TPS 117.95;最低 66.99
  • MySQL:执行时间 ~29.60 s;平均 TPS 87.39;最低 0.00(存在多次归零/阻塞片段),最大峰值日志记录偏高
  • 分析TiDB 在建索引期间并未把写入完全阻塞(TPS 有下降但未归零),耗时显著短于 MySQL(约为 MySQL 的 31%)。MySQL 在索引构建阶段出现长期或间歇性 TPS 为 0,说明表重建/写锁导致业务可写中断或短暂失去吞吐。

DDL 2: 删除索引

ALTER TABLE sbtest1 DROP INDEX idx_k;

指标

  • TiDB:执行时间 ~0.64 s;TPS 保持 136–152
  • MySQL:执行时间 ~26.18 s;平均 TPS 0.59,最小 0.00(长期为 0)
  • 分析TiDB 删除索引几乎瞬时完成,对并发写入无影响。MySQL 删除索引在本次测试表现为需要重建/重写,导致业务在该操作期间完全中断。

DDL 3: 重命名索引

ALTER TABLE sbtest1 RENAME INDEX idx_old TO idx_new;

指标

  • TiDB:执行时间 ~0.231 s;平均 TPS 126.51
  • MySQL:执行时间 ~0.056 s;平均 TPS 1192.66,分析双方均为瞬时/元数据级操作,几乎不影响并发写入。MySQL 在此类元数据操作上表现非常快速,TiDB 也表现良好。

DDL 4: 混合索引操作(增/删索引混合)

ALTER TABLE sbtest1 ADD INDEX idx_k2(k), DROP INDEX idx_c_renamed, ADD INDEX idx_pad(pad);

指标

  • TiDB:执行时间 ~19.45 s;平均 TPS 101.60;最低 58.83
  • MySQL:执行时间 ~523.77 s(非常长);平均 TPS 26.34;最低 0.00(长时阻塞)
  • 分析此类复合操作对 MySQL 极为不友好(本次几乎耗时 8.7 分钟且伴随长时间 TPS 为 0),而 TiDB 能在较短时间内并行完成,吞吐影响有限。混合索引变更是 MySQL 的高风险项。

DDL 5: 添加 VIRTUAL 列(生成列)

ALTER TABLE sbtest1 ADD COLUMN vcol INT AS (k + 1) VIRTUAL;

指标

  • TiDB:执行时间 ~0.64 s;平均 TPS 116.67;最低 91.04
  • MySQL:执行时间 ~20.61 s;平均 TPS 10.76;最低 0.00
  • 分析TiDB 添加虚拟列几乎无侵入;MySQL 在本测试中添加虚拟列导致显著写入中断/抖动,因此 MySQL 的生成列添加在该版本下表现不稳定。

DDL 6: 删除 VIRTUAL 列

ALTER TABLE sbtest1 DROP COLUMN vcol;

指标

  • TiDB:执行时间 ~0.703 s;平均 TPS 132.66
  • MySQL:执行时间 ~0.064 s;平均 TPS 1225.08
  • 分析删除生成列对两者均为快操作(MySQL 在删除时表现也很好)。因此删除虚拟列不是问题点。

DDL 7: 修改列为 NULL

ALTER TABLE sbtest1 MODIFY COLUMN txt_col VARCHAR(50) NULL;

指标

  • TiDB:执行时间 ~0.19 s;平均 TPS 134.43
  • MySQL:执行时间 ~26.85 s;平均 TPS 48.71;最低 0.00
  • 分析TiDB 几乎瞬时完成该元数据/小变更。MySQL 在此项上表现差很多并有阻塞,说明 MySQL 在一些列属性变更上仍可能触发表重建/阻塞路径。

DDL 8: 设列默认值

ALTER TABLE sbtest1 ALTER COLUMN txt_col SET DEFAULT 'x';

指标

  • TiDB:执行时间 ~0.231 s;平均 TPS 131.12
  • MySQL:执行时间 ~30.151 s;平均 TPS 110.56;最低 0.00(有短阻塞)分析TiDB 快速完成,MySQL 耗时较长且存在 TPS 归零片段(影响不如某些长阻塞那么严重,但仍需注意)。

DDL 9: 修改自增列值

ALTER TABLE sbtest1 AUTO_INCREMENT = 2000000;

指标

  • TiDB:执行时间 ~0.161 s;平均 TPS 131.14
  • MySQL:执行时间 ~0.056 s;平均 TPS 1238.02分析此类为典型元数据操作,双方均为瞬时完成且对业务无影响。

DDL 10: 增加列类型长度

ALTER TABLE sbtest1 MODIFY varchar_col VARCHAR(255);

指标

  • TiDB:执行时间 ~0.202 s;平均 TPS 130.50
  • MySQL:执行时间 ~250.773 s;平均 TPS 16.40;最低 0.00分析TiDB 对“扩展列长度”处理非常高效(几乎瞬时),而 MySQL 需要大量时间且在此过程里写入接近停滞。对于大表,这类差异会被放大。

DDL 11: 中间加列

ALTER TABLE sbtest1 ADD COLUMN mid_col INT AFTER k;

指标

  • TiDB:执行时间 ~0.755 s;平均 TPS 132.75
  • MySQL:执行时间 ~0.057 s;平均 TPS 1377.95分析两者均快速完成。MySQL 在“中间加列”上的快速完成可能与该版本支持在不重写全表的情况下完成该变更,或日志采样时的特殊性。总之该项不是主要风险点。

DDL 12: 重排列

ALTER TABLE sbtest1 MODIFY COLUMN middle_col INT DEFAULT 0 AFTER pad;

指标

  • TiDB:执行时间 ~0.197 s;平均 TPS 127.35
  • MySQL:执行时间 ~126.051 s;平均 TPS 2.82;最低 0.00分析TiDB 能在线重排列而耗时极短;MySQL 在本次测试中需要长时间复制/重建表,导致业务基本停顿。若需在 MySQL 上重排列序,必须提前规划维护窗口或使用在线 schema-change 工具。

DDL 13: 修改列类型

ALTER TABLE sbtest1 MODIFY COLUMN char_col VARCHAR(20);

指标

  • TiDB:执行时间 ~90.667 s;平均 TPS 76.36;最低 0.00(存在短时停顿)
  • MySQL:执行时间 ~295.310 s;平均 TPS 5.11;最低 0.00(长期停滞)
  • 分析修改列类型属于需要“重写数据”的重型 DDL。TiDB 用时显著低于 MySQL(约 1/3),且恢复更快;MySQL 在近 5 分钟的窗口里对写入几乎完全阻塞。对大表生产环境影响尤为严重。

总体结论:在本次 8 线程、200 万行表的并发写入场景下,TiDB 的 Online DDL 能力优于 MySQL:多数 DDL 在 TiDB 上是在线、耗时短且对 DML 影响小;MySQL 在涉及表重写/重建的 DDL(例如混合索引变更、改列类型/长度、删除索引、重排列等)中会出现严重阻塞。

6. 数据迁移体验

6.1 概述

记录和总结使用 TiDB Data Migration (DM) 工具,从 MySQL 数据库到 TiDB 集群进行全量及增量数据迁移的实际操作体验。本次迁移基于官方推荐的单服务器架构进行,流程涵盖了环境准备、DM集群部署、数据源配置、迁移任务创建与执行等关键环节,使用 TiDB DM 迁移的流程如下图所示。

dm

6.2 测试环境配置

组件 配置 说明
服务器 8 vCPU, 16 GB RAM 符合官方推荐的最小生产环境配置,用于部署整套DM集群
部署用户 tidb 遵循最小权限原则,推荐使用普通用户进行安装和管理。
上游 MySQL 版本 5.7+, 开启 GTID 迁移的必要前提条件。
下游 TiDB 敏捷模式单节点 已存在一个可供连接的TiDB集群(端口4000)。
DM 集群 v9.0.0-beta.1 包含1个 DM-master, 1个 DM-worker 及监控组件 (Prometheus/Grafana)。

6.3 迁移操作流程

前提条件

  • 使用 TiUP 安装 DM 集群
  • DM 所需上下游数据库权限

6.3.1 使用 TiUP 安装 DM 集群

在中控机上安装 TiUP 组件

使用普通用户登录中控机,以 tidb 用户为例,后续安装 TiUP 及集群管理操作均通过该用户完成:

执行如下命令安装 TiUP 工具:
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

安装完成后,~/.bashrc 已将 TiUP 加入到路径中,新开一个终端或重新声明全局变量 source ~/.bashrc 来使用 TiUP。

 6.3.2.安装 TiUP DM 组件:

tiup install dm dmctl

image.png

编辑初始化配置文件

请根据不同的集群拓扑,编辑 TiUP 所需的集群初始化配置文件。

请根据配置文件模板,新建一个配置文件 topology.yaml。如果有其他组合场景的需求,请根据多个模板自行调整。

可以使用 tiup dm template > topology.yaml 命令快速生成配置文件模板。

部署 1个 DM-master、1个 DM-worker 与 1 个监控组件的配置如下:

# The topology template is used deploy a minimal DM cluster, which suitable
# for scenarios with only three machinescontains. The minimal cluster contains
# - 3 master nodes
# - 3 worker nodes
# You can change the hosts according your environment
---
global:
  user: "tidb"
  # systemd_mode: "system"
  ssh_port: 22
  deploy_dir: "/home/tidb/dm/deploy"
  data_dir: "/home/tidb/dm/data"
  # arch: "amd64"


master_servers:
  - host: 192.168.151.103
    name: master1
    ssh_port: 22
    port: 8261
    # peer_port: 8291
    # deploy_dir: "/home/tidb/dm-deploy/dm-master-8261"
    # data_dir: "/home/tidb/dm-data/dm-master-8261"
    # log_dir: "/home/tidb/dm-deploy/dm-master-8261/log"
    # numa_node: "0,1"
    # 下列配置项用于覆盖 `server_configs.master` 的值。
    config:
      log-level: info
      # rpc-timeout: "30s"
      # rpc-rate-limit: 10.0
      # rpc-rate-burst: 40

worker_servers:
  - host: 192.168.151.103
    ssh_port: 22
    port: 8262
    # deploy_dir: "/home/tidb/dm-deploy/dm-worker-8262"
    # log_dir: "/home/tidb/dm-deploy/dm-worker-8262/log"
    # numa_node: "0,1"
    # 下列配置项用于覆盖 `server_configs.worker` 的值。
    config:
      log-level: info
  

monitoring_servers:
  - host: 192.168.151.103
    ssh_port: 22
    port: 9090
    # deploy_dir: "/home/tidb/tidb-deploy/prometheus-8249"
    # data_dir: "/home/tidb/tidb-data/prometheus-8249"
    # log_dir: "/home/tidb/tidb-deploy/prometheus-8249/log"

grafana_servers:
  - host: 192.168.151.103
    port: 3000
    # deploy_dir: /home/tidb/tidb-deploy/grafana-3000

alertmanager_servers:
  - host: 192.168.151.103
    ssh_port: 22
    web_port: 9093
    # cluster_port: 9094
    # deploy_dir: "/home/tidb/tidb-deploy/alertmanager-9093"
    # data_dir: "/home/tidb/tidb-data/alertmanager-9093"
    # log_dir: "/home/tidb/tidb-deploy/alertmanager-9093/log"

按照自己测试的情况配置好文件后部署dm工具

tiup dm deploy dm-test v9.0.0-beta.1 ./topology.yaml --user root -p

image.png

查看 TiUP 管理的集群情况

tiup dm list

TiUP 支持管理多个 DM 集群,该命令会输出当前通过 TiUP DM 管理的所有集群信息,包括集群名称、部署用户、版本、密钥信息等:

Name  User  Version  Path                                  PrivateKey----  ----  -------  ----                                  ----------dm-test  tidb  ${version}  /root/.tiup/storage/dm/clusters/dm-test  /root/.tiup/storage/dm/clusters/dm-test/ssh/id_rsa

检查部署的 DM 集群情况

例如,执行如下命令检查 dm-test 集群情况:

tiup dm display dm-test

预期输出包括 dm-test 集群中实例 ID、角色、主机、监听端口和状态(由于还未启动,所以状态为 Down/inactive)、目录信息。

启动集群

tiup dm start dm-test

预期结果输出 Started cluster `dm-test` successfully 表示启动成功。

验证集群运行状态

通过以下 TiUP 命令检查集群状态:

tiup dm display dm-test

在输出结果中,如果 Status 状态信息为 Up,说明集群状态正常。

使用 dmctl 管理迁移任务

6.4 开始做迁移工作:

1、创建DM专用用户:

-- 创建用户,允许从任何主机连接(根据你的网络环境调整)

CREATE USER 'dm_user'@'%' IDENTIFIED BY 'Tidb123!';

-- 授予DM所需的权限

GRANT RELOAD, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'dm_user'@'%';

GRANT SELECT ON *.* TO 'dm_user'@'%';

-- 刷新权限

FLUSH PRIVILEGES;

2、开启 GTID 的步骤:
  1. 检查当前 GTID 状态:连接上游 MySQL 数据库,执行以下命令查看当前的 GTID 模式:

SHOW GLOBAL VARIABLES LIKE 'GTID_MODE';

修改 MySQL 的配置文件(如 my.cnf 或 my.ini),在 [mysqld] 段添加:

gtid_mode = ONenforce_gtid_consistency = ON

 

3、创建数据源

首先,新建 source1.yaml 文件,写入以下内容:

# 唯一命名,不可重复。
source-id: "mysql-01"

# DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是上游 MySQL 已开启 GTID 模式。若上游存在主从自动切换,则必须使用 GTID 模式。
enable-gtid: true

from:
  host: "192.168.151.102"         
  user: "dm_user"
  password: "Tidb123!" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用
  port: 3306

tiup dmctl --master-addr 192.168.151.103:8261 operate-source create source1.yaml

 

4、创建迁移任务

新建 task1.yaml 文件,写入以下内容:

# 任务名,多个同时运行的任务不能重名。
name: "test"
# 任务模式,可设为
# full:只进行全量数据迁移
# incremental: binlog 实时同步
# all: 全量 + binlog 迁移
task-mode: "full"
# 下游 TiDB 配置信息。
target-database:
  host: "192.168.151.101"                   # 例如:172.16.10.83
  port: 4000
  user: "tidb"
  password: "Tidb123!"           # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用

# 当前数据迁移任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID。
  source-id: "mysql-01"
  # 需要迁移的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `block-allow-list` 的配置。
  block-allow-list: "listA"


# 黑白名单全局配置,各实例通过配置项名引用。
block-allow-list:
  listA:                              # 名称
    do-tables:                        # 需要迁移的上游表的白名单。
    - db-name: "tpch"              # 需要迁移的表的库名。
      tbl-name: "*"          # 需要迁移的表的名称。


以上内容为执行迁移的最小任务配置。关于任务的更多配置项,可以参考 DM 任务完整配置文件介绍

5、启动任务

在启动数据迁移任务之前,建议使用 check-task 命令检查配置是否符合 DM 的配置要求,以避免后期报错。

tiup dmctl --master-addr 192.168.151.103:8261 check-task task.yaml

由于我这里使用的是 MySQL 8.4.6,一开始是使用全量 + binlog 迁移,出现了几个关于这个版本的报错。

1. Binlog 检查失败
错误信息: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MASTER STATUS' at line 1

原因分析: 在 MySQL 8.4.6 中,SHOW MASTER STATUS 这个命令可能已经被弃用或语法发生了变化。DM 在检查 binlog 配置时仍然使用了旧的语法。

解决方案:



考虑使用一个兼容性更好的 MySQL 版本(如 5.7 或 8.0 的某个稳定版本)作为数据源。这是目前最稳妥的解决办法。

2. MySQL 版本警告
警告信息: version suggested earlier than 8.1.0 but got 8.4.6

原因分析: 使用的 MySQL 8.4.6 版本相对较新,可能超出了 DM 当前充分测试和官方支持的范围,存在未知兼容性风险。

解决方案:

建议降级 MySQL 版本至 DM 官方支持更好的版本(例如 MySQL 5.7 或 8.0 系列)。

后面改为全量迁移,忽略mysql版本,直接进行数据迁移。

使用 tiup dmctl 执行以下命令启动数据迁移任务。

tiup dmctl --master-addr 192.168.151.103:8261 start-task task.yaml

执行后会输出以下信息

[root@localhost ~]# tiup dmctl --master-addr 192.168.151.103:8261 start-task task1.yaml
Starting component dmctl: /root/.tiup/components/dmctl/v8.5.3/dmctl/dmctl --master-addr 192.168.151.103:8261 start-task task1.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-01",
            "worker": "dm-192.168.151.103-8262"
        }
    ],
    "checkResult": "fail to check synchronization configuration with type: no errors but some warnings
    	detail: {
		"results": [
			{
				"id": 0,
				"name": "dumper_conn_number_checker",
				"desc": "check if connetion concurrency exceeds database's maximum connection limit",
				"state": "warn",
				"errors": [
					{
						"severity": "warn",
						"short_error": "lack of Process global (*.*) privilege; "
					}
				]
			},
			{
				"id": 3,
				"name": "mysql_version",
				"desc": "check whether mysql version is satisfied",
				"state": "warn",
				"errors": [
					{
						"severity": "warn",
						"short_error": "version suggested earlier than 8.1.0 but got 8.4.6"
					}
				],
				"instruction": "It is recommended that you select a database version that meets the requirements before performing data migration. Otherwise data inconsistency or task exceptions might occur.",
				"extra": "address of db instance - 192.168.151.102:3306"
			},
			{
				"id": 5,
				"name": "table structure compatibility check",
				"desc": "check compatibility of table structure",
				"state": "warn",
				"errors": [
					{
						"severity": "warn",
						"short_error": "table `tpch`.`orders` Foreign Key orders_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`partsupp` Foreign Key partsupp_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`partsupp` Foreign Key partsupp_ibfk_2 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`supplier` Foreign Key supplier_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`customer` Foreign Key customer_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`nation` Foreign Key nation_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`lineitem` Foreign Key lineitem_ibfk_1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `tpch`.`lineitem` Foreign Key lineitem_ibfk_2 is parsed but ignored by TiDB."
					}
				],
				"instruction": "TiDB does not support foreign key constraints. See the document: https://docs.pingcap.com/tidb/stable/mysql-compatibility#unsupported-features"
			}
		],
		"summary": {
			"passed": true,
			"total": 6,
			"successful": 3,
			"failed": 0,
			"warning": 3
		}
	}"
}

可以通过以下命令查看任务状态,确认同步是否正在进行:

tiup dmctl --master-addr 192.168.151.103:8261 query-status

如果之后想暂停任务,可以使用:

tiup dmctl --master-addr 192.168.151.103:8261 pause-task test  # test 是你的任务名

需要继续任务时,使用:

tiup dmctl --master-addr 192.168.151.103:8261 resume-task test

6.5 整体体验与优势总结

  1. 开箱即用,部署简单: TiUP 工具链极大地简化了集群的安装、部署和管理流程,是 TiDB 生态体系的巨大优势。
  2. 配置化与自动化: 全程通过 YAML 文件进行配置,声明式的方法易于版本管理和复用。操作命令化,自动化程度高。
  3. 功能完善,稳定可靠:
    • GTID 支持: 对上游高可用架构的兼容性好。
    • 预检查机制: 防患于未然,提升了操作的成功率和体验。
    • 灵活的任务模式: 满足不同场景下的迁移需求。
  4. 集中监控: 集成 Prometheus 和 Grafana,可以方便地监控迁移延迟、吞吐量、错误等信息,便于观察迁移状态和性能调优。

6.6 注意事项与建议

资源占用: 在单台服务器上部署所有组件,虽然简单,但需要注意资源争用问题。在生产环境中,建议将 DM-worker 单独部署,并确保其有足够的 I/O 和 CPU 资源来处理数据加载和 binlog 同步,以避免成为性能瓶颈。

其中有一个小插曲,可能由于我的敏捷部署资源分配不够。导致数据迁移到tidb集群时候出现多次OOM和多种告警,历时一个下午才把测试的数据迁移完。

网络与防火墙: 确保 DM 组件与上游 MySQL、下游 TiDB 之间的网络连通性,以及相关端口(如 MySQL 3306, DM-master 8261, DM-worker 8262)的防火墙规则已正确开放。

版本兼容性: 注意上游 MySQL 版本和 TiDB DM 版本的兼容性列表,避免使用未经验证的版本组合。

6.7 结论

本次使用 TiDB DM 进行数据迁移的体验非常积极。整个过程文档清晰、流程标准化、工具自动化程度高。从零开始搭建迁移环境到任务成功运行,没有遇到不可解决的障碍。

对于有计划将 MySQL 数据迁移至 TiDB 的用户,DM 是一个值得推荐的首选工具。它在易用性、功能性和可靠性之间取得了良好的平衡,能够高效地完成数据迁移这一复杂任务。


7. 可扩展性测试

7.1 测试目标

  1. 节点扩展性:验证集群从 1 个 TiDB/TiKV 节点无缝扩展到 3 个 TiDB/TiKV 节点时,在线业务的性能提升比例和数据一致性。
  2. 功能扩展性:验证在现有集群中动态添加 TiFlash、TiCDC、BR 等关键组件时,集群的兼容性、稳定性,以及对现有 OLTP 业务性能的影响。

7.2.测试过程

第一部分:节点扩展性测试

测试环境与工具

TiDB 集群:TiDB 敏捷模式

初始架构:1x PD, 1x TiDB, 1x TiKV

目标架构:3x PD, 3x TiDB, 3x TiKV

压力工具:Sysbench

数据规模:5 张表,每张表 1000 万行数据 (-t 5 --table-size=10000000)

监控工具:TEM

测试目的:测量从 1 节点扩展到 3 节点过程中,系统性能的变化,并确保数据无丢失、无错乱。

测试步骤分为四个阶段:

  • 阶段1:空载监控60秒
  • 阶段2:负载测试60秒
  • 阶段3:负载测试600秒 + 扩容第一节点 + 扩容第二节点
  • 阶段4:扩容后负载测试120秒
  • image.png

手动记扩容开始结束时间,根据sysbench的输出结果统计采样点并进行对比。

下面表格每行的数字均来自对应日志的采样点统计;

窗口(时间) 样本数 tps_avg qps_avg p95(median / avg / 90%)(ms) 备注
扩容前 单次 run(基线,短跑60s) 6 362.67 7263.57 223.34 / 249.17 / 314.46 基线:短跑高吞吐、 延迟较低
0–100s(扩容中 run,扩容前窗口) 9 339.79 6804.08 227.40 / 232.19 / 240.18 稍低于基线
100–250s(扩容第1节点期间) 16 276.04 5519.81 262.64 / 283.67 / 331.96 明显下滑,有抖动
251–349s(两次扩容之间) 9 254.7 5093.95 320.17 / 318.53 / 333.12 稳定性进一步变差
350–470s(扩容第2节点期间) 13 226.32 4525.64 369.77 / 395.96 / 491.48 第二次扩容影响更明 显
471–600s(扩容后同次 run 后期) 13 143.84 2878.63 419.45 / 3656.30 / 1731.75 出现 3 个 0 TPS 采样 点与极端异常 (avg 被极端值拉高)
扩容后 单次 run(独立) 12 133.68 2680.13 646.19 / 707.20 / 717.37 新短跑基线
扩容后(集群稳定)完整 run 36 335.87 7201.31  244.38 / 190.52 /659.29 集群稳定后恢复接近 基线
  • 扩容前短跑TPS 在 ~360+,而扩容后短跑TPS 在 ~130 左右,约下降到原来的 36% 左右。来源:扩容前/扩容后各自日志。
  • 在 “扩容中”(同一 600s run)能看到两个明显的下降阶段:第 1 次扩容(100–250s)使 TPS 从 ~340 降到 ~276(约 19% 降幅);第 2 次扩容(350–470s)进一步降到 ~226(相比扩容前窗口再降 ~33%)。

总体趋势是:扩容操作期间和之后延迟上升、吞吐下降。

  • 扩容后集群稳定后恢复接近基线

对集群部署了HA之后又测了一轮:

image.png 量化变化

  • Aggregate TPS 变化(三节点 vs 扩容前负载单节点):-14.6719 eps → -4.04%(下降约 4.04%)。(计算:(348.2836 - 362.9555) / 362.9555 × 100 = -4.0423%)
  • 平均延迟:从 176.20 ms → 183.72 ms,+7.52 ms(+4.27%)
  • p95 延迟:从 219.36 ms → 308.84 ms,+89.48 ms(+40.80%)
  • max 延迟剧增:从 1.95 s → 6.80 s(极端 outlier)。

简短结论:吞吐略降 ~4%(几乎相当),但高分位延迟明显变差(p95 +41%),并出现极端最大延迟样本。这意味着系统在长 run/三节点环境下总体吞吐可接受,但尾部延迟与短时可用性出现问题。

 集群性能变化

image.png

image.png

下面扩容阶段的一些性能指标:

7.3 阶段性结论

  • 同次 run 的后期(471–600s)和独立的扩容后 run 都显示了 显著低于扩容前的吞吐(tps ~140 左右)与更高延迟(95% median 在 400–650ms 区间)。独立“扩容后”短跑,确认了扩容完成后系统在短期内未恢复到扩容前性能。
  • 注意:同次 run 的最后阶段出现了若干“0 TPS”与单个极端超高延迟点(lat95 = 42134ms),表明在扩容过程或其后期可能发生短暂的服务不可用或长时间阻塞。
  • 典型表现:TPS 再次下降到 ~226,95% 延迟中位数进一步上升到 ~370ms,90% 分位甚至接近 490ms。
  • 说明:第二次扩容带来的影响更大(比第一次更显著)。可能因为第一次扩容期间集群尚未稳定(副本/region 未完全同步),第二次扩容在未完成前一次收敛的情况下继续加入节点,造成更大的数据迁移、调度压力或短时元数据冲突。
  • 典型表现:TPS 从 ~340→~276,95% 延迟从 ~227ms → ~262ms(median/avg 同比上升)。
  • 说明:扩容第一节点期间系统出现明显性能下降与更多延迟抖动,但没有出现 0 TPS 的完全中断现象。可能在做数据迁移/副本同步/元数据变更时引入了额外负载与锁等待。

7.4 结论

  • 本次测试显示:扩容操作对数据库性能有明显负面影响——扩容期间 TPS 与 QPS 明显下降、延迟上升;扩容完成后的短期内系统未恢复到扩容前性能,待集群稳定后性能恢复原有水平。

因篇幅所限,本文的完整内容将分为上下两篇发布,后续高可用测试、TEM 易用性等内容详见即将发布的第二部分

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论