分层存储

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_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指定 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