暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB存储引擎最佳实践

基础技术研究 2024-04-11
561

 点击蓝字  关注我们


序言

QingMing

GaussDB(for openGauss,以下简称GaussDB)是一款基于Shared-Nothing架构的企业级分布式关系型数据库。它采用众多拥有独立且互不共享系统资源的逻辑节点构成,通过协调节点的协同工作,实现了大规模数据的并行处理,从而保证了数据处理的高效性和快速响应能力。


作为GaussDB的核心存储引擎,Astore和Ustore各自承载着不同的技术特性和适用场景。Astore作为早期使用的存储引擎,在GaussDB的发展历程中扮演着重要角色。然而,随着技术的不断进步和应用场景的不断扩展,跨数据页更新时的垃圾收集效率问题逐渐凸显。为了解决这一问题,Ustore应运而生。Ustore的推出不仅显著提升了数据库的性能,而且更好地满足了现代企业对数据处理的需求。


存储引擎概述

在事务管理上,GaussDB采取了MVCC(多版本并发控制)结合两阶段锁的方式,这种多版本机制读写操作互不阻塞,提高了数据库的并发性能。然而,它也有一些缺点,比如会造成磁盘空间的膨胀问题,因为每个修改都会生成新的数据版本。此外,由于需要维护多个版本的数据,也可能增加系统的复杂性和维护成本。Astore与Ustore最大区别在于它们在多版本机制实现上处理新版本与历史版本数据方式的不同

GaussDB的Astore存储引擎没有将历史版本数据统一存放,而是和当前元组的版本放在了一起,没有回滚段的概念,但是为了定期清除历史版本数据,Astore存储引擎引入了一个VACUUM线程。一般情况下,除非用户要做性能调优,否则不用特别关注VACUUM线程。Astore并不进行分离存储,即最新版本和历史版本的数据是混合存储在一起的。

Ustore作为GaussDB推出的一款原位更新的存储引擎,其设计理念与Astore截然不同。Ustore存储引擎是将历史版本数据统一存放到undo回滚段里,由undo回收线程统一清理历史版本数据。在Ustore中,最新版本的数据与历史版本的数据是分离存储的,这种设计使得数据的处理和管理更为高效和灵活,Ustore目前对于索引的处理还没有实现分离存储。Ustore已经逐渐发展为GaussDB的默认行存引擎,为数据库的性能和稳定性提供了有力的支持。


Astore介绍

1.使用Astore的优势

(1) Astore没有回滚段,而Ustore有回滚段。对于Ustore来说,回滚段是非常重要的,回滚段损坏会导致数据丢失甚至数据库无法启动的严重问题。且Ustore恢复时同步需要Redo和Undo。由于Astore没有回滚段,旧数据都是记录在原先的文件中,所以当数据库异常crash后,恢复时,不会像Ustore数据库那样进行复杂的恢复。

(2) 由于旧的数据是直接记录在数据文件中,而不是回滚段中,所以不会经常报Snapshot Too Old错误。

(3) 回滚可以很快完成,因为回滚并不删除数据。

(4) WAL日志要简单一些,仅需要记录数据文件的变化,不需要记录回滚段的变化。

(5) 支持回收站(闪回DROP、闪回Truncate)功能。

2.使用Astore注意事项

回滚时很复杂,在事务回滚时必须清理该事务所进行的修改,插入的记录要删除,更新的记录要更新回来,同时回滚的过程也会再次产生大量的Redo日志。

Ustore介绍

1.使用Ustore的优势

(1) 最新版本和历史版本分离存储,相比Astore扫描范围小。去除Astore的HOT chain,非索引列/索引列更新,Heap均可原位更新,ROWID可保持不变。历史版本可批量回收,空间膨胀可控。
(2) B-tree索引增加了事务信息,能够独立进行MVCC。增加了IndexOnlyScan的比例,大大减少回表次数。
(3) 不依赖Vacuum进行旧版本清理。独立的空间回收能力,索引与堆表解耦,可独立清理,IO平稳度更优。
(4) 大并发更新同一行的场景,相对于Astore的ROWID会偏移,Ustore的原位更新机制保证了元组ROWID稳定,先到先得,更新时延相对稳定。
(5) 支持闪回功能。

2.使用Ustore注意事项

Ustore DML在修改数据页面时,也需要同步生成Undo,因此更新操作开销会稍大一些。此外单条Tuple扫描开销由于需要复制(Astore返回指针)也会大一些。

3.特性约束

类别

特性

是否支持

 

事务

Repeatable Read/Serializable

不支持

在事务块中对分区表执行DDL操作

不支持

索引

Gist Index/Gin Index

不支持

可扩展性

Hashbucket

不支持

SQL

Table sampling/物化视图/键值锁

不支持

4.存储规格

(1) 数据表最大列数不能超过1600列。

(2) init_td(TD是指Transaction Directory,事务目录)取值范围[2,128],默认值4,在创建表或索引时可以指定初始的TD大小init_td,单页面支持的最大并发不超过128个。TD是Ustore表独有的用于存储页面事务信息的结构,TD的数量决定该页面支持的最大并发数。

(3) Ustore表(不含toast情况)最大Tuple长度不能超过(8192-MAXALIGN(56+init_td*26+4)),其中MAXALIGN表示8字节对齐。当插入数据长度超过阈值时,用户会收到元组长度过长无法插入的报错。其中init_td对于Tuple长度的影响如下:

①表init_td数量为最小值2时,Tuple长度不能超过8192-MAXALIGN(56+2*26+4)=8080B。

②表init_td数量为默认值4时,Tuple长度不能超过8192-MAXALIGN(56+4*26+4)=8024B。

③表init_td数量为最大值128时,Tuple长度不能超过8192-MAXALIGN(56+128*26+4)=4800B。

(4) 索引最大列数不能超过32列。全局分区索引最大列数不能超过31列。

(5) 索引元组长度不能超过(8192-MAXALIGN(28+3*4+3*10)-MAXALIGN(42))/3,其中MAXALIGN表示8字节对齐。当插入数据长度超过阈值时,用户会收到索引元组长度过长无法插入的报错,其中索引页头为28B,行指针为4B,元组CTID+INFO标记位为10B,页尾为42B。

(6) 回滚段容量最大支持16TB。

5.功能演进

(1) 本特性自V500R002C00版本开始引入。In-place Update(原地更新)行存储引擎,简称Ustore。相比于Append Update(追加更新)行存储引擎,Ustore存储引擎可以提高数据页面内更新的HOT UPDATE的垃圾回收效率,有效降低多次更新元组后存储空间占用的问题。

(2) Ustore存储引擎采用NUMA-aware的Undo子系统设计,使得Undo子系统可以在多核平台上有效扩展;同时采用多版本索引技术,解决索引清理问题,有效提升了存储空间的回收复用效率。

(3) Ustore存储引擎结合Undo空间,可以实现更高效、更全面的闪回查询和回收站机制,能快速回退人为“误操作”,为GaussDB提供了更丰富的企业级功能。Ustore基于Undo回滚段技术、页面并行回放技术、多版本索引技术、xLog无锁落盘技术等实现了高可用高可靠的行存储引擎。

(4) Ustore完全支持ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

6.客户价值

(1) 针对OLTP场景,实现Inplace-update,利用Undo实现新旧版本分离存储;降低类似于AStore存储引擎由于频繁更新或闪回功能开启导致的数据页空间膨胀,以及相应引起的索引空间膨胀。

(2) 通过在DML操作过程中执行动态页面清理,去除VACUUM依赖,减少由于异步数据清理产生的大量读写IO。通过Undo子系统,实现事务级的空间管控,旧版本集中回收。

7.关键特性

(1) In-place Update存储模式:Ustore存储引擎将最新版本的“有效数据”和历史版本的“垃圾数据”分离存储。将最新版本的“有效数据”存储在数据页面上,并单独开辟一段Undo空间,用于统一管理历史版本的“垃圾数据”,因此数据空间不会由于频繁更新而膨胀,“垃圾数据”集中回收效率更高。
(2) 回滚段设计:回滚段简称Undo,负责历史记录的插入、查询等以及Undo空间的分配与释放,北向对接Ustore,南向对接Buffer Pool。基于历史版本直接进行回收,实现了自治式的空间管理机制,减少了I/O时的性能抖动。同时实现了多个后台线程的并发访问,降低并发业务冲突竞争,从而提高性能。
(3) 基于页面的并行回放技术:Ustore利用多线程技术加速日志回放,Startup线程从磁盘中读取xLog日志,把组装好的xLog记录通过Dispatcher线程分配给多个回放线程进行回放。Dispatcher线程基于页面号进行xLog记录的分配,分配更加均匀,各个回放线程并行执行回放,提高了回放的速度。
(4) 闪回:数据库恢复技术的一环,能够使得DBA有选择性地高效撤销一个已提交事务的影响,将数据从人为的不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,通过闪回Drop和闪回Truncate恢复已提交的数据库Drop/Truncate的数据,只需要秒级,而且恢复时间和数据库大小无关。Ustore支持闪回表、闪回查询、闪回TRUNCATE、闪回DROP,而且适用于分区表。
(5) UBtree:与原有的Btree索引相比,索引页面增加了事务信息,使得UBtree索引具备MVCC能力以及独立过期旧版本回收能力。In-place Update引擎支持UBtree索引,UBtree也是In-place Update引擎的默认索引类型。支持并行创建索引、索引空间管理算法优化,索引空间进一步压缩。

8.特性约束

Ustore设计几乎能够覆盖SQL和未来特性集;支持大多数的SQL标准,也支持常见的数据库特性。下面介绍Ustore的各种约束。Ustore不支持以下特性:

(1) 不支持可重复读和串行化隔离级别。

(2) 对于支持row movement的分区表,不支持并发更新或删除同一行操作。

(3) 不支持的DDL功能:在线vacuum full/cluster、在线alter table(除新增字段、重命名等无需全量重写数据的操作外)、table sampling。

(4) 不支持hash索引、GiST索引、SP-GiST索引、BRIN索引。

(5) 不支持压缩。

(6) 不支持批量访存接口。不支持rowid语义。

(7) 不支持创建、使用物化视图。

(8) 不支持设置透明数据加密。

(9) 不支持单事务块或语句中既包含Astore表又包含Ustore表。

(10) 数据表与回滚段要同为页式或者段页式。

(11) 数据表与回滚段采用段页式存储方式时,不支持创建PCR索引。

(12) 数据表与回滚段采用段页式存储方式时,不支持基于冷热分离的行存压缩特性。

(13) 数据表与回滚段采用段页式存储方式时,不支持DCF模式部署。

存储引擎对比

维度

Ustore

Astore

ACID

支持原子性、一致性、隔离性(读已提交,不支持可重复和串行化隔离级别)、持久性

支持原子性、一致性、隔离性、持久性

闪回

undo功能,更高效、更全面的闪回查询和回收站机制,能快速回退人为“误操作”

不友好

空间膨胀

页面原地更新,提高数据页面内更新的HOT UPDATE的垃圾回收效率,有效降低多次更新元组后存储空间占用的问题

页面追加更新,导致的数据页空间、索引空间膨胀

性能抖动

不需要VACUUM,压测时性能抖动2.5%

需要VACUUM,压测时性能抖动13.8%

索引

默认Ubtree,索引页面增加了事务信息,使得UBtree索引具备MVCC能力以及独立过期旧版本回收能力;支持并行创建索引、索引空间管理算法优化,索引空间进一步压缩;

Btree

大事务回滚

undo功能、恢复时同步需要Redo和Undo,效率稍低

没有undo,旧数据都是记录在原先的文件中,当数据库异常crash后,恢复效率高

约束

不支持hash索引、GiST索引、SP-GiST索引、BRIN索引。

不支持压缩。

不支持批量访存接口。不支持rowid语义。

不支持创建、使用物化视图。

不支持设置透明数据加密。



存储引擎最佳实践

鉴于以上存储引擎的差异对比,已经上线的业务系统建议继续使用Astore,即将上线的业务系统,集中式部署建议用Ustore,分布式继续沿用Astore,待分布式Ustore在其他银行金融业务系统打磨成熟后,再平滑切换至Ustore引擎。对闪回有强诉求的业务系统、空间膨胀、性能抖动要求高的系统,建议使用Ustore存储引擎。



参考资料

[1]GaussDB官方网站https://www.huaweicloud.com/product/gaussdb.html
[2]《云数据库GaussDB 2.23.01.200分布式开发指南.pdf》

文章转载自基础技术研究,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论