存储引擎与存储方案
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表依赖matrixts
和mars
扩展,所以在建表前首先要在使用该存储引擎的库中创建扩展:
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信息,包括:
- tag_id:设备ID字段
- timekey:时间戳字段
- timebucket:每个行组(Row Group)的时间跨度
Mars表支持列式压缩。压缩不仅可以减少存储量,同时也能降低查询成本。
Mars表支持4种压缩类型:
- rle_type
- zstd
- zlib
- 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类型的索引,这样才能进行正常的数据读写。索引主要有几个作用:
- 索引本身的功能,用于快速的查找。
- 指定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支持两种存储方案:
- Heap+Mars1
- Mars2
2.1 Heap+Mars1
这种存储方案中,将冷热数据分别使用不同存储引擎来存储。
- Heap表来存储热数据,因为热数据可能需要更新,可以充分发挥Heap的更新性能高的优势
- Mars1表来存储历史冷数据,冷数据不会改变,使用Mars1压缩后占用空间更少,聚集查询性能更高
- 需要显式做热转冷操作,转换过程开销不可忽略
适用场景:聚集查询较多,业务有用于做热转冷的低峰期
该方案具体使用方法请参考Heap+Mars1存储方案实践
2.2 Mars2
Mars2方案只使用一种存储引擎。与Heap+Mars1相比,Mars2会自动完成冷数据压缩,免去了热转冷的过程。
适用场景:业务无用于做热转冷的低峰期,且upsert操作比较多