本文以RDS MySQL间的单向同步实例为例,为您介绍数据传输服务DTS(Data Transmission Service)性能测试的测试环境、测试工具、测试方法与测试结果。
测试环境
数据库信息
测试中使用的RDS MySQL均已开启自动扩容功能。
类别 | 地域 | 类型 | 版本 | 规格 | CPU | 内存 |
源库 | 华东1(杭州) | 高可用系列的RDS MySQL(标准版) | 8.0 | mysql.x4.xlarge.2c(独享规格) | 8 | 32GB |
目标库 |
测试客户端
需要将ECS实例的IP地址加入到RDS MySQL实例的白名单中。更多信息,请参见设置IP白名单。
类型 | 地域 | 网络 | 操作系统 | 规格 | vCPU | 内存 | 是否分配公网IP |
ECS实例 | 华东1(杭州) | 专有网络 说明 专有网络VPC和交换机与RDS MySQL相同。 | CentOS 7.9 64位 | ecs.c7.8xlarge(计算型 c7) | 32 | 64 | 是 |
测试工具
工具介绍
工具 | 版本 | 说明 |
SysBench | 1.0.20 | 一款跨平台且支持多线程的模块化基准测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现,以便快速了解数据库系统的性能。 |
BenchmarkSQL | 5.0(基于Java 8) | 一款开源的数据库性能测试工具,主要用于模拟OLTP(在线事务处理)工作负载,对数据库系统的性能进行评估和压力测试。 |
安装工具
安装Sysbench
在ECS实例中,下载并安装SysBench。
# 安装sysbench依赖库 yum -y install make automake libtool pkgconfig libaio-devel yum -y install mariadb-devel openssl-devel # 下载sysbench源码 wget "https://codeload.github.com/akopytov/sysbench/zip/refs/tags/1.0.20" -O sysbench-1.0.20.zip # 安装unzip yum -y install unzip # 解压源码 unzip sysbench-1.0.20.zip # 编译源码 cd sysbench-1.0.20 ./autogen.sh ./configure sed -i 's/MYSQL_OPT_COMPRESSION_ALGORITHMS/MYSQL_OPT_COMPRESS/g' ./src/drivers/mysql/drv_mysql.c make -j # 安装 make install
准备大表场景(dm_large_table_write_only.lua)、热点数据更新场景(dm_hot_update_only.lua)、DDL同步场景(dm_ddl_only.lua)的Lua脚本文件。
将三个Lua脚本上传到ECS实例中,并复制到Sysbench脚本目录
/usr/local/share/sysbench/
中。# 复制大表场景脚本 cp dm_large_table_write_only.lua /usr/local/share/sysbench/ # 复制热点数据更新场景脚本 cp dm_hot_update_only.lua /usr/local/share/sysbench/ # 复制DDL同步场景脚本 cp dm_ddl_only.lua /usr/local/share/sysbench/
安装BenchmarkSQL
# 安装ant工具
yum -y install ant
# 下载BenchmarkSQL源码
wget "https://github.com/jackysp/benchmarksql/archive/refs/heads/5.0-mysql-support-opt-2.1.zip" -O benchmarksql-5.0-mysql-support-opt-2.1.zip
# 解压源码
unzip benchmarksql-5.0-mysql-support-opt-2.1.zip
# 构建源码
cd benchmarksql-5.0-mysql-support-opt-2.1
ant
测试方法
方法介绍
以下五种测试方法,可以从不同维度测试数据同步的性能。
测试工具 | 测试模型/脚本 | 测试功能 |
Sysbench | oltp_write_only | 全量同步、增量同步 |
dm_large_table_write_only | 全量同步、增量同步 | |
dm_hot_update_only | 增量同步 | |
dm_ddl_only | 增量同步 | |
BenchmarkSQL | TPC-C | 全量同步、增量同步 |
测试步骤
oltp_write_only
准备基础数据。
在ECS实例中,通过Sysbench工具为源RDS MySQL实例创建10个表,每个表中导入1000万条数据。
说明需要在
/usr/local/share/sysbench/
目录下执行如下命令。sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --table_size=10000000 --tables=10 oltp_write_only.lua \ prepare
参数
说明
备注
相关文档
--mysql-host
主机名,此处填入RDS MySQL的内网地址。
需要替换
{HOST}
。--mysql-port
端口号,此处填入RDS MySQL的内网端口。
需要替换
{PORT}
。--mysql-user
数据库账号。
需要确保数据库账号具有足够的权限。
--mysql-password
数据库账号对应的密码。
--mysql-db
压测的数据库名称。
需要提前创建好,并替换
{DATABASE}
。--tables
数据表的个数。
本示例取值为10。
不涉及
--table_size
单个数据表中的数据条数。
本示例取值为10000000。
创建DTS数据同步实例。
同步类型需勾选库表结构同步和全量同步。更多信息,请参见RDS MySQL实例间的同步。
观察并等待全量同步阶段结束。
进行增量压测。
在ECS实例中,使用oltp_write_only模型对DTS同步任务的源库进行压测,以生成Binlog。
说明DML类型的比例为INSERT:UPDATE:DELETE=1:2:1。
sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --table_size=1000000 --tables=10 --time=600 oltp_write_only.lua \ run
参数
说明
备注
--time
压测的时间,单位为秒(s)。
本示例取值为600。
--threads
压测的线程数。
本示例取值为64。
在DTS实例的性能监控页面,查看实例的性能。
更多信息,请参见监控任务性能。
dm_large_table_write_only
准备基础数据。
在ECS实例中,通过Sysbench工具为源RDS MySQL实例创建10个表,每个表中导入10000条数据。
说明需要在
/usr/local/share/sysbench/
目录下执行如下命令。sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --table_size=10000 --tables=10 dm_large_table_write_only.lua \ prepare
参数
说明
备注
相关文档
--mysql-host
主机名,此处填入RDS MySQL的内网地址。
需要替换
{HOST}
。--mysql-port
端口号,此处填入RDS MySQL的内网端口。
需要替换
{PORT}
。--mysql-user
数据库账号。
需要确保数据库账号具有足够的权限。
--mysql-password
数据库账号对应的密码。
--mysql-db
压测的数据库名称。
需要提前创建好,并替换
{DATABASE}
。--tables
数据表的个数。
本示例取值为10。
不涉及
--table_size
单个数据表中的数据条数。
本示例取值为10000。
创建DTS数据同步实例。
同步类型需勾选库表结构同步和全量同步。更多信息,请参见RDS MySQL实例间的同步。
观察并等待全量同步阶段结束。
进行增量压测。
在ECS实例中,使用dm_large_table_write_only模型对DTS同步任务的源库进行压测,以生成Binlog。
sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --table_size=10000 --tables=10 --time=600 dm_large_table_write_only.lua \ run
参数
说明
备注
--time
压测的时间,单位为秒(s)。
本示例取值为600。
--threads
压测的线程数。
本示例取值为64。
在DTS实例的性能监控页面,查看实例的性能。
更多信息,请参见监控任务性能。
dm_hot_update_only
创建DTS数据同步实例。
同步类型不勾选全量同步。若未在目标RDS MySQL中创建对应的数据库和数据表,则还需勾选库表结构同步。更多信息,请参见RDS MySQL实例间的同步。
初始化压测表数据。
sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --tables=2 dm_hot_update_only.lua \ prepare
参数
说明
备注
相关文档
--mysql-host
主机名,此处填入RDS MySQL的内网地址。
需要替换
{HOST}
。--mysql-port
端口号,此处填入RDS MySQL的内网端口。
需要替换
{PORT}
。--mysql-user
数据库账号。
需要确保数据库账号具有足够的权限。
--mysql-password
数据库账号对应的密码。
--mysql-db
压测的数据库名称。
需要提前创建好,并替换
{DATABASE}
。--tables
数据表的个数。
本示例取值为2。
不涉及
进行增量压测。
在ECS实例中,使用dm_hot_update_only模型对DTS同步任务的源库进行压测,以生成Binlog。
sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --tables=2 --time=600 dm_hot_update_only.lua \ run
参数
说明
备注
--time
压测的时间,单位为秒(s)。
本示例取值为600。
--threads
压测的线程数。
本示例取值为64。
在DTS实例的性能监控页面,查看实例的性能。
更多信息,请参见监控任务性能。
dm_ddl_only
创建DTS数据同步实例。
同步类型不勾选全量同步。若未在目标RDS MySQL中创建对应的数据库和数据表,则还需勾选库表结构同步。更多信息,请参见RDS MySQL实例间的同步。
进行增量压测。
在ECS实例中,使用dm_ddl_only模型对DTS同步任务的源库进行压测,以生成Binlog。
sysbench --db-driver=mysql \ --mysql-host={HOST} \ --mysql-port={PORT} \ --mysql-user= \ --mysql-password= \ --mysql-db={DATABASE} \ --threads=64 --tables=2 --time=600 dm_ddl_only.lua \ run
参数
说明
备注
相关文档
--mysql-host
主机名,此处填入RDS MySQL的内网地址。
需要替换
{HOST}
。--mysql-port
端口号,此处填入RDS MySQL的内网端口。
需要替换
{PORT}
。--mysql-user
数据库账号。
需要确保数据库账号具有足够的权限。
--mysql-password
数据库账号对应的密码。
--mysql-db
压测的数据库名称。
需要提前创建好,并替换
{DATABASE}
。--threads
压测的线程数。
本示例取值为64。
不涉及
--tables
数据表的个数。
本示例取值为2。
--time
压测的时间,单位为秒(s)。
本示例取值为600,持续执行DDL操作600秒。
在DTS实例的性能监控页面,查看实例的性能。
更多信息,请参见监控任务性能。
TPC-C
准备基础数据。
进入ECS实例中BenchmarkSQL的运行目录。
cd benchmarksql-5.0-mysql-support-opt-2.1/run/
编译MySQL测试配置文件。
vim props.mysql
配置文件如下所示,您需要将
{HOST}
、{PORT}
、{USER}
、{PASSWORD}
和{DATABASE}
修改为源RDS MySQL实例的信息。db=mysql driver=com.mysql.jdbc.Driver conn=jdbc:mysql://{HOST}:{PORT}/{DATABASE}?readOnlyPropagatesToServer=false&rewriteBatchedStatements=true&failOverReadOnly=false&connectTimeout=3000&allowMultiQueries=true&clobberStreamingResults=true&characterEncoding=utf8&netTimeoutForStreamingResults=0&autoReconnect=true user={USER} password={PASSWORD} warehouses=1000 loadWorkers=100 terminals=128 //To run specified transactions per terminal- runMins must equal zero runTxnsPerTerminal=0 //To run for specified minutes- runTxnsPerTerminal must equal zero runMins=10 //Number of total transactions per minute limitTxnsPerMin=0 //Set to true to run in 4.x compatible mode. Set to false to use the //entire configured database evenly. terminalWarehouseFixed=true //The following five values must add up to 100 //The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec newOrderWeight=45 paymentWeight=43 orderStatusWeight=4 deliveryWeight=4 stockLevelWeight=4 // Directory name to create for collecting detailed result data. // Comment this out to suppress. resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS // osCollectorScript=./misc/os_collector_linux.py // osCollectorInterval=1 // osCollectorSSHAddr=user@dbhost // osCollectorDevices=net_eth0 blk_sda
参数
说明
备注
conn
数据库的连接配置。需填入主机名{HOST}、端口号{PORT}
HOST:主机名,此处填入RDS MySQL的内网地址。
PORT:端口号,此处填入RDS MySQL的内网端口。
DATABASE:压测的数据库名称,此处填入RDS MySQL中提前创建好的数据库名称。
需要替换
{HOST}
、{PORT}
和{DATABASE}
。user
数据库账号。
需要替换
{USER}
。password
数据库账号对应的密码。
需要替换
{PASSWORD}
。runMins
压测的时间,单位为分钟(min)。
本示例取值为10。
初始化TPC-C测试的基础数据。
./runDatabaseBuild.sh props.mysql
将创建10个表,共计大约5亿条数据。
创建DTS数据同步实例。
同步类型需勾选库表结构同步和全量同步。更多信息,请参见RDS MySQL实例间的同步。
观察并等待全量同步阶段结束。
进行增量压测。
在ECS实例中,使用TPC-C模型对DTS同步任务的源库进行压测,以生成Binlog。
./runBenchmark.sh props.mysql
参数
说明
备注
--time
压测的时间,单位为秒(s)。
本示例取值为600。
--threads
压测的线程数。
本示例取值为64。
在DTS实例的性能监控页面,查看实例的性能。
更多信息,请参见监控任务性能。
测试结果
增量同步的最大性能(RPS),请参见数据同步性能。
oltp_write_only
全量同步
实例规格 | RPS(Row/s) | BPS(MB/s) | 耗时(s) |
micro | 17.95W | 34.19 | 557 |
small | 18.18W | 34.63 | 550 |
medium | 19.64W | 37.42 | 509 |
large | 19.96W | 38.02 | 501 |
增量同步
实例规格 | RPS(Row/s) | BPS(KB/s) | 性能是否已达到规格上限 |
micro | 200 | 86 | 是 |
small | 2000 | 982 | 是 |
medium | 5000 | 2605 | 是 |
large | 11000 | 5489 | 是 |
dm_large_table_write_only
全量同步
实例规格 | RPS(Row/s) | BPS(MB/s) | 耗时(s) |
micro | 469.48 | 35.09MB | 213 |
small | 480.77 | 35.94MB | 208 |
medium | 552.49 | 41.30MB | 181 |
large | 584.80 | 43.71 | 171 |
增量同步
实例规格 | RPS(Row/s) | BPS(KB/s) | 性能是否已达到规格上限 |
micro | 200 | 9086.3 | 是 |
small | 683 | 31741.51 | 否 |
medium | 1033 | 56676.41 | 否 |
large | 1537 | 84344.32 | 否 |
dm_hot_update_only
热点合并参数trans.hot.merge.enable默认为false,修改方法请参见修改实例参数。
热点合并参数为false
增量同步
实例规格 | RPS(Row/s) | 性能是否已达到规格上限 |
micro | 200 | 是 |
small | 1200 | 否 |
medium | 1200 | 否 |
large | 1200 | 否 |
热点合并参数为true
增量同步
实例规格 | RPS(Row/s) | 性能是否已达到规格上限 |
micro | 200 | 是 |
small | 2000 | 是 |
medium | 5000 | 是 |
large | 11000 | 是 |
dm_ddl_only
增量同步
实例规格 | RPS(Row/s) | 性能是否已达到规格上限 |
micro | 68 | 否 |
small | 68 | 否 |
medium | 68 | 否 |
large | 68 | 否 |
TPC-C
全量同步
实例规格 | RPS(Row/s) | BPS(MB/s) | 耗时(s) |
micro | 12.04W | 17.52 | 4143 |
small | 12.09W | 17.59 | 4127 |
medium | 12.73W | 18.52 | 3921 |
large | 13.50W | 19.64 | 3696 |
增量同步
实例规格 | RPS(Row/s) | BPS(KB/s) | 性能是否已达到规格上限 |
micro | 200 | 138 | 是 |
small | 2000 | 1920 | 是 |
medium | 5000 | 3847 | 是 |
large | 11000 | 7542 | 是 |