写点什么

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

作者: TiDBer_FvfLzhd0 原文来源:https://tidb.net/blog/55666062

一、前言

  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 - BaseOSbaseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/enabled=1gpgcheck=0
[ali_appstream]name=Aliyun CentOS Stream 9 - AppStreambaseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/enabled=1gpgcheck=0EOF
# 安装基础软件yum -y install openssh-clients openssh-server tar
# 关闭防火墙和SELinuxsystemctl stop firewalld.servicesystemctl disable firewalld.servicesed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/configsetenforce 0
# 配置SSH互信su - tidbssh-keygen -t rsassh-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



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 配置


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



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



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



  • IP 地址:中控机 IP

  • SSH 端口:22(默认)

  • 服务端口:9090(默认)

  • 凭证:之前添加的 SSH 凭证

  • 服务根目录:/root/tidb-cm-service

  • 启用自动安装 TiUP

添加主机

  • 主机 → 主机 → 添加共享主机

  • 填写主机 IP、SSH 端口和对应凭证

创建集群

  1. 集群 → 创建集群

  2. 配置集群基本信息:



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



1.2.5 集群验证


通过 TiDB Dashboard 验证



  • 访问地址:{pd-ip}:{pd-port}/dashboard

  • 使用 root 用户和设置的密码登录

  • 验证集群各组件状态正常


通过 Grafana 监控验证



  • 访问地址:{Grafana-ip}:3000

  • 默认账户:admin/admin

  • 查看 Overview 页面,确认监控数据正常


Prometheus 检查




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.rpmsudo rpm -ivh mysql84-community-release-el9-5.noarch.rpm
# 安装MySQL服务器sudo yum reinstall mysql-community-server
# 启动MySQL服务sudo systemctl start mysqldsudo systemctl enable mysqld
复制代码


MySQL 优化配置


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


[mysqld]innodb_buffer_pool_size = 12Ginnodb_flush_log_at_trx_commit = 0sync_binlog = 0local-infile = 1
复制代码


1.2.8 测试工具部署


部署 sysbench


1. 概览


  • Sysbench 用于 OLTP 场景(短事务、高并发),我们以 oltp_read_write 为示例。Sysbench 通过 MySQL 协议连接到 TiDB 的 MySQL 端口。


  • 记录每一步的时间戳与日志,便于后续把性能变化与扩容操作关联。


2. 安装 Sysbench


sudo yum groupinstall "Development Tools" -ysudo yum install -y openssl-devel mariadb-develsudo yum install -y epel-releasesudo 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




# preparesysbench 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
# runsysbench 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
# cleanupsysbench ... cleanup
复制代码

3. 性能进行对比分析

TiDB 与 MySQL Sysbench OLTP 性能测试对比


3.1 概述


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


3.2 测试配置



3.3 总体性能数据对比



结论:在吞吐量(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 工具路径

  • 操作命令

  • 等待压缩操作在后台完全结束(通常需等待数十分钟,取决于数据量)。



  1. 测量物理磁盘空间

  2. MySQL:测量其数据目录的总大小。


  3. TiDB:测量所有 TiKV 实例数据目录的总大小。


  4. 查询逻辑数据大小

  5. 分别在 MySQL 和 TiDB 中执行 SQL,查询测试表的逻辑数据长度,用于辅助分析压缩效率。

  6. 查询语句





4.4 测试结果与分析


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



  • 压缩比计算:51 GB / 27 GB ≈ 1.96

  • 结论:在此测试中,TiDB 的存储效率约为 MySQL 的 2 倍。存储相同规模的数据,TiDB 所需磁盘空间比 MySQL 节省了近 50%。


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



  • 分析:逻辑大小与物理大小的差异揭示了不同的存储机制。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 万行数据。

  2. 创建主测试表


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


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


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


5. 度量标准:


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


3. 详细 DDL 操作对比分析



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 测试环境配置



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 的步骤:
  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 执行以下命令启动数据迁移任务。


markdowntiup dmctl –master-addr 192.168.151.103:8261 start-task task.yaml


执行后会输出以下信息


markdown[root@localhost ~]# tiup dmctl –master-addr 192.168.151.103:8261 start-task task1.yamlStarting 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. 功能完善,稳定可靠:

  4. GTID 支持: 对上游高可用架构的兼容性好。

  5. 预检查机制: 防患于未然,提升了操作的成功率和体验。

  6. 灵活的任务模式: 满足不同场景下的迁移需求。

  7. 集中监控: 集成 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 秒


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


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



  • 扩容前短跑 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 明显下降、延迟上升;扩容完成后的短期内系统未恢复到扩容前性能,待集群稳定后性能恢复原有水平。

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

发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
给敏捷模式做下体检——多方位平凯数据库TiDB敏捷模式和MySQL的性能测试(上)|金融行业可参考_版本测评_TiDB 社区干货传送门_InfoQ写作社区