分层存储
ProtonBase 通过配置可以实现不同存储介质的分层存储,以满足业务的成本和性能需求,内置了热存和冷存两种存储类型。基于 Tablespace 功能支持将表或者索引划分到不同的存储位置:
- 当业务对数据要求更高的读写性能和实时性时,应该使用热存
- 当需要更低的存储成本,且性能不敏感时可以使用冷存
Tablespace 简介
Tablespace 是一个逻辑存储区域,用于指定数据实际存储的物理位置。在 ProtonBase 中,表、索引或整个数据库都可以绑定到特定的 Tablespace。
一旦创建好 Tablespace 后,用户可以在创建 Database,创建或者修改表、索引时,指定对应的 Tablespace。Tablespace 可以设置不同的 Location。
ProtonBase 当前支持两种不同的 Location:
- /hot:默认 Location,表示热存,底层采用 SSD 技术,用于存放高频访问的热点数据
- /cold:冷存,底层采用 HDD 技术,用于存储低频访问数据
冷存与缓存绑定建议:当在 WareBase 中使用冷存时,建议为冷存 WareBase 绑定缓存来提升数据访问性能。
管理 Tablespace
创建 Tablespace
使用 CREATE 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 命令删除 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 指定 tablespace,如果不显式设置,默认 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 的命令参考: