亚马逊AWS官方博客

为 Amazon Aurora PostgreSQL 配置性能测试框架

Original URL: https://aws.amazon.com/blogs/database/configure-a-performance-testing-framework-for-amazon-aurora-postgresql/

在这篇博文中,我们演示了如何使用 AWS CloudFormation、开源 Apache JMeter 和 Python 为 Amazon Aurora PostgreSQL 兼容版本数据库生成性能测试框架。此性能测试模型可以帮助您在 Aurora PostgreSQL 上运行负载测试的多次迭代,并根据数据库版本、配置和实例类型做出数据驱动型决策。这篇博文重复使用了博文 Deploy an Amazon Aurora PostgreSQL DB cluster with recommended best practices using AWS CloudFormation(使用 AWS CloudFormation 以推荐的最佳实践部署 Amazon Aurora PostgreSQL 数据库集群)中的 CloudFormation 模板以及 aws-samples GitHub 存储库来构建解决方案资源。

解决方案概览

此性能测试框架提供以下资源:

  • 用于创建 Amazon Virtual Private Cloud(Amazon VPC)资源、Amazon Elastic Compute Cloud(Amazon EC2)实例和 Aurora PostgreSQL 数据库的 CloudFormation 模板
  • 用于在测试数据库中创建数据库对象的 Python 脚本
  • 可以在任意服务器上导入并运行的预配置 Apache JMeter 测试计划

您可能需要根据单独的使用案例重新调整和优化这个测试框架。

Amazon Aurora 是一种关系数据库服务,既具有高端商用数据库的性能和可用性,又具有开源数据库的简单性和成本效益。Aurora 与 MySQL 和 PostgreSQL 完全兼容,可以运行现有应用程序和工具而无需修改。

Apache JMeter 是一种广泛使用的开源负载测试工具,支持各种应用程序的负载测试,可以模拟服务器、数据库、网络和 Web 应用程序上的高负载。您可以创建虚拟用户并添加“思考时间”,用于模拟实时生产负载。有关更多详细信息,请参阅 Apache JMeter

下图展示了我们解决方案的架构。

先决条件

确保您已满足以下先决条件:

设置 Amazon VPC 和网络组件

有关设置 Amazon VPC 和网络组件的完整说明,请参阅 Deploy an Amazon Aurora PostgreSQL DB cluster with recommended best practices using AWS CloudFormation(使用 AWS CloudFormation 以推荐的最佳实践部署 Amazon Aurora PostgreSQL 数据库集群)。请注意,不需要构建 Unix 堡垒机。

选择 Launch Stack(启动堆栈)以使用 AWS CloudFormation 构建 Amazon VPC 和网络组件:

launchvpc

输入以下参数值:

  • Stack name(堆栈名称)– 输入有意义的堆栈名称
  • ClassB 2nd Octet(ClassB 第二个八进制数)– 指定 IPV4 CIDR 块的第二个八进制数

创建堆栈估计需要 5 分钟时间。

构建 Amazon EC2 Windows 计算机

选择 Launch Stack(启动堆栈)以使用 AWS 构建您的 Amazon EC2 Windows 计算机:

构建 ec2 计算机

输入以下参数值:

  • Stack name(堆栈名称)– 输入有意义的堆栈名称
  • InstanceType – t3.2xlarge(默认值)
  • KeyName – Windows Amazon EC2 的密钥对
  • ParentVPCStack – 用于构建上一步中 Amazon VPC 组件的堆栈名称
  • SourceCidrForRDP – 客户使用 RDP 登录到 Amazon EC2 的 IP

创建堆栈估计需要 5 分钟时间。

CloudFormation 堆栈创建了一台 Windows EC2 计算机,稍后您可以用来安装 JMeter 并启动 JMeter 负载测试。在 Amazon EC2 控制台上,您应该会看到一个名为 JMeterApp 的 EC2 实例处于 Running(正在运行)状态。

ec2_running_screenshot

设置 Aurora PostgreSQL 数据库

选择 Launch Stack(启动堆栈)以创建 Aurora 数据库基础设施:

aurora_cloudformation

有关完整说明,请参阅 Deploy an Amazon Aurora PostgreSQL DB cluster with recommended best practices using AWS CloudFormation(使用 AWS CloudFormation 以推荐的最佳实践部署 Amazon Aurora PostgreSQL 数据库集群)中所述。

创建堆栈估计需要 10 分钟时间。

由于链接博文中的 Unix 堡垒机不是必需的,因此对于 ParentSShBastionStack,请输入在上一节中用于构建 Windows Amazon EC2 实例的堆栈名称。

成功创建数据库后,登录 AWS Secrets Manager 控制台并记下数据库的用户名、密码、端口和主机名。

设置 Apache JMeter

登录 Amazon EC2 Windows 计算机并执行以下步骤来配置 JMeter:

  1. 在 Amazon EC2 计算机上下载并安装最新的 Java
  2. 下载并安装 Apache JMeter
  3. 下载 Apache JMeter Plugins Manager 并将其放在 %JMETER_HOME%/lib/ext 下。

JMeter Plugins Manager 管理执行此负载测试所需的插件。有关更多详细信息,请参阅 JMeter Plugins Manager

  1. 将 Apache JMeter 的堆大小增加到 4G:
    # cd <JMeter Installation Directory>/bin

    编辑 jmeter.bat 并更新以下内容:

    set HEAP=-Xms4g -Xmx4g -XX:MaxMetaspaceSize=256m
  2. 在 EC2 计算机中下载 PostgreSQL JDBC 连接 JAR 文件
  3. 在 EC2 计算机中安装 Python(3.xx 或更高版本)。
  4. 安装 pip 和 psycopg2:
    # python -m pip install psycopg2
    
  5. DBeaver 社区版客户端下载到 EC2 计算机。
  6. 使用从 AWS Secrets Manager 检索到的数据库连接详细信息,并使用 DBeaver 验证数据库连接。
    # SELECT NOW(),current_database();
    now |current_database|
    -----------------------------+----------------+
    2022-09-28 10:42:40.473 -0400|postgres |
  7. 下载附加的 Apache JMeter JMX 文件(TestPlan_Jmeter_insert_update.jmx)以执行负载测试并将其放在 EC2 计算机 <testdata_directory> 的任意目录下。

准备测试数据

要准备测试数据,请使用从 AWS Secrets Manager 检索到的数据库凭证在测试数据库上运行 Python 脚本(python_create_testdata.py)。

打开命令提示符,然后运行以下命令:

# python python_create_testdata.py <dbuser> <dbpassword> <testdb> <clusterhostname>

此脚本创建架构、表、分区、索引和函数,为负载测试做准备。您可以多次运行该脚本,它将删除现有的数据库对象并重新创建数据库对象来运行性能测试。

Apache JMeter 测试计划描述

本博文中使用的 Apache JMeter 测试计划有三个线程组:

  • 150kb_update_insert – 此线程组对测试表执行 150 KB 的负载插入和更新。它具有以下参数:
    • 用户数 – 2
    • 热机时间 – 300 秒
    • 循环次数 – 288000
    • 吞吐量控制器 – 90% 插入,10% 更新
  • 2MB_Insert – 此线程组对测试表执行 2 MB 的插入。它具有以下参数:
    • 用户数 – 1
    • 热机时间 – 1 秒
    • 循环次数 – 8
    • 吞吐量控制器 – 100% 插入
  • 75MB 负载插入 – 此线程组对 Python 脚本创建的表执行插入。它具有以下参数:
    • 用户数 – 1
    • 热机时间 – 1 秒
    • 循环次数 – 2
    • 吞吐量控制器 – 100% 插入

为了更好地了解不同的 JMeter 组件,请参阅关于 Building a database test plan(构建数据库测试计划)的 JMeter 文档。

性能测试运行

要运行性能测试,请完成以下步骤:

  1. 在 Amazon EC2 Windows 计算机中,通过选择 %JMETER_HOME%/bin/jmeter.bat,在 GUI 模式下启动 Apache JMeter
  2. 选择 Apache JMeter 可执行文件以打开控制台。
  3. 选择 File(文件)、Open(打开),然后选择 TestPlan_Jmeter_insert_update.jmx
  4. 选择 Testplan_to_insert_Update,然后从 Amazon EC2 计算机上选择 PostgreSQL 驱动程序。Apache_Jmeter_testcase
  5. 选择 Database and JMeter Configuration(数据库和 JMeter 配置),然后使用集群主机、数据库名称、用户名和密码更新 Aurora PostgreSQL 数据库详细信息。testcase_jarlocation
  6. 右键单击线程组并确认所有线程组均已启用。
  7. 展开每个线程组并右键单击以禁用侦听器。
    testcase_listeners
  8. 完成上述所有步骤后,关闭 JMeter GUI 屏幕以在 CLI 模式下运行负载测试。
  9. 打开命令提示符,然后在 CLI 模式下运行负载测试:
    # %JMETER_HOME%/bin/jmeter.bat -n  
    -t "<testdata_directory>/TestPlan_Jmeter_insert_update.jmx" -l "<output directory>/”<output_filename>.jtl"

性能测试结果

您可以通过从 Apache JMeter GUI 打开输出文件(<output directory>/<output_filename>.jtl)在 Apache JMeter 上查看结果,如以下屏幕截图所示。

Jmeter_TestResults

您还可以使用以下命令生成控制面板报告:

# %JMETER_HOME%/bin/jmeter.bat -g "<output directory>/output_filename.jtl" 
-o <reportDirectory>

此报告以 HTML 格式生成,可以通过选择以下文件来查看:<reportDirectory>/index.html

控制面板报告提供负载测试的以下指标:

  • 运行的开始时间和结束时间
  • APDEX(应用程序性能指数)
  • 显示所有失败和成功请求的请求摘要图
  • 统计表,提供有关响应时间、吞吐量和网络速度的信息
  • 错误摘要表,提供在运行 Jmeter_results_1htmlJmeter_reportt_html2 JmeterReport-3-html 期间遇到的错误类型

除了所有这些指标之外,该控制面板还向下钻取了其他重要图表:

  • 随时间变化
  • 吞吐量
  • 响应时间

下图通过显示不同线程组在一段时间内的平均响应时间(以毫秒为单位),描绘了“随时间变化”。

Jmeter_dashboard_overtime

下图通过显示不同线程组在一段时间内的每秒命中次数,描绘了“吞吐量”图表。

Jmeter_dashboard-Throughput

下图通过显示不同线程组在一段时间内的响应时间百分位数,描绘了“响应时间”图表。

Jmeter_dashboard_Responsetime

有关 JMeter 控制面板和图表的更多详细信息,请参阅 Generating Report Dashboard(生成报告控制面板)。

此外,您可以使用 Amazon CloudWatch 指标和 Amazon RDS 性能详情来查看操作系统和数据库的性能。

下图显示了测试运行期间的操作系统指标、数据库负载和最常运行的 SQL,如 Amazon RDS 性能详情所示。

Perf_Insights_Dbload Perf_Insights_OS_Metrics Perf_insights_WAitevent_SQL

运行多次迭代

要针对不同的数据库配置重新运行测试,请完成以下步骤:

  1. 在 AWS CloudFormation 控制台上,使用配置更改(数据库实例、数据库版本)更新堆栈。
  2. 从 Secrets Manager 检索数据库详细信息和凭证。
  3. 重新运行 Python 脚本以重新加载数据。
  4. 使用数据库凭证和集群信息更新 Apache JMeter,然后重新运行测试。

清理

为避免不必要的费用,请在使用完此解决方案后,删除通过 CloudFormation 堆栈创建的资源。要彻底删除,请通过 AWS CloudFormation 控制台,按以下顺序删除 CloudFormation 堆栈:

  1. 删除数据库的堆栈。
  2. 删除 Amazon EC2 JMeter 的堆栈。
  3. 删除 VPC 的堆栈。

结论

在这篇博文中,我们提供了一个基于 AWS CloudFormation、Python 脚本和 Apache JMeter 构建的测试框架,您可以用它来运行性能测试。该框架可以为有关如何进行性能测试以及如何轻松创建测试数据提供见解,并且您可以评估任何选定数据库配置的结果。

如果您有任何问题或建议,请留言。


关于作者

Ishwar Adhikary 是 Amazon Web Services(AWS)的数据库顾问。他与客户密切合作,对他们的数据库和应用程序基础设施进行现代化改造。他的重点领域是将关系数据库从本地数据中心迁移到 AWS Cloud。

Jagrit Shrestha 是 Amazon Web Services(AWS)的数据库顾问。他是数据库专家,帮助客户将其本地数据库工作负载迁移到 AWS 并提供技术指导。

John Lonappan 是 Amazon Web Services(AWS)的高级数据库专家顾问/解决方案架构师,重点领域是关系数据库。在加入 AWS 之前,John 曾作为数据库架构师,在全球大型数据中心提供商中任职。工作之余,他热爱长途驾驶、EV 改装、下棋和旅行。

Bharath Kumar 是 AWS Professional Services 的首席数据库顾问。他一直在支持并帮助客户将其数据库从本地数据中心迁移到 AWS Cloud,以及从商用数据库引擎迁移到 Amazon 中的开源数据库。