本文介绍如何开启冷数据分层存储功能,以及开启功能后的使用方式。
使用限制
仅PolarDB PostgreSQL版 14.10.21.0及以上版本支持冷数据分层存储功能。
开启冷数据分层存储功能后,无法关闭该功能,只能删除冷数据。如果没有存储数据,开启该功能本身不会产生费用。
开启热备的PolarDB PostgreSQL版集群不支持开启冷数据分层存储功能。
说明如以上场景您需要开启冷数据分层存储功能,请联系我们处理。
开启冷数据分层存储功能后,如果您的PolarDB PostgreSQL版集群已经开启热备,不支持更换主可用区。
说明如以上场景您存在更换主可用区需求,请联系我们处理。
暂不支持的DDL:
暂不支持在OSS表空间中创建数据库:
CREATE DATABASE dbname TABLESPACE OSS;
暂不支持将已有数据库一次性转入OSS表空间:
ALTER DATABASE dbname SET TABLESPACE OSS;
开启方式
单击目标集群ID,进入集群基本信息页。
在左侧导航栏选择配置与管理 > 冷数据分层存储,进入PolarDB冷数据分层存储页面。
单击一键开启,进入数据归档列表页面。
在页面上可以查看实例基本信息和数据归档列表,在数据归档列表一栏,可以分别查看整表归档列表和分区表归档列表。
如果当前还没有存入任何冷数据,数据归档列表会呈现空白状态。
开启之后,数据默认存储在自带的云盘高速存储介质上,需要通过简单的处理才能将数据冷存,即转存入OSS。具体操作步骤请参考数据冷存的几种模式。
数据冷存的几种模式
数据冷存是指将数据表/索引/物化视图转存入OSS,转存后不再占用或者极少量占用数据库云盘存储空间,从而大大降低数据库的存储成本。数据冷存后,所有的增删改查SQL都透明,无需做任何修改。
普通表/索引/物化视图冷存
将已有数据表/索引/物化视图冷存。
ALTER TABLE tblname SET TABLESPACE OSS; ALTER INDEX idxname SET TABLESPACE OSS; ALTER Materialized View mvname SET TABLESPACE OSS;
说明在对表执行
ALTER TABLE tblname SET TABLESPACE OSS
时,默认只会将表本身的数据转存至OSS,表上建立的索引需要单独再执行ALTER INDEX
才能将索引数据也转存至OSS。直接在OSS存储中新建数据表/索引/物化视图。
方式一:CREATE时指定TABLESPACE OSS。
CREATE TABLE tblname (...) TABLESPACE OSS; CREATE TABLE tblname(...) TABLESPACE OSS as SELECT ...; CREATE INDEX idxname ON tblname(columnname) TABLESPACE OSS; CREAE INDEX idxname ON tblename USING GiST(columnname) TABLESPACE OSS; CREATE MATERIALIZED VIEW table_name TABLESPACE OSS AS query [ WITH [ NO ] DATA ];
方式二:设置默认表空间为OSS表空间。
SET default_tablespace = 'oss'; CREATE TABLE tblname (...) ; CREATE INDEX idxname ON tblname(columnname); CREAE INDEX idxname ON tblename USING GiST(columnname); CREATE MATERIALIZED VIEW table_name AS query [ WITH [ NO ] DATA ];
说明这种方式设置默认表空间为OSS后,所有的创建表、索引、物化视图操作都会直接将对象建立在OSS存储上。如果不需要创建冷存对象时,需要将默认表空间进行重置:
RESET default_tablespace;
LOB字段独立冷存
LOB字段是指PolarDB PostgreSQL版中的blob、text、json、jsonb、array类型以及时空类型字段,这些类型往往单个对象较大,占用的存储空间较多,但更新频率不高。为了支持这类场景的降本需求,PolarDB PostgreSQL版冷数据分层存储功能支持将大对象字段单独进行冷存,其余字段的存储保持不变。LOB字段支持SQL一键冷存,具体使用方式如下:
--创建带有大对象字段的表
CREATE TABLE test_large_object(id serial, val text);
--将大对象字段独立冷存
ALTER TABLE test_large_object alter column val set (storage_type='oss');
--写入大对象数据,此时写入的text字段内容存储在OSS上
INSERT INTO test_large_object(val) VALUES((SELECT string_agg(random()::text, ':') FROM generate_series(1, 10000)));
需要提前设置大对象字段的存储为OSS,之后写入的数据才会存入OSS。
分区表冷存
分区表是一种比较常见的冷存对象,在冷存功能使用上有一些特殊的方式。
全部分区表冷存。
方式一:依次将已经存在的分区子表转为冷存。
--prt1为分区表(父表) --prt1_p1为prt1的子表 --prt2_p2为prt1的另一张子表 --对所有的子表执行alter操作 ALTER TABLE prt1_p1 SET TABLESPACE OSS; ALTER TABLE prt1_p2 SET TABLESPACE OSS;
方式二:将分区表主表直接创建在OSS tablespace上。
CREATE TABLE prt1 (a int, b int) PARTITION BY RANGE(a) TABLESPACE OSS; --分区子表默认都继承了父亲tablespace属性,直接将表创建在oss tablespace上 CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
方式三:设置默认表空间为OSS表空间后再创建分区表。
SET default_tablespace = 'oss'; CREATE TABLE prt1 (a int, b int) PARTITION BY RANGE(a); CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
部分分区子表冷存:
当只需要将已过期(低频访问)的分区子表转为冷数据时,可以直接对子表进行更换表空间操作。未过期(高频访问)的分区子表无需任何改变,仍存储在数据库云盘中,这样既不影响分区表的访问性能,又降低了存储成本。
--prt1为分区表(父表) --prt1_p1为prt1的未过期子表 --prt2_p2为prt1的已过期子表 --对已过期子表执行alter操作 ALTER TABLE prt1_p2 SET TABLESPACE OSS;
数据冷热分层
冷数据物化缓存
您可以通过修改polar_smgrcache_size参数来设置冷数据物化缓存的大小。
登录PolarDB控制台。
单击目标集群ID,进入集群基本信息页。
在左侧导航栏选择配置与管理 > 参数配置,找到polar_smgrcache_size参数,单击修改参数。
参考以下示例设置polar_smgrcache_size参数。
设置值
缓存大小
0
0(缓存被关闭)
1
1 GB
2
2 GB
128
128 GB(当前支持的最大值)
单击左上角的提交修改,在弹出的保存改动对话框中,单击确定。修改该参数后,集群会重启。
PolarDB PostgreSQL版在开启冷数据分层存储功能时,默认会在云盘上开辟很小量的物化缓存空间,用于存储元数据及一些IO合并。如果要追求更高的性能,可根据数据量及使用场景在控制台将物化缓存做调整,调整后重启数据库立即生效。
开启并使用了冷数据分层存储功能后,如果将polar_smgrcache_size参数调整为0,则会关闭缓存功能,这可能会导致崩溃恢复变得非常慢,且重启期间无法重新打开该参数。如果出现这种情况,可以联系我们申请重新打开缓存功能,加速崩溃恢复。
开启冷数据物化缓存后,您可以通过如下方式查询缓存使用情况:
-- 创建扩展
CREATE extension polar_monitor;
-- 查询物化缓存基本使用情况
SELECT * FROM polar_smgrcaches;
-- 字段说明:
-- smgrcache:缓存id
-- relfilenode:该缓存对应的表文件
-- relchunknumber:该缓存在表文件中的位置
-- nblocks:该缓存的大小
-- dirty:是否为脏
-- usagecount:使用计数
-- pinning_backends:引用计数
-- 强制将物化缓存刷到OSS中
SELECT polar_flush_smgrcache();
-- 强制淘汰物化缓存
SELECT polar_evict_smgrcache();
冷数据的访问
冷数据增删改查
冷存数据(即已经存储在OSS表空间中的对象)做增删改查的SQL都是透明的,无需进行任何改动。
冷数据恢复
数据转存至OSS时会进行压缩处理,如果要将已经存储在OSS中的数据恢复至云盘存储,需确保云盘上有足够的存储空间,通常要比OSS上的存储空间增大约1.4~4倍。
冷数据清除
删除冷存表/索引/物化视图的SQL也是透明的,无需进行任何改动。
DELETE FROM tblname WHERE ...;
TRUNCATE TABLE tblname;
DROP TABLE tblname;
...