分层存储

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_tablespacetemp_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 的命令参考: