存储引擎源码解析 | 磁盘引擎(18)

2023年 11月 23日 52.3k 0

4.3 内存表

MOT(memory-optimized tables,内存表)是事务性、基于行存储的存储引擎,针对众核和大内存服务器进行了优化。MOT是openGauss数据库的一个先进特性,可提供非常高的事务性工作负载性能。MOT完全符合ACID要求,并支持严格的持久性和高可用性。企业用户可以将MOT用于关键任务、性能敏感的在线事务处理应用程序,以实现高性能、高吞吐量、低且可预测的延迟,并提升众核服务器的利用率。

4.3.1 总体架构和代码概述

MOT引擎架构概述如4-43所示。

MOT的关键技术包括下面几个内容。
(1) 面向内存优化的数据结构。
(2) 乐观并发控制。
(3) 无锁索引。
(4) NUMA感知技术,事务性本地内存。
(5) 即时编译(Just-In-Time,JIT)。
总体而言,MOT的目标是建立一个在众核CPU架构中表现出色的OLTP系统,特别是性能可以随核数增加而线性扩展。根据经验实验,Masstree无锁实现和针对Silo(请参阅错误!未找到引用源。)的改进是最佳组合。
索引方面,通过比较各种先进解决方案后选择了Masstree,因为它在点查询、迭代等方面表现出最佳的整体性能。Masstree是Trie和B+树的组合,实现了对缓存、预取和细粒度锁的高效利用。它针对锁冲突严重的情况进行了优化,并在其他先进索引的基础上增加了各种优化。Masstree索引的缺点是内存消耗较大,虽然每行数据消耗的内存大小相同,但是每行每个索引(主索引或次索引)的内存平均高出16个字节:在磁盘表使用的基于锁的B树中为29个字节,而MOT的Masstree为45个字节。
并发控制算法方面,为了从内存架构中获得优势,设计考虑上最大限度地提高OLTP事务处理速度。虽然最近有一些内存多版本并发控制方面的改进,但为了避免迅速的垃圾收集,MOT只维护实际数据。MOT的另一个设计选择是不像HStore那样对数据进行分区,因为在实际的工作负载中事务跨区时性能会急剧下降。尽管已出现一些新的方法通过静态和动态分析来调整并行性,但此类方法会增加时延,并引入额外限制。
内存存储引擎常用的单版本、shared-everything类型的并发控制算法主要分为三类。
(1)乐观并发控制(Optimistic Concurrency Control,OCC),乐观并发控制有三个阶段。
① 读取阶段,从共享内存中读取事务记录,并将所有记录写入本地的私有副本。
② 验证阶段,执行一系列事务检查以确保一致性。
③ 写阶段,验证成功后,提交该事务;验证失败时将中止该事务,不会提交。两个OCC事务同时执行时不会互相等待。
(2) 遭遇时间锁定(encounter time locking,ETL)。在ETL中,读取者是乐观的,但写入者会锁定待访问的数据。因此,来自不同ETL事务的写入者会互相看到,并可据此决定是否中止事务。ETL在两个方面提高了OCC的性能。首先,ETL能尽早发现冲突,而事务处理是有代价的,因为在提交时发现的冲突,需要中止至少一个事务,因此ETL可以在冲突情况下提高事务吞吐量。其次,ETL能够高效地处理写后读(reads-after-writes,RAW)。
(3) 悲观的并发控制(以2PL为例)。在读取或写入时锁定一行,提交后释放锁。这些算法需要一些避免死锁的方法。死锁可以通过周期性的计算等待图(wait-for graph)来检测,也可以通过保持TSO(total store ordering)中的时间顺序或一些其他的规避方案来避免。在2PL算法中,如果一个事务正在写一行数据,其他事务就不能访问或写入该行数据,如果正在读一行数据,则不允许任何事务写该行数据,但可以读取这行数据。
对于大多数工作负载而言,OCC是最快的选择。原因之一是当CPU执行多个交互线程时,一个锁很可能被一个切换出去的线程持有。另外一个原因是悲观的算法涉及死锁检测,这会增大开销,同时读写锁比标准的自旋锁效率低。Silo来自Stephen Tu等人在计算机顶级会议SOSP13上发表的《Speedy Transactions in Multicore In-Memory Databases》,可以在现代众核服务器上实现卓越的性能和可扩展性。MOT最终选择了Silo,因为它比其他现有的方案,如TicToc更简单,同时在大多数工作负载下可保持很高的性能。ETL虽然有时比OCC快,但可能会触发不必要的中止退出。相比之下,OCC只在提交时实际发生冲突时中止退出。
目前,与业界其他领先的内存数据库理系统类似,MOT表的数据容量被限制在最大可用内存范围内。通过操作系统的内存页面交换技术可以扩展内存范围,但在这种情况下性能可能会下降。观察近年来业界出现了几种技术来缓解这个问题,包括数据重组、反缓存和分层等,这也是MOT未来的工作方向之一。
与磁盘引擎(包括共享内存等磁盘数据库的内存优化技术)相比,设计内存引擎的挑战主要是避免磁盘引擎那样基于页面的间接访问方式。
MOT存储引擎代码位于src/gausskernel/storage/mot目录下。目录结构如下。

├── core
├── fdw_adapter
└── jit_exec

MOT文件夹下有三个顶层子目录。
(1) core:包含MOT引擎的核心模块,如并发控制、事务管理、内存管理、存储、检查点、重做、恢复、事务、基础设施组件、统计、实用程序等。
(2) fdw_adapter:包含FDW适配器接口和实现。
(3) jit_exec:包含MOT JIT(Just-In-Time)组件。它有两种实现,一种使用本地LLVM(low level virtual machine),另一种使用TVM(tiny virtual machine),可以在不提供本地LLVM支持的计算机上使用。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论