PolarDB Serverless弹性能力

更新时间:2025-02-27 06:54:55

PolarDB Serverless是基于SIGMOD 2021论文中所提出的成熟技术最终产品化的结果。借助于全局一致性(高性能模式)无感秒切两项核心技术,其在跨机扩展和跨机切换能力方面均达到了较高的水平。本文将使用Sysbench工具对PolarDB Serverless的弹性能力进行测试。您可以按照本文所述的方法自行进行测试,从而快速了解Serverless的弹性能力。

效果展示

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

单节点扩缩

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

多节点扩缩

测试配置

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

  • PolarDB MySQL集群配置如下:

    • 集群个数:1

    • 计费类型Serverless

    • 数据库引擎MySQL 8.0.1

    • 产品版本企业版

    • 存储类型:PSL5

    说明

    在购买Serverless集群时,规格及代理中的只读节点个数的伸缩上下限以及单节点的伸缩上下限保持默认设置即可。更多购买操作说明,请参见创建Serverless集群

  • ECS实例配置如下:

    • 实例个数:1

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

    • 镜像:Alibaba Cloud Linux 3.2104 LTS 64

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

测试工具

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

准备工作

购买环境

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

安装Sysbench工具

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

sudo yum -y install sysbench
说明

此处以Alibaba Cloud Linux系统为例。若您安装的是其他操作系统,需调整相应的安装命令,详情请参见Sysbench官方文档

配置集群信息

前往PolarDB控制台创建数据库创建数据库账号以及获取连接地址和端口

说明
  • ECS实例与PolarDB MySQL集群处于同一专有网络VPC内,则无需进行集群白名单的配置。创建集群后,系统会默认将集群所在的VPC网段添加至default分组。

  • ECS实例与PolarDB MySQL集群未处于同一专有网络VPC内,您可以选择将ECS的公网IP地址添加至新的IP白名单分组,或将ECS所在的安全组添加至集群白名单中。

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

数据准备

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

  • Serverless集群参数:

    • <host>:集群地址。

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

    • <user>:数据库账号。

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

    • <database>:数据库名称。

  • 其他参数:

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

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

sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=128 --table-size=1000000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=32 --time=12000 prepare

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

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

调整Serverless配置

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

image

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

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

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

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

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

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

    image

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

    随着压力的停止,PCU数量从7逐步阶梯式地降低至1。CPU使用率瞬间降至接近0。由于读写混合测试中包含UPDATE请求,当压力停止后,PolarDB仍会继续执行purge undo操作,因此会占用微量的CPU资源。接下来观察内存使用率,在每次缩容时,内存使用率会立即降低,随后再升高一个台阶。这是由于PolarDB在缩容之前,会首先调整内存相关参数(如Buffer Pool、Table Open Cache等)以触发缓存回收,因此使用率会立刻降低。在参数调整完成后,只有在确保内存资源已被释放的情况下,才会真正缩小容器的Mem规格。当Mem上限调小后,相当于分母变小,因此计算得出的内存使用率将会上升。

    image

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

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

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

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

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

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

    image

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

传统的MySQL主备一写多读集群的只读节点面临Binlog复制延迟问题,通常不支持转发TP业务的读操作,仅服务于对全局一致性不敏感的报表等业务。此外,由于Binlog复制仅同步已提交事务的日志,这导致只读节点无法处理事务中的写后读。

PolarDB Serverless借助于全局一致性(高性能模式),简称SCC,能够实现跨节点的无损读扩展。Serverless集群会在所有弹出只读节点上默认启用SCC。SCC加上Proxy的高级事务拆分技术,使得跨事务、事务前和事务中的写后读请求都可以轻松扩展到集群的只读节点,并保证全局一致性。最终,主节点省下来的资源就可以支持更多的写请求。使用唯一的集群地址访问Serverless集群,您不会受到跨节点的读一致性的问题困扰,即您无需关心请求是由主节点直接执行,还是被转发到只读节点执行。

调整Serverless配置

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

image

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

首先,进行一次128个线程的测试,初步了解一下Serverless的横向扩缩弹性能力。

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

    说明

    压测前,请确保主节点在先前测试结束后已降至1 PCU。

    sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=128 --table-size=1000000 --report-interval=1 --range_selects=1 --db-ps-mode=disable --rand-type=uniform --threads=128 --time=12000 run
  2. 前往PolarDB控制台,在基本信息页面的数据库节点区域,可以看到,在压力执行一段时间后,系统开始自动创建只读节点。image

    一段时间后进入稳定状态,系统不再继续创建只读节点。

    image

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

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

    主节点很快提升至32 PCU,创建的只读节点开始承担部分读负载,从而使主节点的CPU使用率下降。由于弹出的只读节点的CPU使用率未超过弹性阈值80%(默认配置),因此在该压力下仅会扩容一个只读节点。image

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

接下来,停止当前的压测,并将线程数提升至2倍,即将线程数(--threads参数)设置为256。

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

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

    image

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

    image

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

    Serverless监控信息中,会观察到多个只读节点的负载曲线。当新的只读节点被弹出后,先前的节点负载将逐步降低,最终达到一个大致的均衡状态。这表明Proxy成功地将负载均衡至新弹出的只读节点。由于目前Serverless为了避免频繁的规格震荡,弹升弹降的阈值是一个大区间。image

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

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

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

  • 本页导读 (1)
  • 效果展示
  • 测试配置
  • 测试工具
  • 准备工作
  • 购买环境
  • 安装Sysbench工具
  • 配置集群信息
  • 数据准备
  • 单节点纵向扩缩测试(Scale-up)
  • 调整Serverless配置
  • 初步验证:低负载(16线程)
  • 深入验证:高负载(128线程)
  • 多节点横向扩缩测试(Scale-out)
  • 调整Serverless配置
  • 初步验证:低负载(128线程)
  • 深入验证:高负载(256线程)