写点什么

鱼和熊掌如何兼得?一文解析 RDS 数据库存储架构升级

  • 2024-01-31
    陕西
  • 本文字数:4511 字

    阅读完需:约 15 分钟

鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级

在 2023 年云栖大会上,阿里云数据库产品事业部负责人李飞飞在主题演讲中提到,瑶池数据库推出“DB+存储”一体化能力,结合人工智能、机器学习、存储等方法和创新能力,实现 Buffer Pool Extension 能力和智能冷温热数据分层能力。在大会的《云数据库 RDS 年度发布与最佳实践》演讲中,阿里云 RDS 及 OLAP 开源产品部负责人彭祥表示,面对当前越来越丰富且复杂的数据环境,性能、弹性、成本是数据库用户的三大重点诉求;阿里云 RDS 产品在业界率先推出新型存储类型——通用云盘,将云盘的 IOPS 与容量彻底解耦,增加缓存扩展的能力,用技术提升 RDS 产品 IO 性能,降低存储降本。


👉RDS 通用云盘 IO 加速功能现已全网公测,欢迎点击「公测」直达体验。


1. 什么是通用云盘?


介绍通用云盘前,我们先来说说存储。众所周知,数据库架构设计由下至上可分为存储层、引擎层、服务层、网络层。存储层负责数据的持久化存储和读取,处于整个数据库系统架构的最底层。数据存储和数据检索读取是它的两大功能。在数据库中,存储层常见的存储类型,往往有基于物理机本地硬盘的本地盘和基于分布式存储架构的云盘。本地盘存储,数据存储与计算资源位于同一物理服务器节点上,由于数据读写不需要经过网络传输,因此 IO 延迟通常较低,随机读写性能高,但本地盘的存储容量受限于单个服务器的硬件配置,一旦服务器出现故障,可能影响数据的安全性和可用性,且本地盘存储容量难以独立扩展;云盘基于分布式存储架构,数据存储与计算资源分离,用户可独立地按需调整计算和存储资源,提高了资源的利用率和灵活度,但云盘通过网络为计算节点提供存储服务,多少会对 IO 延时有所影响,而且,云盘的性能,往往跟其容量绑定,提升性能大部分情况下势必需要提升云盘容量,除此之外,云盘不支持缩容。


而在调研和分析用户业务场景的过程中,我们发现,在多个行业,例如电商行业、新零售行业、游戏行业等,用户业务流量并不是一直持续一个水位,有明显的波峰波谷特征,如何让性能不受容量影响,顺应峰值的到来而提升,如何得到性能(低延迟、高持久)的同时做到完美的成本控制(低成本),已然成为大部分客户在数据库选型中的关注点。阿里云 RDS 产品,率先推出了通用云盘,同时满足用户关于低成本、低延迟、高持久性的诉求


通用云盘,首先是一种云盘。但与当前业界主流云盘的区别在于,通用云盘深度融合 PaaS 层和 IaaS 层的技术创新,改变了传统的数据存储结构,将原有的单一数据存储划分为了三层存储结构:缓存层、数据层、冷存层。热数据存入缓存盘(High Performance Disk),温数据存入数据盘(ESSD 云盘),归档数据存入冷存盘(OSS 对象存储)。这样的存储结构设计中,将缓存盘作为可扩展的一部分,达到 IO 加速的效果;基于 AliSQL 独有的内核能力,轻松应对读写数据库过程中的 IO 突发情况发生,并支持最小 10GB,最大 64T 的容量空间、云盘缩容以及自动秒级扩容的功能;同时,将不常用的冷数据归档存储于对象存储上,又实现使用成本的节约。通用云盘将 IO 性能与云盘容量解耦,使得数据层在 IO 性能与云盘容量两个方面都实现了极致弹性。



2. 三层存储是怎样的一种架构?



通用云盘的架构设计如上图所示,从左至右依次是缓存层、数据层、冷存层。各层存储各司其职,选择不同的存储介质,在对应存储层中发挥价值最大化。


  • 缓存层:处理高 IOPS 和超低 IO 时延需求,一般百万级 IOPS 和微秒级 IO 时延需求。采用阿里云高速缓存盘(High Performance Disk),结合 RDS 数据库引擎的缓存技术,实现查询数据库过程中的 IO 加速功能,带来更高的查询性能。

  • 数据层处理低 IO 时延和数据可靠性需求,一般万级 IOPS 和毫秒级 IO 时延需求。采用阿里云 ESSD 云盘,保障数据的高可靠性和安全性,并借助基础设施和 AliSQL 内核的创新能力,以及 RDS 数据库的管控架构升级,达到 IO 性能与云盘容量的解耦,实现数据库读写过程的 IO 突发功能,提升了 IO 性能与云盘容量的极致弹性。

  • 冷存层:处理数据持久化和存储低成本需求,一般存储在冷存层的数据不常被访问,但有超高的数据库可靠性和持久性需求。采用阿里云对象存储(Object Storage Service,OSS),结合 RDS 数据库引擎的归档技术,实现了数据库的归档功能,并支持通过 ALTER TABLE 实现表文件在数据层和冷存层的切换,为不常访问的数据表提供了更低成本的存储选择



表 1:RDS 通用云盘三层存储介质对比


3. 通用云盘有哪些特征?

在详解特性技术前,我们整理了一张通用云盘三层存储的特性对比表,如下:



表 2:RDS 通用云盘三层存储特性对比


3.1 缓存层特性——IO 加速


IO 加速是指提升数据库查询性能的一种特性。该特性主要体现在通用云盘的缓存层,发挥出高速缓存盘的高 IO 性能优势,从整体上提升数据库的查询性能。相比于 ESSD 云盘,高速缓存盘具备更高的 IOPS 上限和带宽上限,以及更低的 IO 时延。


缓存层通过两种方式实现 IO 加速:

  • 缓存池扩展(Buffer Pool Extension, BPE):利用高速缓存盘进行缓存池扩展,提高缓存命中率,减少数据层 ESSD 的访问次数,加快数据库查询速度。

  • 存放临时表/文件:利用高速缓存盘存放临时表/文件,提高临时表/文件的访问速度,进而提高数据库查询性能。


基于此,IO 加速特性较适合读负载较高、临时表/文件使用较多的业务场景。当前,RDS 的 MySQL 引擎已支持上述两种方式,RDS 的 PostgreSQL 引擎暂仅支持存放临时表/文件的方式来实现 IO 加速。


3.1.1 缓存池扩展(Buffer Pool Extension, BPE)

缓存池(Buffer Pool,简称 BP)是数据库引擎内存区域的一部分,用于临时存储常用的数据和索引页,从而减少对磁盘的访问次数,提高数据库操作的性能和效率。因此,缓存池越大,缓存命中率就越高,数据库对磁盘的访问次数就越少,整体的查询性能和效率就越高。


但是,缓存池的大小受限于内存资源,而对于数据库系统来说,内存资源的使用往往是比较紧张的。为了能够在不增加内存资源的情况下扩大缓存,并且充分利用高速缓存盘高 IO 性能的优势,RDS 的 MySQL 引擎实现了缓存池扩展的功能,对内存中的缓存池进行扩充,进一步提高缓存命中率,提升数据库整体查询性能。


图1:缓存池扩展工作原理


缓存池扩展作用原理如上图,一次数据页读取的过程:

  1.  客户端侧发起读取数据页的请求。


  1. 请求进入内存的缓存池中查找指定数据页:

  • 如果在缓存池中找到数据页,则返回结果给客户端侧,查询和读取结束。

  • 如果在缓存池中未找到数据页,则执行步骤 3。


  1. 请求进入缓存盘的缓存池拓展中查找指定数据页:

  • 如果在缓存池拓展中找到数据页,则返回数据页给缓存池,再返回结果给客户端侧,查询和读取结束。

  • 如果在缓存池拓展中未找到数据页,则执行步骤 4。


  1. 请求进入 ESSD 的数据表文件中查找指定数据页。找到数据页后返回给缓存池,再返回结果给客户端侧。


  1. 查询和读取请求结束。


3.1.2 存放临时表/文件

对于数据库引擎来说,内存中的缓存池、磁盘中的临时表/文件都会影响数据库的查询性能。临时表/文件用于当前会话或者查询中,存放数据查询过程中产生的中间结果或者超出内存的结果,一般不需要持久化存储到数据文件中,使用后便会被删除。


基于临时表/文件在业务中的无持久化需求,RDS 通用云盘,有别于当前的 ESSD 云盘,更改了临时表/文件的存储位置。之前,RDS 数据库的临时表/文件存放于 ESSD 数据盘中;而推出通用云盘后,临时表/文件可存储于高速缓存盘中,提升了数据库对临时表/文件的访问效率,进而加快数据库查询速度。


以 8 核 16GB 规格为例,IO 加速功能测试结果如下:

  • read_only QPS 提升 80%

  • write_only QPS 提升 33%

  • read_write QPS 提升 103%





3.2 数据层特性——IO 突发和云盘缩容


通用云盘的数据层采用云盘 ESSD 作为存储介质,借助 ESSD 云盘的创新能力实现云盘的 IO 性能与容量解耦,并结合数据库 RDS 的管控架构优势和数据拷贝能力实现云盘的缩容,为数据库实现 IO 性能和云盘容量两方面的极致弹性。


3.2.1 IO 突发


高 IO 负载、波动 IO 负载是较为常见的两种业务场景。RDS 数据库之前接入的 ESSD 云盘(PL1-3),其云盘 IO 性能与容量深度绑定,IOPS 和带宽上限深受存储容量的限制。在这个限制下,应对高 IO 负载、波动 IO 负载的高 IO 洪峰场景时,云盘扩容成为了获得更高云盘 IO 性能的唯一解。


RDS 的通用云盘在数据库通过技术创新,将云盘的 IO 性能与存储容量解耦,提供 IO 性能突发能力,并可根据实际业务的使用量动态调整云盘的 IO 上限。高 IO 负载时,自动触发 IO 突发,提升 IO 上限,IO 负载回落后,自动恢复 IO 上限,实现 IO 性能的极致弹性,避免 IO 性能和成本浪费。


如下测试图例,当开启 IO 突发后,业务 IO 高峰时,RDS 实例的 IOPS 使用率会突破 100%。


图2:RDS通用云盘IO突发测试


目前,RDS 通用云盘 IO 突发功能已支持 RDS MySQL、PostgreSQL 和 SQL Server 三款引擎。


3.2.2 云盘缩容

众所周知,云盘不支持缩容。但 RDS 通用云盘,借助 RDS 数据库管控架构和 AliSQL 内核的优势,结合数据拷贝功能,实现了 RDS 云盘缩容。同时,基于云盘本身的秒级扩容能力,可以让客户根据业务需求自由地调整云盘容量,实现云盘容量的极致弹性。


3.3 冷存层特性——数据归档


通用云盘的冷存层数据层采用对象存储 OSS 作为存储介质,将表级别数据归档于 OSS 中,并不影响用户正常查询 OSS 中归档表数据。开启数据归档功能后,客户可通过 ALTER TABLE 将表文件在 ESSD 数据盘与 OSS 对象存储之间切换,同时在 OSS 中的归档表支持正常的查询。


OSS 存储成本远低于 ESSD,所以数据归档功能可以为客户不常访问的表大幅度降低存储成本。数据归档特性较适用于有不常访问或修改的表的业务场景。冷存层通过数据库内核直接访问对象存储和借助 JuiceFS 访问对象存储 OSS 两种方式实现数据归档。


3.3.1 数据库内核直接访问对象存储

数据库内核直接访问对象存储是指归档表数据 put 到 OSS 中,并通过 get 访问 OSS 归档表数据。RDS 的 MySQL 引擎主要采用这种方式。值得注意的是,为确保归档表的兼容性,AliSQL 内核采用 InnoDB 引擎存储格式。因此,缓存池扩展能力(BPE)仍然能够作用于归档表,对其查询性能进行加速。


开启数据归档功能后,可通过执行 ALTER TABLE,将正常表上传至 OSS 转变成归档表,也可通过 ALTER TABLE 将归档表转为正常表。归档表目前仅支持读操作,用户可通过 SELECT 语句访问归档表中的内容。MySQL 内核会对用户指定的归档表执行具体操作如下:


  • 将数据表对应的 ibd 文件,按照 oss_block_size 指定的大小(默认 2MB)切分成文件块。

  • 利用 OSS 的 sdk 将切分后的文件块上传到 OSS 中。

  • 在 ESSD 数据盘上保留 space header 文件,加速实例的启动和表文件的扫描速度。


图3:RDS MySQL冷存归档数据流


3.3.2 借助 JuiceFS 访问对象存储


借助 JuiceFS 访问对象存储 OSS 的数据归档方式,主要用于 RDS PostgreSQL 引擎。


这种方式下,开启数据归档功能后,RDS PostgreSQL 实例除了数据目录外,会增加归档目录/cold-jfs 及对应的表空间 rds_oss。客户可通过 ALTER TABLE 语句将对应的表转移到 rds_oss 表空间中。处于 rds_oss 表空间中的数据会借助 JuiceFS 文件系统上传到 OSS 上,并不占用 ESSD 数据盘空间。rds_oss 表空间中的所有表均为归档表,客户可以用正常的查询语句查询归档表中的数据。


图4:RDS PostgreSQL冷存归档数据流


RDS MySQL 冷存表只读性能测试结果如下:

相比于正常表,冷存表的 QPS 是正常表的 15%左右。



4. 总结

性能、弹性、成本,是客户实际使用数据库过程中关注的三个重要方面。RDS 业界率先推出的通用云盘,是 PaaS 层和 IaaS 层的深度融合的技术最佳实践,通过三层存储架构设计(缓存层、数据层和冷存层),每一层采用使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。

用户头像

微信公众号「阿里云瑶池数据库」 2023-06-19 加入

瑶池,喻指汇聚宝藏之地。阿里云瑶池数据库,汇集数据无价之宝,让数据业务持续在线,数据价值不断放大。

评论

发布
暂无评论
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级_数据库_阿里云瑶池数据库_InfoQ写作社区