

云数据库RDS「数据归档功能」现已全网公测(2024年4月24日-2024年6月24日),公测期间免费使用。欢迎点击文末「阅读原文」直达体验~

在RDS的使用过程中,存在一种典型场景:存放重要业务历史数据的表在过了特定时间点后,其内容基本不会被修改,仅偶尔被查询。这类历史数据表因存放重要业务数据而不能被删除,但随着时间推移,数据量持续累积,加上ESSD成本相对较高,使得对应的数据库存储成本也会随时间增加。如果能将这种不常访问的数据存放到成本较低的OSS中,那便能够为客户降低较多成本,阿里云瑶池旗下的云数据库RDS「数据归档功能」应运而生。

要实现数据归档功能,在技术层面,主要解决两个问题:
这个问题保证数据归档的功能可用性,让数据库引擎具备使用OSS的能力,能将数据文件存放到OSS中并且不影响正常访问。这一部分又分为引擎内部实现和引擎外部实现两种方式。引擎内部实现,通过让RDS引擎内核能自行访问OSS,并在内核中进行在线数据到归档数据的转换,从而实现使用对象存储OSS;引擎外部实现是借助外部文件系统,为对象存储OSS提供POSIX兼容,让RDS引擎可以像使用本地目录一样使用对象存储OSS。
这个问题保证归档表的数据一致性,让归档表的数据能够与在线表数据一起进行备份与恢复。

2.1 引擎内部实现
云数据库RDS MySQL版对OSS的使用主要通过引擎内部实现,即在内核中直接使用对象存储OSS,内核通过参数获取所需的OSS信息,在引擎内部访问和使用对象存储OSS。下图为RDS MySQL版数据归档的数据流图:

RDS MySQL数据归档数据流图
当用户开启数据归档功能,执行对应ALTER TABLE归档语句后,MySQL内核会对用户指定的归档数据表执行以下操作,将用户ALTER TABLE归档语句中对应的正常表上传到OSS上,转变成归档表,用户可通过SELECT语句访问归档表中内容:
3. 在ESSD数据盘上保留头文件,以便于访问。
ALTER TABLE归档语句示例(RDS MySQL版)
-- 归档ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"Y"}';-- 取回ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"N"}';
2.2 引擎外部实现

RDS PostgreSQL版数据归档数据流图
当用户开启数据归档功能,在RDS PostgreSQL版实例中,除了数据目录外,会自动增加一个归档目录/cold-data,并增加该目录对应的表空间rds_oss,用户可通过ALTER TABLE归档语句将对应的表转移到rds_oss表空间中。
处于rds_oss表空间中的数据会借助Grail文件系统上传到OSS对象存储上,不占用ESSD数据盘空间。rds_oss表空间中的所有表均为归档表,用户可以用正常的查询语句查询归档表中的数据。
-- 归档alter table tableName set tablespace rds_oss-- 取回alter table tableName set tablespace pg_default;

RDS SQL Server版数据归档数据流图
2.3 归档表备份
RDS数据归档功能,除了需要保证功能的可用性之外, 还需要从数据层面保证数据的一致性。这就需要对归档表的数据进行一致性备份和恢复。RDS归档表数据的备份与恢复,是通过Grail文件系统的快照和快照克隆来实现的。
Grail文件系统依托阿里云EBS、OSS作为底层存储,针对云数据库服务的SLA目标、数据格式和流量特征,提供数据库引擎友好的资源管理、数据压缩、传输缓存、校验等存储层解决方案。
每个Grail文件系统都是由数据与元数据组成。其中,数据指的是文件系统中的每个文件经过切片后存储在源端对象存储中的所有对象;而元数据记录了文件系统中每个文件对应的数据组织格式以及各数据块在OSS的存储路径。从Grail的文件系统组成可以看出,在OSS上数据可用的前提下,只要有一份元数据,就可以还原出文件系统中的任意文件。在RDS数据归档场景下创建一个Grail快照的流程大致如下图所示:

RDS 归档表创建一个Grail快照的流程
1. 业务请求创建快照。
2. GRAIL SNAPSHOT SERVER下发[创建快照]请求,锁定RDS的DDL,并从RDS MySQL版实例中获取OSS元数据。
3. 针对RDS MySQL版实例,GRAIL SNAPSHOT SERVER将获取到的OSS元数据进行格式转换;针对RDS PostgreSQL版实例,无需进行格式转换。
4. 初次备份时,全量拷贝OSS中的数据,并将元数据dump到OSS中,生成snapshot v0;后续备份时,会根据元数据,拷贝OSS中增量的数据,同时dump元数据,生成snapshot v1、v2、v3等。
5. GRAIL SNAPSHOT SERVER切换数据路径,后续新写入的数据将会写入到新的version路径下,并解锁RDS的DDL。

● 开启/关闭数据归档
通过控制台:新创建RDS实例时,在创建页面配置栏开启或关闭数据归档功能;对于已购的符合数据归档功能使用条件的实例,在实例基本信息页,在通用云盘开关设置里,选择开启或关闭数据归档功能。
通过OpenAPI:针对符合数据归档功能使用条件的实例,可通过调用ModifyDBInstanceSpec,传入ColdDataEnabled=true/false,开启或关闭数据归档功能。
● 查询归档数据
用户可通过控制台查询RDS通用云盘的归档数据:在实例的冷存管理页面,便可看到当前实例的归档数据表。
RDS MySQL版:通过DDL进行归档与取回,如下:
-- 归档ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"Y"}';-- 取回ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"N"}';
RDS PostgreSQL版:通过DDL进行归档与取回,如下:
-- 归档alter table tableName set tablespace rds_oss-- 取回alter table tableName set tablespace pg_default;
RDS SQL Server版:登录控制台,在实例的数据库管理页面,进行将数据库转冷存数据库的操作。

此处以RDS MySQL版为例测试冷数据归档前后的只读性能。
测试准备
产品类型:RDS MySQL版
测试方法:向同一实例执行只读操作,对比冷数据归档前后性能。
测试数据量:285 G(10 tables * 120000000 rows)
测试工具:sysbench
4.1 测试方法
1. 准备数据:执行以下命令,在系统中准备好285 GB数据量(10张数据表,每张表 12000万行)。
sysbench oltp_read_only --tables=10 --table_size=120000000 --rand-type=special --rand-spec-pct=15 --time=300 --mysql-host=$DB_HOST --mysql-port=$DB_PORT --mysql-user=$DB_USER --mysql-password=$DB_PASS --mysql-db=$DB_NAME --threads=$THREAD_COUNT prepare
ATLTER TABLE $table_name ENGINE_ATTRIBUTE='{"OSS":"Y"}';
3. 测试只读性能:执行以下命令测试实例的读性能。
sysbench oltp_read_only --tables=10 --table_size=120000000 --rand-type=special --rand-spec-pct=15 --time=300 --mysql-host=$DB_HOST --mysql-port=$DB_PORT --mysql-user=$DB_USER --mysql-password=$DB_PASS --mysql-db=$DB_NAME --threads=$THREAD_COUNT run
▶︎ 说明

4.2 测试结果
本处呈现关闭IO加速和开启IO加速两种场景,默认配置和优化配置下,RDS MySQL版实例数据归档前后只读性能测试结果对比。
▶︎ 关闭IO加速
● 8核16GB标准版高可用系列通用型RDS MySQL实例的只读性能测试结果如下:
默认配置下,归档数据QPS性能可达ESSD PL1 数据QPS的 8.4%。 优化配置下,归档数据QPS性能可达ESSD PL1 数据QPS的 51.2%。

关闭IO加速下归档表与正常表只读性能对比
▶︎ 开启IO加速
● 8核16GB标准版高可用系列通用型RDS MySQL实例的只读性能测试结果如下:
默认配置下,归档数据QPS性能可达ESSD PL1数据QPS的59.7%。 优化配置下,归档数据QPS性能可达ESSD PL1数据QPS的76.4%。 开启 IO 加速后,归档数据默认配置下的只读性能提升了15倍,优化配置下的只读性能提升了2.5倍。

开启IO加速下归档表与正常表只读性能对比
▶︎ 结果说明
1. 由于OSS的延迟远高于ESSD,因此在低并发下归档数据的只读性能远低于ESSD。通过关闭线程池(增大线程池大小)、增加并发数,归档数据的只读性能会逐步提高,但此过程需要更多的CPU资源(关闭IO加速下256并发CPU使用率达到 55%,开启IO加速下256并发CPU使用率达到满负载)。
2. 由于OSS延迟存在差异,实际测试结果可能存在偏差。
/ END /








