数据存储成本飙升?莫慌!RDS 数据归档功能来了
![数据存储成本飙升?莫慌!RDS数据归档功能来了](https://static001.geekbang.org/infoq/f7/f7f7c73828583c02713c16ea609702bf.png)
云数据库 RDS「数据归档功能」现已全网公测(2024 年 4 月 24 日-2024 年 6 月 24 日),公测期间免费使用。欢迎点击「公测」直达体验~
1. 为何有数据归档
在 RDS 的使用过程中,存在一种典型场景:存放重要业务历史数据的表在过了特定时间点后,其内容基本不会被修改,仅偶尔被查询。这类历史数据表因存放重要业务数据而不能被删除,但随着时间推移,数据量持续累积,加上 ESSD 成本相对较高,使得对应的数据库存储成本也会随时间增加。如果能将这种不常访问的数据存放到成本较低的 OSS 中,那便能够为客户降低较多成本,阿里云瑶池旗下的云数据库 RDS「数据归档功能」应运而生。
阿里云 RDS 数据归档功能,作为阿里云 RDS 通用云盘三层存储架构中冷存层的核心功能,让用户可以通过 DDL 将不常修改的在线表数据从云盘转移到 OSS 中,转换为归档表。归档表也支持只读,让用户可以访问表数据的同时,节省了云盘存储的成本。此外,OSS 存储空间本身并没有容量上限,所以归档表无需担心容量不足的问题。ESSD 云盘与 OSS 对象存储对比如下表所示:
![](https://static001.geekbang.org/infoq/0d/0dc63789a74cfddd3db7f089f032da49.png)
2. 如何实现数据归档
要实现数据归档功能,在技术层面,主要解决两个问题:
🤔 RDS 如何使用对象存储 OSS?
这个问题保证数据归档的功能可用性,让数据库引擎具备使用 OSS 的能力,能将数据文件存放到 OSS 中并且不影响正常访问。这一部分又分为引擎内部实现和引擎外部实现两种方式。引擎内部实现,通过让 RDS 引擎内核能自行访问 OSS,并在内核中进行在线数据到归档数据的转换,从而实现使用对象存储 OSS;引擎外部实现是借助外部文件系统,为对象存储 OSS 提供 POSIX 兼容,让 RDS 引擎可以像使用本地目录一样使用对象存储 OSS。
🤔 RDS 归档表数据如何实现备份与恢复?
这个问题保证归档表的数据一致性,让归档表的数据能够与在线表数据一起进行备份与恢复。
![](https://static001.geekbang.org/infoq/44/449b0fcd3055d2ac903002c5908fa4f8.png)
2.1 引擎内部实现
云数据库 RDS MySQL 版对 OSS 的使用主要通过引擎内部实现,即在内核中直接使用对象存储 OSS,内核通过参数获取所需的 OSS 信息,在引擎内部访问和使用对象存储 OSS。下图为 RDS MySQL 版数据归档的数据流图:
![](https://static001.geekbang.org/infoq/e3/e3d96efe085609c552546b234a3844f0.png)
当用户开启数据归档功能,执行对应 ALTER TABLE 归档语句后,MySQL 内核会对用户指定的归档数据表执行以下操作,将用户 ALTER TABLE 归档语句中对应的正常表上传到 OSS 上,转变成归档表,用户可通过 SELECT 语句访问归档表中内容:
将数据表对应的 ibd 文件,按照 4M 的 block_size 切分成文件块。
利用 OSS 的 sdk 将切分后的文件块上传到 OSS 中。
在 ESSD 数据盘上保留头文件,以便于访问。
ALTER TABLE 归档语句示例(RDS MySQL 版)
2.2 引擎外部实现
云数据库 RDS PostgreSQL 版对 OSS 的使用主要通过引擎外部实现,即通过 Grail 文件系统来实现对象存储 OSS 的使用。Grail 文件系统通过提供完备的 POSIX 协议,能够让引擎像访问本地磁盘一样访问对象存储上的数据。下图为 RDS PostgreSQL 版数据归档的数据流图:
![](https://static001.geekbang.org/infoq/5d/5d70cbcaa0ed0dd838a44950ac06d14d.png)
当用户开启数据归档功能,在 RDS PostgreSQL 版实例中,除了数据目录外,会自动增加一个归档目录/cold-data,并增加该目录对应的表空间 rds_oss,用户可通过 ALTER TABLE 归档语句将对应的表转移到 rds_oss 表空间中。
处于 rds_oss 表空间中的数据会借助 Grail 文件系统上传到 OSS 对象存储上,不占用 ESSD 数据盘空间。rds_oss 表空间中的所有表均为归档表,用户可以用正常的查询语句查询归档表中的数据。
ALTER TABLE 归档语句示例(RDS PostgreSQL 版)
云数据库 RDS SQL Server 版也主要通过引擎外部实现,但与 PostgreSQL 版不同,SQL Server 版利用 SQL Server 内核原生的数据库分离附加功能结合 OSS 对象存储,实现对数据库文件的操作,以及数据文件在云盘和 OSS 之间的传输。用户可在控制台一键将数据库转冷存归档,数据文件从云盘存储转为 OSS 存储。当有读写操作需求时,同样在控制台将数据库一键从冷存归档转为在线。整个过程便捷、无损。下图为 RDS SQL Server 版数据归档的数据流图:
![](https://static001.geekbang.org/infoq/eb/eb6cf9da970fa5c1bcd79331123e6e69.png)
2.3 归档表备份
RDS 数据归档功能,除了需要保证功能的可用性之外, 还需要从数据层面保证数据的一致性。这就需要对归档表的数据进行一致性备份和恢复。RDS 归档表数据的备份与恢复,是通过 Grail 文件系统的快照和快照克隆来实现的。
Grail 文件系统依托阿里云 EBS、OSS 作为底层存储,针对云数据库服务的 SLA 目标、数据格式和流量特征,提供数据库引擎友好的资源管理、数据压缩、传输缓存、校验等存储层解决方案。
每个 Grail 文件系统都是由数据与元数据组成。其中,数据指的是文件系统中的每个文件经过切片后存储在源端对象存储中的所有对象;而元数据记录了文件系统中每个文件对应的数据组织格式以及各数据块在 OSS 的存储路径。从 Grail 的文件系统组成可以看出,在 OSS 上数据可用的前提下,只要有一份元数据,就可以还原出文件系统中的任意文件。在 RDS 数据归档场景下创建一个 Grail 快照的流程大致如下图所示:
![](https://static001.geekbang.org/infoq/86/860d53f368bd130fbd30c0e1f6985110.png)
业务请求创建快照。
GRAIL SNAPSHOT SERVER 下发[创建快照]请求,锁定 RDS 的 DDL,并从 RDS MySQL 版实例中获取 OSS 元数据。
针对 RDS MySQL 版实例,GRAIL SNAPSHOT SERVER 将获取到的 OSS 元数据进行格式转换;针对 RDS PostgreSQL 版实例,无需进行格式转换。
初次备份时,全量拷贝 OSS 中的数据,并将元数据 dump 到 OSS 中,生成 snapshot v0;后续备份时,会根据元数据,拷贝 OSS 中增量的数据,同时 dump 元数据,生成 snapshot v1、v2、v3 等。
GRAIL SNAPSHOT SERVER 切换数据路径,后续新写入的数据将会写入到新的 version 路径下,并解锁 RDS 的 DDL。
创建快照完成。
3. 如何使用数据归档
阿里云数据库 RDS 已面向用户开放数据归档功能,MySQL、PostgreSQL、SQL Server 三大引擎均已支持。
数据归档功能使用条件
![](https://static001.geekbang.org/infoq/11/11a6b639895114c399ed8495e44a735f.png)
说明
因本地保留头文件,RDS MySQL 版支持数据归档的数据表需大于 6M。
开启/关闭数据归档
通过控制台:新创建 RDS 实例时,在创建页面配置栏开启或关闭数据归档功能;对于已购的符合数据归档功能使用条件的实例,在实例基本信息页,在通用云盘开关设置里,选择开启或关闭数据归档功能。
通过 OpenAPI:针对符合数据归档功能使用条件的实例,可通过调用 ModifyDBInstanceSpec,传入 ColdDataEnabled=true/false,开启或关闭数据归档功能。
查询归档数据
用户可通过控制台查询 RDS 通用云盘的归档数据:在实例的冷存管理页面,便可看到当前实例的归档数据表。
使用数据归档
RDS MySQL 版:通过 DDL 进行归档与取回,如下:
RDS PostgreSQL 版:通过 DDL 进行归档与取回,如下:
RDS SQL Server 版:登录控制台,在实例的数据库管理页面,进行将数据库转冷存数据库的操作。
![](https://static001.geekbang.org/infoq/a2/a2d4cb3008f80eb8afa4c0549a4276d9.png)
4. 数据归档测试
此处以 RDS MySQL 版为例测试冷数据归档前后的只读性能。
测试准备
产品类型:RDS MySQL 版
测试方法:向同一实例执行只读操作,对比冷数据归档前后性能。
测试数据量:285 G(10 tables * 120000000 rows)
测试工具:sysbench
4.1 测试方法
1. 准备数据:执行以下命令,在系统中准备好 285 GB 数据量(10 张数据表,每张表 12000 万行)。
2. 归档数据:使用以下 SQL,将 ESSD 云盘上的数据转存至对象存储 OSS 上。
3. 测试只读性能:执行以下命令测试实例的读性能。
▶︎ 说明
RDS MySQL 版归档功能的默认参数适用于冷数据的低频访问,针对 sysbench 测试模型,修改部分 OSS 参数可以获得性能的提升(调整参数后会有更大的 CPU 消耗);同时,通用云盘的 IO 加速功能能助力数据库的性能提升。因此,在测试过程中,我们会分别进行 IO 加速功能的开启和关闭、OSS 参数的调整等,从而多维度测试性能情况。
![](https://static001.geekbang.org/infoq/f5/f5076148923cd297fe0434353d2eee1a.png)
4.2 测试结果
本处呈现关闭 IO 加速和开启 IO 加速两种场景,默认配置和优化配置下,RDS MySQL 版实例数据归档前后只读性能测试结果对比。
▶︎ 关闭 IO 加速
8 核 16GB 标准版高可用系列通用型 RDS MySQL 实例的只读性能测试结果如下:
默认配置下,归档数据 QPS 性能可达 ESSD PL1 数据 QPS 的 8.4%。
优化配置下,归档数据 QPS 性能可达 ESSD PL1 数据 QPS 的 51.2%。
![](https://static001.geekbang.org/infoq/3e/3eb74cbcb01f7fdc3a87368bfbf5c83f.png)
关闭 IO 加速下归档表与正常表只读性能对比
▶︎ 开启 IO 加速
8 核 16GB 标准版高可用系列通用型 RDS MySQL 实例的只读性能测试结果如下:
默认配置下,归档数据 QPS 性能可达 ESSD PL1 数据 QPS 的 59.7%。
优化配置下,归档数据 QPS 性能可达 ESSD PL1 数据 QPS 的 76.4%。
开启 IO 加速后,归档数据默认配置下的只读性能提升了 15 倍,优化配置下的只读性能提升了 2.5 倍。
![](https://static001.geekbang.org/infoq/9c/9cbe1fab2965f49ba7b93464fabe6e58.png)
开启 IO 加速下归档表与正常表只读性能对比
▶︎ 结果说明
由于 OSS 的延迟远高于 ESSD,因此在低并发下归档数据的只读性能远低于 ESSD。通过关闭线程池(增大线程池大小)、增加并发数,归档数据的只读性能会逐步提高,但此过程需要更多的 CPU 资源(关闭 IO 加速下 256 并发 CPU 使用率达到 55%,开启 IO 加速下 256 并发 CPU 使用率达到满负载)。
由于 OSS 延迟存在差异,实际测试结果可能存在偏差。
归档数据的压力测试需要更多的 CPU 和内存资源,测试过程请关注 CPU 和内存水位。
5. 总结
RDS 数据归档,是 RDS 通用云盘冷存层的核心功能,专为应对不常访问数据的存储而设计。该功能实现了将那些访问频率较低、但又需长期保留的重要数据,从成本相对较高的 ESSD 云盘中无缝迁移至经济高效的对象存储 OSS;并且在归档过程中,完整保留了对归档数据的查询能力,确保用户在必要时仍能便捷地查询所需的历史信息。
RDS 数据归档不仅能够帮助用户显著减轻因海量非活跃数据积累而导致的数据库存储成本压力,更能在不影响数据可用性的前提下,实现存储数据的精细化管理。
评论