GreenPlum 数据存储介绍

0    52    2

Tags:

👉 本文共约9383个字,系统预计阅读时间或需36分钟。

数据存储

分布式数据存储基本原理相对简单,实现比较容易,很多数据库中间件也可以做到基本的分布式数据存储。Greenplum 在这方面不单单做到了基本的分布式数据存储,还提供了很多更高级灵活的特性,譬如多级分区、多态存储。Greenplum 6 进一步增强了这一领域,实现了一致性哈希和复制表,并允许用户根据应用干预数据分布方法。
如下图所示,用户看到的是一个逻辑数据库,每个数据库有系统表(例如 pg_catalog 下面的 pg_class, pg_proc 等)和用户表(下例中为 sales 表和 customers 表)。在物理层面,它有很多个独立的数据库组成。每个数据库都有它自己的一份系统表和用户表。

GreenPlum 数据存储介绍

master 数据库仅仅包含元数据而不保存用户数据。master 上仍然有用户数据表,这些用户数据表都是空表,没有数据。优化器需要使用这些空表进行查询优化和计划生成。segment 数据库上绝大多数系统表(除了少数表,例如统计信息相关表)和 master 上的系统表内容一样,每个 segment 都保存用户数据表的一部分。

在 Greenplum 中,用户数据按照某种策略分散到不同节点的不同 segment 实例中。每个实例都有自己独立的数据目录,以磁盘文件的方式保存用户数据。使用标准的 INSERT SQL 语句可以将数据自动按照用户定义的策略分布到合适的节点,然而 INSERT 性能较低,仅适合插入少量数据。Greenplum 提供了专门的并行化数据加载工具以实现高效数据导入,详情可以参考 gpfdist 和 gpload 的官方文档。此外 Greenplum 还支持并行 COPY,如果数据已经保存在每个 segment 上,这是最快的数据加载方法。下图形象的展示了用户的 sales 表数据被分布到不同的 segment 实例上。

分区表

参考:https://www.xmmup.com/greenplumzhongdefenqubiao.html

存储格式(堆表和AO表)

存储格式介绍

Greenplum(以下简称GP)有2种存储格式,Heap表和AO表(AORO表,AOCO表) 。

  • Heap表:这种存储格式是从PostgreSQL继承而来的,目前是GP默认的表存储格式,只支持行存储。
  • AO表: AO表最初设计是只支持append的 (就是只能insert), 因此全称是Append-Only,在4.3之后进行了优化,目前已经可以update和delete了,全称也改为Append-Optimized。AO支持行存储(AORO)和列存储(AOCO)。

Heap表

Heap表是从PostgreSQL继承而来,使用MVCC来实现一致性。如果你在创建表的时候没有指定任何存储格式,那么GP就会使用Heap表。
Heap表支持分区表,只支持行存,不支持列存和压缩。需要注意的是在处理update和delete的时候,Heap表并没有真正删除数据,而只是依靠version信息屏蔽老的数据,因此如果你的表有大量的update或者delete,表占用的物理空间会不断增大,这个时候需要依靠vacuum来清理老数据。

堆存储是默认存储模型,并且是PostgreSQL为所有数据库表使用的模型。为频繁进行UPDATE、 DELETE以及单个INSERT操作的表和分区使用堆存储。这种存储格式是从PostgreSQL继承而来的,目前是GP默认的表存储格式,

Heap表不支持逻辑增量备份,因此如果要对Heap表做快照,每次都需要导出全量数据。

最佳实践:

  • 如果该表是一张小表,比如数仓中的维度表,或者数据量在百万以下,推荐使用Heap表。
  • 如果该表的使用场景是OLTP的,比如有较多的update和delete,查询多是带索引的点查询等,推荐使用Heap表。

AO表

AO表是GP特有的,设计的目的就是为了数仓中大型的事实表。AO表支持行存和列存,并且也支持对数据进行压缩。
AO表无论是在表的逻辑结构还是物理结构上,都与Heap表有很大的不同。比如上文所述Heap表使用MVCC控制update和delete之后数据的可见性,而AO表则使用一个附加的bitmap表来实现,这个表的的内容就是表示AO表中哪些数据是可见的。
对于有大量update和delete的AO表,同样需要vacuum进行维护,不过在AO表中,vacuum需要对bitmap进行重置并压缩物理文件,因此通常比Heap的vacuum要慢。

Greenplum数据库可以使用追加优化(append-optimized,AO)的存储格式来批量装载和读取数据,并且能提供HEAP表上的性能优势。 追加优化的存储为数据保护、压缩和行/列方向提供了校验和。行式或者列式追加优化的表都可以被压缩。

GreenPlum的AO表是一种附加优化(append-optimized)的表存储模型,它可以提高数据压缩和查询性能。AO表适用于在表的末尾追加数据,而不是频繁更新或删除现有数据。这样可以减少碎片和重写,并提高I/O效率。AO表还支持分区、索引和约束等功能。AO表最初设计是只支持append的(就是只能insert),因此全称是Append-Only,在4.3之后进行了优化,目前已经可以update和delete了,全称也改为Append-Optimized。AO支持行存储(AORO)和列存储(AOCO)。

可以使用CREATE TABLE命令来创建一个AO表,只需在表定义中指定APPENDONLY = TRUE选项即可。例如:

还可以指定其他选项,如压缩类型、块大小等,以优化AO表的性能和存储空间。

AO表可以做更新和删除操作,但是这些操作会导致AO表的可见性映射(visibility map)发生变化,需要额外的处理。这可能会增加一些读取和查询的开销。因此,如果您的表需要频繁更新或删除数据,那么AO表可能不是最佳选择。

您应该在以下情况下使用AO表:

  • 您的表包含大量的数据,可以按照逻辑分区进行组织。
  • 您的表主要用于插入和查询操作,而不是更新和删除操作。
  • 您的表可以从压缩技术中受益,以节省存储空间和提高查询性能。
  • 您的表不需要支持外键约束或唯一约束。

如果您的表符合这些条件,那么AO表可能是一个合适的选择。

GreenPlum中的AO表是一种支持列存储的表,主要面向OLAP场景。AO表有两种类型:AORO表和AOCO表,分别表示行组织和列组织。

堆表和AO表对比

GreenPlum 数据存储介绍

AORO表

AORO就是行存的AO表,同时行存也是AO表的默认存储方式。
AORO支持表级别的压缩,不支持列级别的压缩。

建表语句

重点是with后的appendonly=true,由于AO表默认是行存,因此orientation=row也可以不要,后面的compresstype=zlib, compresslevel=4都是压缩相关选项。

压缩选项

compresstype :压缩格式,开源版本的AORO表只支持zlib。
compresslevel :压缩级别,从1-9,简单说来,级别越低(1最低),压缩比越低,但是压缩与解压消耗的cpu资源就越少。默认压缩级别是1。

最佳实践

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部