opengauss 《Industrial-Strength OLTP Using Main Memory and Many Cores》

简介: Industrial-Strength OLTP Using Main Memory and Many Cores

该论文详细介绍了opengauss内存库的工程实现,原理请参考《Speedy Transactions in Multicore In-Memory Databases》 https://ata.alibaba-inc.com/articles/216581

ABSTRACT

GaussDB和开源版本的openGauss是TP型数据库,本文展示了其面向main memory和多核的优化,在TaiShan服务器上TPCC有2.5倍的提升。

1. INTRODUCTION

2012年研发OLAP,2015年发布,FusionInsight MPPDB,GaussDB200

2017年研发下一代OLTP,为了满足来自高端用户的5个需求:

  1. 基于share-nothing架构的scale-out能力;
  2. 多核的scale-up能力;
  3. 大内存;
  4. SQL兼容;
  5. 高可用;

策略是基于GaussDB研发一款内存数据库,可以服用GaussDB的SQL兼容和HA能力。

基于PostgreSQL9.2,继承了MPPDB的线程模型。

本文要讨论GaussDB的内存数据库:Memory-Optimized Tables,下文简称为mot。

1.1 System Architecture

GaussDB的整体架构如下图所示,典型的sharenothing系统:单机DB+2PC和全局事务管理。mot做为单机的存储引擎,因此可以完整复用已有的SQL,执行器,分布式事务,HA等。

mot的内存管理:感知NUMA的内管管理,2MB chunk

image.png

1.2 Internal Architecture

mot底层使用无锁的masstree,并发控制协议使用Silo,并对进行了工程上的增强。Silo的论文参考《Speedy Transactions in Multicore In-Memory Databases》

mot在使用masstree时key的长度从29字节增加到了45字节。

mot并发控制协议的选择考虑如下因素:

  1. OCC:Silo和TicToc分3个阶段。并发事务无需等待,仅仅在validation阶段做检测,适当的abort;
  2. Encounter time locking (ETL):乐观读,写者上锁。因此,并发的写者能互相感知并做abort。ETC和相比OCC:一方面能提前检测冲突,减少无用功;另一方面能加速Read-after-writes;
  3. Pessimistic concurrency control (2PL):

结论:OCC更加适合多核(参考《Staring into the abyss: An evaluation of concurrency control with one thousand cores》)。mot选择了Silo的算法,相比于TicToc,Silo算法比较简洁而且大部分负载情况下性能表现差不多。

mot表大小受限于内容大小,当然可以进一步优化来提升表大小,比如:anti-caching和tiering。

2. ADJUSTING THE ENGINE

2.1 Indexing and Storage

引入类似HOT机制,在更新一个行时不用每次都更新索引树,而是跟新这一行的sentinels(类似BTree索引中的IndexTuple)。

image.png

2.1.1 Optimistic inserts优化

在Silo基础上,mot完善了基于OCC的insert优化。

2.1.1.1 Motivation.

OCC的3个阶段中,insert先在本地操作仅仅在commit时检测冲突。因此需要优化:

  1. 并发事务insert相同的key,如何保证唯一性;
  2. insert的事务最终abort;
  3. 同一个事务插入相同的key;
  4. 如何insert多个索引树;

2.1.1.2 Implementation Details.

Silo处理插入key为K流程:

  1. 如果K已经对应一个已提交record,本事务abort;
  2. 否则,生成record为R,状态为ABSENT,索引树中插入K->R;
  3. 如果发现已存在ABSENT的record,则直接复用(先成功插入者为准);

mot对Silo插入流程的改进:

  1. DoubleRow:同一行插入到在不同索引树上,导致部分索引树冲突;
  2. Self Inserted:事务需要识别索引树上哪些ABSENT状态的record是自己插入的;

image.png

2.1.2 Non-unique indexes

在key之后增加后缀:8个字节的row指针。

2.2 Concurrency Control

read after write hazard:occ实现的事务中,如何读取本事务刚刚写入的数据。

mot的优化:实现了一个access-set结构,记录本事务read,update,insert,deleted集合。

维护每个key的状态的状态转换。提交时从access-set上提取出write-set和insert-set。

和Silo不同的是,mot支持了RC隔离级别:不对read-set做校验。

read-set:如果高于RC级别,对read-set做冲突检测;

write-set:对row上锁;

insert-set:对sentinel上锁;

image.png

3. INTEGRATION WITH GAUSSDB

由于GaussDB是基于早起PostgreSQL做的开发,并没有storage engine的概念,因此mot是通过FDW机制来实现。同时,也需要对原有FDW做相应的扩展,比如:在create table/index时在本地触发对mot的DDL操作。

image.png

3.1 Tables and Indexes Created and Used

创建FDW函数:ValidateTableDef

fdwroutine->AddForeignUpdateTargets = MOTAddForeignUpdateTargets;
    fdwroutine->GetForeignRelSize = MOTGetForeignRelSize;
    fdwroutine->GetForeignPaths = MOTGetForeignPaths;
    fdwroutine->GetForeignPlan = MOTGetForeignPlan;
    fdwroutine->PlanForeignModify = MOTPlanForeignModify;
    fdwroutine->ExplainForeignScan = MOTExplainForeignScan;
    fdwroutine->BeginForeignScan = MOTBeginForeignScan;
    fdwroutine->IterateForeignScan = MOTIterateForeignScan;
    fdwroutine->ReScanForeignScan = MOTReScanForeignScan;
    fdwroutine->EndForeignScan = MOTEndForeignScan;
    fdwroutine->AnalyzeForeignTable = MOTAnalyzeForeignTable;
    fdwroutine->AcquireSampleRows = MOTAcquireSampleRowsFunc;
    fdwroutine->ValidateTableDef = MOTValidateTableDef;
    fdwroutine->PartitionTblProcess = NULL;
    fdwroutine->BuildRuntimePredicate = NULL;
    fdwroutine->BeginForeignModify = MOTBeginForeignModify;
    fdwroutine->ExecForeignInsert = MOTExecForeignInsert;
    fdwroutine->ExecForeignUpdate = MOTExecForeignUpdate;
    fdwroutine->ExecForeignDelete = MOTExecForeignDelete;
    fdwroutine->EndForeignModify = MOTEndForeignModify;
    fdwroutine->IsForeignRelUpdatable = MOTIsForeignRelationUpdatable;
    fdwroutine->GetFdwType = MOTGetFdwType;
    fdwroutine->TruncateForeignTable = MOTTruncateForeignTable;
    fdwroutine->VacuumForeignTable = MOTVacuumForeignTable;
    fdwroutine->GetForeignRelationMemSize = MOTGetForeignRelationMemSize;
    fdwroutine->GetForeignMemSize = MOTGetForeignMemSize;
    fdwroutine->GetForeignSessionMemSize = MOTGetForeignSessionMemSize;
    fdwroutine->NotifyForeignConfigChange = MOTNotifyForeignConfigChange;

3.1.1 Index Usage for Planning and Execution

优化器中新增GetForeignPaths。

3.2 Integrating MOT with HA

  1. Logging:复用GaussDB的XLOG来记录WAL日志,GaussDB并行写日志,多个并发backend进程插入WAL slot,在commit时接管WAL并flush;
  2. Checkpointing:提供checkpoint的callback函数;
  3. Recovery:提供recover的callback函数,并行recover,每个线程负责一个datasegment;

3.3 VACUUM and DROP

3.3.1 Deleting Pools

基于epoch的gc,新分配内存区域,将live的数据拷贝到新内存区域,老的内存区域直接回收掉。

3.3.2 GC and Pools Deletion

3.4 JIT for Query Acceleration

GaussDB已经支持了JIT:

  1. 表达式,比如WHERE子句;
  2. Inline函数;

上述两种JIT优化是通用的,但近支持了SQL的部分JIT优化,对加速CPU-bound查询效果显著,比如OLAP。

而mot选择对特定OLTP查询场景进行优化,一旦进入这种场景就是全JIT优化,面向OLTP常用负载:点查、简单的范围查询。

GaussDB的JIT仍然是火山模型的pull-model,mot对特性查询的sql进行了全JIT支持,因此一旦命中就不需要使用火山模型。

mot并不支持复杂agg函数,比如:groupby,count distinct

4. EXPERIMENTAL RESULTS

4.1 Hardware

环境1:

Huawei ARM64:
TaiShan
Kunpeng920-4826和6426
1TB内存
4TB NVMe 3.5GB/s
– 2-sockets of 48 cores, adding to 96 cores. 
– 2-sockets of 64 cores, adding to 128 cores. 
– 4-sockets of 64 cores, adding to 256 cores.

环境2:

Intel x86:
2socket,每个socket上18物理核,2个超线程,总共72核

4.2 Benchmark and Configuration

client端和server之间10Gb网络

所有的测试中,原GaussDB的存储引擎的数据全部能在内存中buffer住,因此测试结果可以忽略IO的影响。

4.3 Results

使用TPCC测试性能和正确性。

image.png

结论:ARM单核性能是x86的0.75倍,和主频成比例,96个ARM核和72个x86核性能相当。

image.png

上图测试扩展性,结论:

  1. mot随着并发增加吞吐增加,大概250并发达到峰值;
  2. 而GaussDB原存储在并发100时达到峰值;

单条query的加速比

构建表且仅有2个整数,其中一个整数做为primary key。

image.png

结论:

  1. insert提升2倍多:原Disk-based的插入需要在page内定位行指针,插入B-Tree也需要定位node,而mot使用masstree;
  2. lookup提升2倍多:原因同上;
  3. delete提升1.5到2倍:mot执行了物理删除,而原Disk-based仅仅是标记,后续vacuum负担会更大;
  4. update提升3.5倍多:masstree查找更快。
  5. 所有测试中ARM平台提升比x86更加明显:ARM的relaxed memory对原Disk-based的2PL并发控制不优化,而MOT OCC在这种优化更明显;

JIT加速

image.png

结论:

  1. stocklevel无提升:包含mot不支持的复杂agg,同时sql中包含pipeline breaker需要物化;
  2. 其他场景均提升30%;
  3. 在并发300个连接时提升更高,OCC允许reader在本地并发执行,减少cache miss;

存在abort时

image.png

OCC中事务执行期间不会被阻塞,但是当有竞争时需要abort。

上图中,12个warehouse,120个并发来模拟高比例的竞争场景。

结论:

  1. 随着并发增加,abort比例上升;
  2. mot整体性能仍然有2倍提升;

Replication对性能的影响

image.png

开启replication时,结论:

  1. mot有7%损耗;
  2. Disk-based有20%损耗;

5. RELATED WORK

  1. Prototypes and Frameworks: DBX提供了对各种并发控制协议算法进行比较的框架:2PL,OCC,Silo。经过测试在华为的机器上Silo性能表现最好;
  2. Microsoft’s Hekaton: SQL的Hekaton是内存引擎,也是在commit是进行alidation,类似Silo。不同点是它使用Bw-tree作为索引,read-lock会阻塞写,虽然能减少abort,但是也降低了并发度,因为需要原子的对共享内存区域进行++来实现原子锁,虽然都是乐观,Silo更加乐观;
  3. PostgreSQL Storage Engine:也是用FDW来实现内存引擎,功能不完善,缺少二级索引,DDL等;
  4. Mot:兼容SQL,工业级内存引擎;

6. CONCLUSION

MOT是为众核和大内存设计的内存引擎,内存管理,并发控制协议,GC都进行了工程上的优化,通过FDW嵌入到GaussDB中,无缝兼容SQL引擎,方便用户使用。

相关文章
|
Web App开发 Rust JavaScript
webRTC 实现人脸识别
webRTC主要是帮我们处理多媒体应用,如音视频通话,屏幕共享都可以实现,主要基于浏览器API调用,其底层浏览器会调用native C++ 等一些库帮我们实现的,而我们在应用层掉API 即可。
627 0
webRTC 实现人脸识别
|
前端开发 UED 容器
CSS基础-背景属性:颜色、图片、重复
【6月更文挑战第9天】本文介绍了CSS背景属性,包括背景颜色、图片、重复的使用和常见问题。通过实例展示了如何设置背景颜色(如使用rgba()注意透明度影响)、背景图片(使用background-size控制缩放)、背景重复(避免默认平铺导致混乱)以及综合使用背景属性创建复杂效果。理解并熟练运用这些属性能提升网页设计的视觉层次和用户体验。建议通过实践不断探索和提升CSS技能。
506 4
|
机器学习/深度学习 C语言
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
414 0
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
|
开发工具 Android开发 数据安全/隐私保护
Cocos Creator Android 平台 Facebook 原生登录(一)
Cocos Creator Android 平台 Facebook 原生登录
1145 0
|
2月前
|
弹性计算 人工智能 运维
阿里云轻量应用服务器抢购活动解析:2核2G38元1年,2核4G9.9元1个月、199元1年
阿里云2026年轻量应用服务器抢购活动,专为个人开发者、学生及初创企业设计,提供2核2G(38元/年)和2核4G(9.9元/月、199元/年)两款高性价比配置,均配备ESSD云盘与200M峰值带宽。活动规则严格,限新用户参与,每日固定时段限量抢购。服务器提供丰富镜像选择,支持快速应用部署。若抢购未果,用户可选择新用户专享价或转向云服务器长效特惠方案,满足不同上云需求。
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的闪回删除
本文介绍了Oracle数据库的闪回删除(Flashback Drop)功能,该功能可从回收站恢复已删除的对象至删除前状态。文章详细讲解了回收站的工作原理及操作步骤,包括检查回收站功能是否开启、删除表、查看回收站内容以及使用闪回删除恢复数据等实战操作。通过具体示例,演示了如何恢复被删除的员工表及其数据,并处理同名表冲突问题。文末还附有视频讲解,帮助读者更直观地理解操作流程。
405 1
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理流程
自然语言处理流程
710 1
|
SQL 数据处理 API
10分钟了解Flink SQL使用
Flink 是一个流处理和批处理统一的大数据框架,专门为高吞吐量和低延迟而设计。开发者可以使用SQL进行流批统一处理,大大简化了数据处理的复杂性。本文将介绍Flink SQL的基本原理、使用方法、流批统一,并通过几个例子进行实践。
10分钟了解Flink SQL使用
|
安全 搜索推荐 大数据
大数据与智慧城市:数据驱动的城市管理
【10月更文挑战第31天】在信息技术飞速发展的今天,大数据成为推动智慧城市转型的核心驱动力。本文探讨了大数据在智慧交通、环保、安防、医疗和政务等领域的应用,揭示了数据驱动的城市管理带来的深刻变革,同时分析了面临的数据安全、隐私保护和数据孤岛等挑战,并展望了大数据在智慧城市建设中的未来前景。
1394 3
|
自然语言处理 算法 语音技术
隐马尔可夫模型(HMM)
隐马尔可夫模型(HMM)
818 0

热门文章

最新文章