本文介绍全密态MySQL在不同加密条件下的性能表现,有助于您评估和选择加密方案。
测试环境
配置项 | ECS实例(测试客户端部署在ECS实例上) | PolarDB MySQL版集群 | 说明 |
地域及可用区 | 杭州可用区H(主),杭州可用区J | 杭州可用区H | 本测试在同一地域及可用区 |
网络类型 | 专有网络VPC | 专有网络VPC | 本测试在同一VPC下 |
CPU和内存 | 8核32GB | 64核512GB | 不涉及 |
实例规格 | ecs.s6-c1m4.2xlarge | polar.mysql.x8.8xlarge | 不涉及 |
实例/镜像版本 | Alibaba Cloud Linux 2.1903 LTS 64位快速启动版 | 内核版本:8.0.2.2.12 | 不涉及 |
测试工具(oltpbench)
Oltpbench是一个开源的OLTP基准测试工具,用于测试数据库管理系统的性能和可伸缩性。它提供了多个基准测试程序,包括TPC-C、TPC-E、YCSB等,以模拟不同的负载类型。本文基于oltpbench提供的TPC-C测试,给出了OLTP场景下全密态MySQL数据库的性能报告。
衡量指标
TPS(Transactions Per Second):数据库每秒执行的事务数,以COMMIT成功次数为准。
测试步骤
全密态MySQL数据库根据用户设置的加密规则对数据进行加密。本测试通过调整TPC-C测试中加密的数据列,来实现对不同场景下全密态MySQL数据库性能的模拟分析。
在您的ECS实例上配置oltpbench项目。配置方法请参考配置oltpbench。
将EncJDBC与oltpbench进行集成。集成方法请参考集成EncJDBC。
创建oltpbench配置文件。如下:
<?xml version="1.0"?> <parameters> <!-- Connection details --> <dbtype>mysql</dbtype> <driver>com.aliyun.encdb.mysql.jdbc.EncDriver</driver> <DBUrl>jdbc:mysql:encdb://xxxx.rwlb.rds.aliyuncs.com:3306/xxxx</DBUrl> <DBName>xxxx</DBName> <username>xxxx</username> <password>xxxxx</password> <isolation>TRANSACTION_SERIALIZABLE</isolation> <scalefactor>1</scalefactor> <!-- The workload --> <terminals>8</terminals> <works> <work> <time>180</time> <rate>unlimited</rate> <weights>45,43,4,4,4</weights> </work> </works> <!-- TPCC specific --> <transactiontypes> <transactiontype> <name>NewOrder</name> </transactiontype> <transactiontype> <name>Payment</name> </transactiontype> <transactiontype> <name>OrderStatus</name> </transactiontype> <transactiontype> <name>Delivery</name> </transactiontype> <transactiontype> <name>StockLevel</name> </transactiontype> </transactiontypes> </parameters>
编译oltpbench项目后,执行以下命令在数据库中导入数据。
./oltpbenchmark -b tpcc -c tpcc_encmysql.xml --load=true --create=true -s 1 -o tpcc
反复调整全密态MySQL的加密设置、TPCC参数等,对OLTP场景性能(TPS/QPS)进行全面测试。
./oltpbenchmark -b tpcc -c tpcc_encmysql.xml --execute=true -s 1 -o tpcc
测试场景及结果
场景说明
本次测试的每个测试结果均为运行3次测试的TPS,其中每次测试时长为1分钟。
性能测试结果包含了在客户端对返回的加密字段进行解密的性能损耗。
在当前TPC-C测试场景下,QPS为TPS的固定倍率,大概为9~10倍左右。所以本测试场景中只用TPS衡量性能。
Terminal参数是TPC-C模拟同时存在的客户端数量,类似为测试并行线程数。
场景一:对20%的业务数据列加密
此场景中在选择加密列时,优先选择了ID信息,以模拟真实业务场景中加密身份证号、订单号等数据的需求。
测试结果
Terminal数量 | 全明文(TPS) | 20%敏感列加密(TPS) | 性能损耗 |
8 | 260.55 | 237.64 | 8.79% |
16 | 302.78 | 280.28 | 7.43% |
24 | 330.04 | 298.03 | 9.70% |
32 | 343.65 | 315.25 | 8.26% |
通过上述测试结果可以发现,对20%的业务数据敏感列加密的情况下,全密态数据库在TPC-C测试下的性能损耗相比全明文数据库在7%~9%之间。
场景二:对50%的业务数据列加密
选择加密列时,在场景一中对ID信息列加密的基础上,选择数据信息,例如价钱、日期、数量等业务敏感信息列进行加密。
测试结果
Terminal数量 | 全明文(TPS) | 50%敏感列加密(TPS) | 性能损耗 |
8 | 260.55 | 221.01 | 15.18% |
16 | 302.78 | 256.64 | 15.24% |
24 | 330.04 | 273.53 | 17.12% |
32 | 343.65 | 293.65 | 14.55% |
通过上述测试结果可以发现,对50%的业务数据敏感列加密的情况下,全密态数据库在TPC-C测试下的性能损耗相比全明文数据库在14%~17%之间。
场景三:对全部业务数据列加密
测试结果
Terminal数量 | 全明文(TPS) | 100%敏感列加密(TPS) | 性能损耗 |
8 | 260.55 | 201.62 | 22.62% |
16 | 302.78 | 238.45 | 21.25% |
24 | 330.04 | 256.36 | 22.32% |
32 | 343.65 | 267.92 | 22.04% |
通过上述测试结果可以发现,对全部业务数据列加密的情况下,全密态数据库在TPC-C测试下的性能损耗相比全明文数据库在21%~22%之间。