一、前言
- 企业 & 行业背景
本人从事金融行业运维工作,日常工作中偶尔涉及数据库相关操作。在当前信息技术应用创新和国产化替代的背景下,大环境下正积极引入具备分布式架构、强一致性且具备良好扩展性的数据库产品。TiDB 作为一款领先的分布式 NewSQL 数据库,其“敏捷模式”吸引了我的关注,本次重点围绕该模式展开技术调研与测试验证。
- 目前遇到的数据库挑战
随着业务规模不断扩大和监管政策趋严,行业临诸多关键挑战:传统集中式数据库(如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 安装
- 下载 TEM 安装包(tem-package-v3.0.0-linux-amd64.tar.gz)
- 解压并进入目录
- 修改配置文件中的 IP 地址为 TEM 主机 IP
4.执行 install.sh 完成安装
# 访问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 配置
- 配置凭证:设置 → 凭证 → 主机 → 添加凭证
2.导入组件:设置 → 组件管理 → 添加组件(导入 TiDB 敏捷模式安装包)
3.配置中控机:主机 → 集群管理中控机 → 添加中控机
- IP 地址:中控机 IP
- SSH 端口:22(默认)
- 服务端口:9090(默认)
- 凭证:之前添加的 SSH 凭证
- 服务根目录:/root/tidb-cm-service
- 启用自动安装 TiUP
添加主机
- 主机 → 主机 → 添加共享主机
- 填写主机 IP、SSH 端口和对应凭证
创建集群
- 集群 → 创建集群
- 配置集群基本信息:
- 集群名称:自定义
- Root 用户密码:设置数据库 root 密码
- CPU 架构:x86_64
- 部署用户:tidb
- 选择中控机和集群版本
- 选择"共享"部署模式
- 规划集群节点:
- 必须组件:PingKaiDB Fusion、Grafana、Prometheus、Alertmanager
- 可选组件:TiFlash(用于 HTAP 功能测试)
- 完成创建并等待集群部署完成
1.2.5 集群验证
通过 TiDB Dashboard 验证
- 访问地址:{pd-ip}:{pd-port}/dashboard
- 使用 root 用户和设置的密码登录
- 验证集群各组件状态正常
通过 Grafana 监控验证
- 访问地址:{Grafana-ip}:3000
- 默认账户:admin/admin
- 查看 Overview 页面,确认监控数据正常
Prometheus 检查
- 访问地址:http://192.168.151.101:9090/targets?search=
- 确认所有 target 状态为 UP
1.2.6.集群优化
通过 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。
- 性能:TiDB 的吞吐量比 MySQL 高出 46%。
- 延迟:TiDB 的 95% 延迟比 MySQL 低 31%,且最大延迟降低了 87%,表现更加优秀。
- 稳定性:TiDB 提供了平滑稳定的性能输出,而 MySQL 出现了长时间的性能崩溃和剧烈的延迟抖动。
4. 压缩比测试
4.1 测试目标
- 对比对象:TiDB(使用 TiKV 存储引擎,默认启用压缩) vs MySQL(使用 InnoDB 存储引擎)。
- 核心指标:压缩比,计算公式为
MySQL 数据物理大小 / TiDB 数据物理大小
。
4.2 测试环境与数据准备
- 测试数据:使用 Sysbench 的
oltp_write_only
脚本在两库中生成完全相同的测试数据集(sbtest
库下的sbtest1
至sbtest5
表)。 - 数据规模:确保两库中的数据行数及表结构完全一致。经查询,两库中 5 张表的总行数均约为 1.28 亿行。
4.3 测试步骤
确保 TiKV 压缩完成:
- 使用RocksDB作为底层存储,其压缩过程由后台自动触发。为确保数据压缩到最紧凑状态,在测量前手动触发全集群压缩并等待完成。
- # 登录到 TiKV 节点机器,找到 tikv-ctl 工具路径
- 操作命令:
# 使用 tiup 工具连接任一 TiKV 节点并执行压缩命令 tiup ctl:<cluster-version> tikv --host <tikv-ip>:<tikv-status-port> compact-cluster
- 等待压缩操作在后台完全结束(通常需等待数十分钟,取决于数据量)。
-
测量物理磁盘空间:
- MySQL:测量其数据目录的总大小。
# 假设 MySQL 数据目录为 /var/lib/mysql du -sh /var/lib/mysql # 输出:51G
- TiDB:测量所有 TiKV 实例数据目录的总大小。
# 假设 TiKV 数据目录为 /tidb1/tidb-data du -sh /tidb1/tidb-data # 输出:27G
- MySQL:测量其数据目录的总大小。
-
查询逻辑数据大小:
- 分别在 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:
mysql:
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 综合结论
- 优秀的压缩能力:TiDB 凭借其先进的存储引擎和默认启用的压缩算法,在此次测试中实现了 1.96:1 的压缩比,显著降低了磁盘空间使用,存储成本降低。
- 性能与压缩的平衡:结合前面的性能测试可知,TiDB 在提供高达 46% 性能提升的同时,并未因压缩操作而牺牲性能或带来显著延迟。其压缩过程在后台异步进行,对前端业务影响极小。
- 成本效益显著:对于数据密集型应用,采用 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 测试方法
- 数据初始化: 使用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 迁移的流程如下图所示。
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
编辑初始化配置文件
请根据不同的集群拓扑,编辑 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
查看 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 的步骤:
- 检查当前 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 整体体验与优势总结
- 开箱即用,部署简单: TiUP 工具链极大地简化了集群的安装、部署和管理流程,是 TiDB 生态体系的巨大优势。
- 配置化与自动化: 全程通过 YAML 文件进行配置,声明式的方法易于版本管理和复用。操作命令化,自动化程度高。
- 功能完善,稳定可靠:
- GTID 支持: 对上游高可用架构的兼容性好。
- 预检查机制: 防患于未然,提升了操作的成功率和体验。
- 灵活的任务模式: 满足不同场景下的迁移需求。
- 集中监控: 集成 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 个 TiDB/TiKV 节点无缝扩展到 3 个 TiDB/TiKV 节点时,在线业务的性能提升比例和数据一致性。
- 功能扩展性:验证在现有集群中动态添加 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秒
手动记扩容开始结束时间,根据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之后又测了一轮:
量化变化
- 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/三节点环境下总体吞吐可接受,但尾部延迟与短时可用性出现问题。
集群性能变化
下面扩容阶段的一些性能指标:
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 明显下降、延迟上升;扩容完成后的短期内系统未恢复到扩容前性能,待集群稳定后性能恢复原有水平。