RDS PostgreSQL通用云盘IO加速

当您需要应对数据库磁盘IO性能瓶颈时,云数据库RDS PostgreSQL的通用云盘IO加速功能为您提供了一个高效的解决方案。本文档将详细介绍该技术的优势、适用场景和工作原理,帮助您在面临大规模或频繁数据读写需求时显著提升数据库性能。

背景

RDS PostgreSQL在数据处理过程中,数据会从磁盘读取到内存,在内存中处理完成后,数据再从内存写入到磁盘中。与内存操作相比,磁盘IO操作运行速度较慢,将会消耗更多的时间。当业务出现大规模数据读写或频繁数据读写请求时,磁盘IO操作可能成为数据库系统的瓶颈。

因此,阿里云数据库RDS PostgreSQL推出新的存储类型——通用云盘。在兼容ESSD云盘所有特性的基础上,通用云盘采用三级存储架构对不同类型的数据进行分级管理,并且引入了IO加速功能,以提升RDS PostgreSQL实例的QPS性能。更多信息,请参见通用云盘

功能介绍

IO加速功能对应通用云盘三级存储架构中的缓存层,主要是通过高速缓存介质来提升数据库的读写性能,以提高SQL查询处理的速度。针对临时表和查询产生的临时文件,RDS PostgreSQL的IO加速能力允许将这些临时数据存储到高速的缓存介质中,使得数据库引擎对这些临时数据的读写IO更快,大大加快查询的处理,在复杂查询场景下可提高100%查询性能。

价值效益

RDS PostgreSQL实例开启IO加速功能后,目前无需支付任何额外费用。您可以在无任何成本变化和业务改动的情况下,在适用场景下大幅度提升数据库的QPS性能。具体适用场景,请详见适用场景

适用场景

下列是一些IO加速功能适用的业务场景:

  • 排序、分组聚合、联合等产生临时结果的复杂操作

  • 使用CTE通用表达式的递归查询

  • 无法使用适当索引的复杂查询

  • 对大表或多个表的分析型查询

  • 其他使用临时表的工作负载

支持范围

满足以下条件的RDS PostgreSQL实例支持该功能:

  • 计费方式:包年包月或按量付费

  • 实例大版本:PostgreSQL 11或以上

  • 内核小版本:20231030或以上

  • 产品系列:高可用系列

  • 产品类型:标准版

  • 存储类型:通用云盘

  • 实例规格族:通用型

  • 实例所在地域及可用区:

    地域

    可用区

    西南1(成都)

    可用区B

    华北2(北京)

    可用区I

    华东2(上海)

    可用区M

    可用区N

    华东1(杭州)

    可用区J

    说明

    在售卖页面开启IO加速功能后,可在主可用区及网络处查看是否支持

技术原理

image
  • Cache Disk表示高速缓存介质,是一种读写性能介于内存和通用云盘之间的存储介质,其读写性能要优于通用云盘,因此非常适合作为数据库中临时数据的缓存盘。

  • RDS PostgreSQL数据库服务端收到用户的SQL查询后,由查询执行器对查询进行处理,其根据查询要访问的数据所在的表空间决定数据存储的位置。

    • 在未开启IO加速功能时,所有数据只能存储在云盘上。

    • 开启IO加速功能后:

      • 如访问的是非临时数据(正常的表、视图等数据),则还是从云盘读取数据到内存中进行处理;

      • 如访问的是临时数据(临时表、临时文件等数据),则从高速缓存盘读写数据。

具体而言,实例创建的临时表等临时对象(不显式指定表空间)和在查询执行过程中产生的临时文件都将被存储到高速缓存介质中,从而提升数据库对这些临时数据的读写,在一定时间内可以执行处理更多的查询。

说明

RDS PostgreSQL是通过表空间来设置数据库对象的存储位置,以实现数据的冷热分离,因此我们使用表空间rds_temp_tablespace来抽象其背后的高速缓存介质。您可以在开启IO加速的实例中看到该表空间。而使用该表空间还需要您正确设置数据库参数temp_tablespaces,具体详见开启IO加速

注意事项

  • 高速缓存介质仅用于存储临时缓存数据,RDS PostgreSQL不保证存储在表空间rds_temp_tablespace的数据的持久性,当实例发生变配等迁移动作后,这些数据会丢失,所以请勿将非临时表等数据对象的表空间设置为该表空间。

  • RDS PostgreSQL开启IO加速功能后,会根据不同实例规格提供一定容量的高速缓存空间,当该空间写满时,会报错No space left on device,该问题不影响非临时数据的相关SQL执行。

  • 开启或关闭IO加速功能后,实例约有30秒不可用,建议在业务低峰期执行功能的开启和关闭操作。

开启IO加速

  1. 打开IO加速开关。

    RDS PostgreSQL支持在购买新实例时打开IO加速开关,也支持对满足支持范围的已有实例打开IO加速开关。

    • 购买新实例时打开IO加速开关

      您可以在购买实例时,选择满足支持范围的参数后,开启IO加速功能:image

    • 满足支持范围的已有实例打开IO加速开关

      1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
      2. 基本信息区域,单击存储类型后的通用云盘开关设置,在弹出的对话框中,打开IO加速开关。image

  2. 修改数据库参数。

    当实例打开IO加速开关后,RDS PostgreSQL会生成一个名为rds_temp_tablespace的表空间,其背后使用的存储介质是支持IO加速的高速缓存介质。使用该表空间作为默认的临时表空间,您还需要将数据库参数temp_tablespaces设置为rds_temp_tablespace。参数设置请详见设置实例参数

    说明
    • 您可以执行以下的SET语句在会话级别设置该参数:

      SET temp_tablespace TO 'rds_temp_tablespace';
    • 您可以将参数temp_tablespaces设置为'',切换回云盘存储。

  3. 使用缓存加速功能。

    开启IO加速开关并修改数据库参数后,您就可以在创建临时表时,默认使用rds_temp_tablespace表空间。

    1. 连接RDS PostgreSQL实例

    2. 创建测试表。

      -- 创建非临时表test_table
      CREATE TABLE test_table (di INT);
      
      -- 创建临时表test_temp_table
      CREATE TEMPORARY TABLE test_temp_table (id INT);
    3. 查询测试表的表空间。

      SELECT
          c.relname AS table_name,
          COALESCE(t.spcname, 'pg_default') AS tablespace_name
      FROM
          pg_class c
      JOIN
          pg_namespace n ON c.relnamespace = n.oid
      LEFT JOIN
          pg_tablespace t ON c.reltablespace = t.oid
      WHERE
          c.relkind = 'r'
          AND c.relname IN ('test_table', 'test_temp_table');

      返回结果示例:

         table_name    |   tablespace_name
      -----------------+---------------------
       test_table      | pg_default
       test_temp_table | rds_temp_tablespace
      (2 rows)

相关文档

  • RDS PostgreSQL支持的其他存储类型,请参见存储类型介绍

  • 通用云盘的更多介绍,请参见通用云盘

  • 如果您的业务波动较大,业务波峰较频繁,可以开启通用云盘的IO突发功能,使云盘的IOPS不受限于最大IOPS,在业务波峰时获得更高的IO能力,满足突发业务需求。更多信息,请参见IO突发

常见问题

Q:SQL执行时,报错ERROR: could not write to file "pg_tblspc/xxxx": No space left on device,如何处理?

A:该报错是由于高速缓存介质的表空间rds_temp_tablespace已满造成的,您可以结束当前会话(RDS PostgreSQL内核将自动清理临时文件回收空间),重连实例后再次尝试之前失败的SQL语句。

说明

如问题仍未解决,您可以修改参数temp_tablespaces的取值为'',切换回云盘存储。