当您需要应对数据库磁盘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加速功能后,可在主可用区及网络处查看是否支持。
技术原理
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加速
打开IO加速开关。
RDS PostgreSQL支持在购买新实例时打开IO加速开关,也支持对满足支持范围的已有实例打开IO加速开关。
修改数据库参数。
当实例打开IO加速开关后,RDS PostgreSQL会生成一个名为
rds_temp_tablespace
的表空间,其背后使用的存储介质是支持IO加速的高速缓存介质。使用该表空间作为默认的临时表空间,您还需要将数据库参数temp_tablespaces
设置为rds_temp_tablespace
。参数设置请详见设置实例参数。说明您可以执行以下的SET语句在会话级别设置该参数:
SET temp_tablespace TO 'rds_temp_tablespace';
您可以将参数
temp_tablespaces
设置为''
,切换回云盘存储。
使用缓存加速功能。
开启IO加速开关并修改数据库参数后,您就可以在创建临时表时,默认使用
rds_temp_tablespace
表空间。创建测试表。
-- 创建非临时表test_table CREATE TABLE test_table (di INT); -- 创建临时表test_temp_table CREATE TEMPORARY TABLE test_temp_table (id INT);
查询测试表的表空间。
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)
相关文档
常见问题
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
的取值为''
,切换回云盘存储。