云数据库RDS「数据归档功能」现已全网公测(2024年4月24日-2024年6月24日),公测期间免费使用。欢迎点击「公测」直达体验~
1. 为何有数据归档
在RDS的使用过程中,存在一种典型场景:存放重要业务历史数据的表在过了特定时间点后,其内容基本不会被修改,仅偶尔被查询。这类历史数据表因存放重要业务数据而不能被删除,但随着时间推移,数据量持续累积,加上ESSD成本相对较高,使得对应的数据库存储成本也会随时间增加。如果能将这种不常访问的数据存放到成本较低的OSS中,那便能够为客户降低较多成本,阿里云瑶池旗下的云数据库RDS「数据归档功能」应运而生。
阿里云RDS数据归档功能,作为阿里云RDS通用云盘三层存储架构中冷存层的核心功能,让用户可以通过DDL将不常修改的在线表数据从云盘转移到OSS中,转换为归档表。归档表也支持只读,让用户可以访问表数据的同时,节省了云盘存储的成本。此外,OSS存储空间本身并没有容量上限,所以归档表无需担心容量不足的问题。ESSD云盘与OSS对象存储对比如下表所示:
2. 如何实现数据归档
要实现数据归档功能,在技术层面,主要解决两个问题:
🤔 RDS如何使用对象存储OSS?
这个问题保证数据归档的功能可用性,让数据库引擎具备使用OSS的能力,能将数据文件存放到OSS中并且不影响正常访问。这一部分又分为引擎内部实现和引擎外部实现两种方式。引擎内部实现,通过让RDS引擎内核能自行访问OSS,并在内核中进行在线数据到归档数据的转换,从而实现使用对象存储OSS;引擎外部实现是借助外部文件系统,为对象存储OSS提供POSIX兼容,让RDS引擎可以像使用本地目录一样使用对象存储OSS。
🤔 RDS归档表数据如何实现备份与恢复?
这个问题保证归档表的数据一致性,让归档表的数据能够与在线表数据一起进行备份与恢复。
2.1 引擎内部实现
云数据库RDS MySQL版对OSS的使用主要通过引擎内部实现,即在内核中直接使用对象存储OSS,内核通过参数获取所需的OSS信息,在引擎内部访问和使用对象存储OSS。下图为RDS MySQL版数据归档的数据流图:
当用户开启数据归档功能,执行对应ALTER TABLE归档语句后,MySQL内核会对用户指定的归档数据表执行以下操作,将用户ALTER TABLE归档语句中对应的正常表上传到OSS上,转变成归档表,用户可通过SELECT语句访问归档表中内容:
- 将数据表对应的ibd文件,按照4M的block_size切分成文件块。
- 利用OSS的sdk将切分后的文件块上传到OSS中。
- 在ESSD数据盘上保留头文件,以便于访问。
ALTER TABLE归档语句示例(RDS MySQL版)
-- 归档
ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"Y"}';
-- 取回
ALTER TABLE `tableName` ENGINE_ATTRIBUTE='{"OSS":"N"}';
2.2 引擎外部实现
云数据库RDS PostgreSQL版对OSS的使用主要通过引擎外部实现,即通过Grail文件系统来实现对象存储OSS的使用。Grail文件系统通过提供完备的POSIX协议,能够让引擎像访问本地磁盘一样访问对象存储上的数据。下图为RDS PostgreSQL版数据归档的数据流图:
当用户开启数据归档功能,在RDS PostgreSQL版实例中,除了数据目录外,会自动增加一个归档目录/cold-data,并增加该目录对应的表空间rds_oss,用户可通过ALTER TABLE归档语句将对应的表转移到rds_oss表空间中。
处于rds_oss表空间中的数据会借助Grail文件系统上传到OSS对象存储上,不占用ESSD数据盘空间。rds_oss表空间中的所有表均为归档表,用户可以用正常的查询语句查询归档表中的数据。
ALTER TABLE归档语句示例(RDS PostgreSQL版)
-- 归档
alter table tableName set tablespace rds_oss
-- 取回
alter table tableName set tablespace pg_default;
云数据库RDS SQL Server版也主要通过引擎外部实现,但与PostgreSQL版不同,SQL Server版利用SQL Server内核原生的数据库分离附加功能结合OSS对象存储,实现对数据库文件的操作,以及数据文件在云盘和OSS之间的传输。用户可在控制台一键将数据库转冷存归档,数据文件从云盘存储转为OSS存储。当有读写操作需求时,同样在控制台将数据库一键从冷存归档转为在线。整个过程便捷、无损。下图为RDS SQL Server版数据归档的数据流图:
2.3 归档表备份
RDS数据归档功能,除了需要保证功能的可用性之外, 还需要从数据层面保证数据的一致性。这就需要对归档表的数据进行一致性备份和恢复。RDS归档表数据的备份与恢复,是通过Grail文件系统的快照和快照克隆来实现的。
Grail文件系统依托阿里云EBS、OSS作为底层存储,针对云数据库服务的SLA目标、数据格式和流量特征,提供数据库引擎友好的资源管理、数据压缩、传输缓存、校验等存储层解决方案。
每个Grail文件系统都是由数据与元数据组成。其中,数据指的是文件系统中的每个文件经过切片后存储在源端对象存储中的所有对象;而元数据记录了文件系统中每个文件对应的数据组织格式以及各数据块在OSS的存储路径。从Grail的文件系统组成可以看出,在OSS上数据可用的前提下,只要有一份元数据,就可以还原出文件系统中的任意文件。在RDS数据归档场景下创建一个Grail快照的流程大致如下图所示:
- 业务请求创建快照。
- 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三大引擎均已支持。
- 数据归档功能使用条件
说明
因本地保留头文件,RDS MySQL版支持数据归档的数据表需大于6M。
- 开启/关闭数据归档
- 通过控制台:新创建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版:登录控制台,在实例的数据库管理页面,进行将数据库转冷存数据库的操作。
4. 数据归档测试
此处以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
2. 归档数据:使用以下SQL,将ESSD云盘上的数据转存至对象存储OSS上。
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
▶︎ 说明
RDS MySQL版归档功能的默认参数适用于冷数据的低频访问,针对sysbench测试模型,修改部分OSS参数可以获得性能的提升(调整参数后会有更大的CPU消耗);同时,通用云盘的IO加速功能能助力数据库的性能提升。因此,在测试过程中,我们会分别进行IO加速功能的开启和关闭、OSS参数的调整等,从而多维度测试性能情况。
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加速下归档表与正常表只读性能对比
▶︎ 结果说明
- 由于OSS的延迟远高于ESSD,因此在低并发下归档数据的只读性能远低于ESSD。通过关闭线程池(增大线程池大小)、增加并发数,归档数据的只读性能会逐步提高,但此过程需要更多的CPU资源(关闭IO加速下256并发CPU使用率达到 55%,开启IO加速下256并发CPU使用率达到满负载)。
- 由于OSS延迟存在差异,实际测试结果可能存在偏差。
- 归档数据的压力测试需要更多的CPU和内存资源,测试过程请关注CPU和内存水位。
5. 总结
RDS数据归档,是RDS通用云盘冷存层的核心功能,专为应对不常访问数据的存储而设计。该功能实现了将那些访问频率较低、但又需长期保留的重要数据,从成本相对较高的ESSD云盘中无缝迁移至经济高效的对象存储OSS;并且在归档过程中,完整保留了对归档数据的查询能力,确保用户在必要时仍能便捷地查询所需的历史信息。
RDS数据归档不仅能够帮助用户显著减轻因海量非活跃数据积累而导致的数据库存储成本压力,更能在不影响数据可用性的前提下,实现存储数据的精细化管理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。