分层存储
ProtonBase 通过配置可以实现不同存储介质的分层存储,以满足业务的成本和性能需求,内置了热存和冷存两种存储类型。基于 Tablespace 功能支持将表或者索引划分到不同的存储位置,当业务对数据要求更高的读写性能和实时性,应该使用热存,当需要更低的存储成本,且性能不敏感时可以使用冷存。
Tablespace 是一个逻辑存储区域,用于指定数据实际存储的物理位置。在 ProtonBase 中,表、索引或整个数据库都可以绑定到特定的 Tablespace,一旦创建好 Tablespace 后,用户可以在创建 Database,创建或者修改表、索引时,指定对应的 Tablespace。Tablespace 可以设置不同的 Location。ProtonBase 当前支持两种不同的 Location,分别时 /hot 和 /cold,/hot 为默认 Location,表示热存,底层采用 SSD 技术,用于存放高频访问的热点数据,/cold 为冷存,底层采用 HDD 技术,用于存储低频访问数据。
管理 Tablespace
创建 Tablespace,绑定分层存储。
CREATE TABLESPACE tablespace_name
[ OWNER { new_onwer | CURRETN_ROLE | CURRENT_USER | SESSION_USER }]
LOCATION 'location';
- location: /hot 表示存储,/cold 表示冷存。
例子
-- 创建分层 Tablespace
CREATE TABLESPACE space_hot LOCATION '/hot';
CREATE TABLESPACE space_cold LOCATION '/cold';
注意:创建 Tablespace 的用户必须具备 ProtonBase 超级用户权限。
删除 Tablespace
DROP TABLESPACE [ IF EXISTS ] name;
DROP TABLESPACE space_cold;
应用 Tablespace
为表或索引指定 Tablespace
在建表时,可将数据或索引与特定 Tablespace 绑定,分区的 tablespace 会自动继承父表的 tablespace,如果修改需要显式指定 tablespace:
CREATE TABLESPACE space_hot LOCATION '/hot';
CREATE TABLESPACE space_cold LOCATION '/cold';
-- 存放高频访问的表到热存
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT,
created_at TIMESTAMP,
amount NUMERIC
) TABLESPACE space_hot;
-- 存放低频访问的数据到冷存
CREATE TABLE archived_orders (
id SERIAL PRIMARY KEY,
user_id INT,
created_at TIMESTAMP,
amount NUMERIC
) TABLESPACE space_cold;
-- 为索引指定存放 Tablespace
CREATE INDEX idx_order_user_id ON orders (user_id) TABLESPACE space_hot;
迁移已有数据到其他 Tablespace
使用 ALTER TABLE ... SET TABLESPACE
指令将数据迁移。这在进行在线逐步分层存储调整时尤为有用:
ALTER TABLE archived_orders SET TABLESPACE space_cold;
迁移完成后,数据文件会自动从原路径移至新 Tablespace 关联的存储路径。修改表或者索引的 tablespace,需要把数据全部重写一遍,在数据未 compaction 完毕前,存储空间会放大一倍。
为数据库设置默认 Tablespace
用户可以通过设置default_tablespace和temp_tablespaces来分别指定创建表和临时表的默认 Tablespace。
CREATE TABLESPACE space_hot LOCATION '/hot';
CREATE TABLESPACE space_cold LOCATION '/cold';
set default_tablespace = space_hot;
set temp_tablespaces = space_cold;
用户可以在创建 Database 时通过设置default_tablespace指定 tablesapce,如果不显式设置,默认 tablespace 的 location 为 /hot,如果想修改 Database 的默认tablespace,需要重新设置 default_tablespace。
不支持 'ALTER DATABASE'的 tablespace,如果要修改已有数据的 tablespace,需要通过'ALTER TABLE'或者'ALTER INDEX'的方式修改。
分区表的数据分层策略
您可以根据业务需求动态调整存储策略:
-
结合
PARTITION BY
机制,利用分区表将新增热点数据存储在热存,将旧分区迁移至成本更低的冷存。例如:CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT, created_at TIMESTAMP, amount NUMERIC ) PARTITION BY RANGE (created_at); -- 热存分区 CREATE TABLE orders_hot PARTITION OF orders FOR VALUES FROM ('2024-01-01') TO ('2024-12-31') TABLESPACE space_hot; -- 冷存分区 CREATE TABLE orders_cold PARTITION OF orders FOR VALUES FROM ('2023-01-01') TO ('2023-12-31') TABLESPACE space_cold;
有关更多 Tablespace 的命令参考 CREATE TABLESPACE ALTER TABLESPACE DROP TABLESPACE