存储引擎与存储方案

MatrixDB支持多种存储引擎和存储方案供用户选择。

1. 存储引擎

1.1 存储引擎介绍

MatrixDB支持如下存储引擎:

类型 描述
Heap Heap表为传统PostgreSQL数据库提供的存储类型,又称堆表。
该类型的表支持大量并发读写、事务、索引等特性。
Mars1 Mars1表为MatrixDB自研的存储类型。
支持压缩、列存、预聚集,在分析场景中性能极高。
但要求数据按顺序插入,并且暂不支持更新和删除。
Mars2 Mars2表为在Mars1基础上开发的存储引擎。
支持压缩、列存、自动归档,无需手动热转冷。
时序写入性能更好,upsert场景优化最为明显。

1.2 创建表

上面介绍了几种存储引擎的特性,现在介绍一下如何创建各种存储引擎的表:

1.2.1 创建Heap表

Heap表为MatrixDB默认存储引擎,所以在建表时没有特殊指定存储引擎的时候,创建的都是Heap表:

CREATE TABLE disk(
    time timestamp with time zone,
    tag_id int,
    read float,
    write float
)
Distributed by (tag_id);

1.2.2 创建Mars1表

Mars1表依赖matrixtsmars扩展,所以在建表前首先要在使用该存储引擎的库中创建扩展:

CREATE EXTENSION matrixts;
CREATE EXTENSION mars;

建表时使用USING Mars来指定存储引擎:

CREATE TABLE disk_mars(
    time timestamp with time zone,
    tag_id int,
    read float,
    write float
)
USING Mars
WITH (tagkey="tag_id", timekey="time", timebucket="8 hours")
Distributed by (tag_id);

WITH关键字中指定了Mars表的meta信息,包括:

  1. tag_id:设备ID字段
  2. timekey:时间戳字段
  3. timebucket:每个行组(Row Group)的时间跨度

Mars表支持列式压缩。压缩不仅可以减少存储量,同时也能降低查询成本。

Mars表支持4种压缩类型:

  1. rle_type
  2. zstd
  3. zlib
  4. lz4

创建Mars表时,通过compresstype指定列的压缩类型。同时还要通过compresslevel指定压缩级别(0-9),级别越高,压缩率就越高,占用空间更小,但对计算性能的消耗也更大。

如下sql创建的Mars表,为不同的列指定了不同的压缩类型:

CREATE TABLE disk_mars (
    time timestamp with time zone ENCODING (compresstype=rle_type, compresslevel=1),
    tag_id int ENCODING (compresstype=zstd, compresslevel=1),
    read float ENCODING (compresstype=zlib, compresslevel=1),
    write float ENCODING (compresstype=lz4, compresslevel=1)
)
USING Mars
WITH (tagkey="tag_id", timekey="time", timebucket="8 hours")
Distributed by (tag_id);

1.2.3 创建Mars2表

Mars2表依赖matrixts扩展,所以在建表前首先要在使用该存储引擎的库中创建扩展:

CREATE EXTENSION matrixts;

建表时使用USING mars2来指定存储引擎:

CREATE TABLE metrics(
    time timestamp,
    tag_id int,
    sensor float4
)
USING mars2
Distributed by(tag_id);

Mars2表包含如下可选参数:

参数名 默认值 最小值 最大值 描述
compress_threshold 1200 1 8000 同一个组压缩的tuple数上限
compresstype lz4 -- -- 压缩算法,支持:
1. zstd
2. zlib
3. lz4
compresslevel 1 1 -- 压缩级别。值越小压缩越快,但压缩效果越差;值越大压缩越慢,但压缩效果更好。不同的算法有效值范围都不同:
zstd:1-19
zlib:1-9
lz4:1-20

如上参数可以在建表时增加WITH关键字来设置,如:

CREATE TABLE metrics(
    time timestamp,
    tag_id int,
    sensor float4
) using mars2
WITH(compress_threshold=1200, compresstype='lz4', compresslevel=1)
Distributed by(tag_id);

Mars2表在创建后必须额外创建一个mars2_btree类型的索引,这样才能进行正常的数据读写。索引主要有几个作用:

  1. 索引本身的功能,用于快速的查找。
  2. 指定Mars2内部动态排序的排序键。
CREATE INDEX idx_metrics ON metrics USING mars2_btree(tag_id, time);

当设备相同时间点数据分批上报时,Mars2可以对相同时间相同设备的数据进行合并。合并特性需要在创建索引时增加uniquemode=true选项:

CREATE INDEX idx_metrics ON metrics USING mars2_btree(tag_id, time) WITH (uniquemode=true);

2. 存储方案

上面介绍了MatrixDB在时序场景支持的几种存储引擎,下面介绍一下在不同的存储方案下如何搭配使用不同的存储引擎。

目前MatrixDB支持两种存储方案:

  1. Heap+Mars1
  2. Mars2

2.1 Heap+Mars1

这种存储方案中,将冷热数据分别使用不同存储引擎来存储。

  1. Heap表来存储热数据,因为热数据可能需要更新,可以充分发挥Heap的更新性能高的优势
  2. Mars1表来存储历史冷数据,冷数据不会改变,使用Mars1压缩后占用空间更少,聚集查询性能更高
  3. 需要显式做热转冷操作,转换过程开销不可忽略

适用场景:聚集查询较多,业务有用于做热转冷的低峰期

该方案具体使用方法请参考Heap+Mars1存储方案实践

2.2 Mars2

Mars2方案只使用一种存储引擎。与Heap+Mars1相比,Mars2会自动完成冷数据压缩,免去了热转冷的过程。

适用场景:业务无用于做热转冷的低峰期,且upsert操作比较多