PolarDB Serverless弹性能力

PolarDB Serverless是基于SIGMOD 2021论文中所提出的成熟技术最终产品化结果。本文将使用Sysbench工具对PolarDB Serverless的弹性能力进行测试。您可以按照本文所述的方法自行进行测试,从而快速了解Serverless的弹性能力。

测试配置

  • ECS实例和PolarDB PostgreSQL集群位于同一地域,同一专有网络VPC内。

  • PolarDB PostgreSQL集群配置如下:

    • 集群个数:1

    • 计费类型Serverless

    • 数据库引擎

    • 产品版本标准版

    • 存储类型及空间:ESSD AutoPL云盘(预置IOPS: 0),100 GB

    说明

    创建Serverless集群时,规格中的只读节点个数的伸缩上下限以及单节点的伸缩上下限保持默认设置即可。

  • ECS实例配置如下:

    • 实例个数:1

    • 实例规格:ecs.g7.4xlarge(16 vCPU 64 GiB)

    • 镜像:Alibaba Cloud Linux 3.2104 LTS 64

    • 系统盘:ESSD云盘,性能PL0,容量100 GB

测试工具

Sysbench是一款开源的、跨平台的性能基准测试工具,主要用于评估数据库(例如PostgreSQL)的性能。该工具支持多线程测试,并提供灵活的配置选项。

准备工作

购买环境

根据测试配置,购买ECS实例及PolarDB PostgreSQLServerless集群。

安装Sysbench工具

使用root账号登录ECS实例,安装Sysbench工具。

sudo yum -y install sysbench
说明

此处以Alibaba Cloud Linux系统为例。若您使用的是其他操作系统,请按照Sysbench官方文档调整相应的安装命令。

配置集群信息

前往PolarDB控制台创建数据库账号创建数据库查看连接地址

说明
  • ECS实例与PolarDB PostgreSQL集群处于同一专有网络VPC内,请将ECS的私网IP地址添加至新的IP白名单分组,或将ECS所在的安全组添加至集群白名单中。

  • 连接地址请使用集群地址,而非主地址image

单节点纵向扩缩测试(Scale-up)

通过Sysbench工具验证主节点的规格能够根据负载自动进行伸缩。

数据准备

使用Sysbench工具在PolarDB PostgreSQL集群中准备32张表,每张表包含100,000行数据。执行过程中,可能会导致Serverless集群规格的自动弹升。请在数据准备完成后,耐心等待35分钟,直至主节点的规格降回1 PCU。数据准备命令如下,请根据实际情况调整相关参数:

sysbench /usr/share/sysbench/oltp_read_write.lua --pgsql-host=<host> --pgsql-port=<port> --pgsql-user=<user> --pgsql-password=<password> --pgsql-db=<database> --tables=32 --table-size=100000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=32 --db-driver=pgsql --time=12000 prepare
  • Serverless集群参数:

    • <host>:集群地址。

    • <port>:集群地址所对应的端口号,默认5432。

    • <user>:数据库账号。

    • <password>:数据库账号对应的密码。

    • <database>:数据库名称。

  • 其他参数:

    • --db-ps-modedisable代表禁用预编译语句(Prepared Statements),以确保所有的事务SQL以原始SQL语句的方式执行。

    • --threads:线程数。不同的线程数可以构造不同的负载。此处以32为例,表示在数据准备过程中使用32个线程,预计持续时间为5分钟。

调整Serverless配置

在验证单节点的扩缩测试过程中,需要确保压力测试期间不会有只读节点弹升出来。请前往PolarDB控制台,在集群详情页面的数据库节点区域调整Serverless配置,将单节点资源弹升上限设置为32,单节点资源弹升下限设置为1,只读节点个数伸缩上下限设置为0。image

image

初步验证:低负载(16线程)

首先,进行一次简单测试,评估16个线程的测试效果,从而对Serverless的弹性能力进行初步了解。

  1. 执行以下压测命令。将--threads参数设定为16,其他参数请依据实际情况进行调整。

    sysbench /usr/share/sysbench/oltp_read_write.lua --pgsql-host=<host> --pgsql-port=<port> --pgsql-user=<user> --pgsql-password=<password> --pgsql-db=<database> --tables=32 --table-size=100000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=16 --db-driver=pgsql --time=12000 run
  2. 压测结果如下。根据执行结果分析,在并发数量固定为16的负载条件下,随着时间的推移,吞吐量TPS逐步增加,而延迟LAT逐步降低,最终达到了一个稳定值。这表明在触发Serverless弹性后,系统性能得到了明显提升。

    image.png

  3. 返回PolarDB控制台,在性能监控页面查看Serverless监控指标项。时间范围选择最近的5分钟,可以看到如下监控信息:

    PCU数量由1弹升至4并保持稳定。在弹升过程中,CPU的使用率随着资源的扩容而逐步降低。内存使用率曲线在每次弹升时呈现脉冲形状。这是由于每次PCU增加时,内存资源会进行扩容,此时的内存使用率会瞬时下降。随后,数据库开始利用扩展的内存资源提升计算能力(例如Shared Buffer),因此内存使用率会逐步增加,最终达到一个稳定状态。

    image.png

  4. 停止压测命令,稍等5分钟。随后,调整时间范围至最近的10分钟,可以查看到以下监控信息:

    随着压力的停止,PCU数量从4逐步阶梯式地降低至1。由于读写混合测试中包含UPDATE请求,当压力停止后,PolarDB仍会继续执行vacuum操作,因此会占用少量的CPU资源。

    image.png

深入验证:高负载(128线程)

接下来,将线程数(--threads参数)设置为128,查看PolarDB Serverless集群弹升至最大规格32 PCU所需的时间。在进行压测一段时间后,停止测试。

  1. 执行以下压测命令。将--threads参数设定为128,其他参数请依据实际情况进行调整。具体信息,请参见参数说明

    sysbench /usr/share/sysbench/oltp_read_write.lua --pgsql-host=<host> --pgsql-port=<port> --pgsql-user=<user> --pgsql-password=<password> --pgsql-db=<database> --tables=32 --table-size=100000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=128 --db-driver=pgsql --time=12000 run
  2. 压测结果:根据执行结果,可以明显看出来吞吐量TPS和延迟LAT的变化。

    image

  3. 前往PolarDB控制台,在性能监控页面查看Serverless监控指标项。根据测试时间调整时间范围,可以看到如下监控信息:

    1 PCU弹升至32 PCU耗时大约需要87秒。缩容相比扩容稍显平缓,耗时大约231秒。

    image

多节点横向扩缩测试(Scale-out)

通过Sysbench工具验证集群只读节点数量根据负载自动进行伸缩。

调整Serverless配置

在验证多节点的扩缩测试过程中,需要确保压力测试期间会有只读节点自动弹升出来。请前往PolarDB控制台,在集群详情页面的数据库节点区域调整Serverless配置。将单节点资源弹升上限设置为32,单节点资源弹升下限设置为1,只读节点个数伸缩上限设置为7,只读节点个数伸缩下限设置为0。image

image

验证

进行160个线程的测试,了解Serverless的横向弹性能力。

  1. 执行以下压测命令。将--threads参数设定为160,其他参数请依据实际情况进行调整。具体信息,请参见参数说明

    sysbench /usr/share/sysbench/oltp_read_write.lua --pgsql-host=<host> --pgsql-port=<port> --pgsql-user=<user> --pgsql-password=<password> --pgsql-db=<database> --tables=32 --table-size=100000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=160 --db-driver=pgsql --time=12000 run
  2. 等待一段时间后,系统将开始弹出新的只读节点。

    image.png

  3. 进入稳定状态后,压测结果如下。与之前单节点同压力的测试结果相比,QPS32万上升到34万。根据QPS的表现,已突破单节点弹性测试的最大吞吐量。

    7cedc5d60363ea985bcdb2a8592507c2

    横向弹升,基准对照,单节点:

    image.png

  4. 前往PolarDB控制台,在性能监控页面查看Serverless监控指标项。根据测试时间调整时间范围,可以看到如下监控信息:

    Serverless监控信息中,会观察到新的只读节点的负载曲线。当只读节点被弹出后,先前的节点负载将逐步降低,最终达到一个大致的均衡状态。

    d9cf74e5f83e7010f6d74cc94c57d541

  5. 运行一段时间后,停止压测。根据测试时间调整时间范围,可以看到如下监控信息:

    集群的计算节点首先会自动进行缩容,大约2~3分钟会逐步降至1 PCU。当压力停止后,只读节点的CPU使用率会立刻降低,而主节点还需要执行vacuum操作,CPU消耗会持续一小段时间,最终降到1 PCU。

    之后等待较长一段时间,新增的只读节点也会在15~20分钟内逐步回收。为了避免只读节点频繁的弹性震荡,Serverless没有选择立即回收无负载的只读节点。

    image.png