摘要:HiEngine与华为GaussDB (for MySQL)集成,将内存数据库引擎的优势带到云端,并与基于磁盘的引擎共存。HiEngine的性能比传统的以存储为中心的解决方案高出7.5倍。
本文分享自华为云社区《SIGMOD’22 HiEngine论文解读》,作者:云数据库创新Lab 。
导读
华为云数据库创新Lab在一作论文《HiEngine: How to Architect a Cloud-Native Memory-Optimized Database Engine》中提出了华为自研的、以内存为中心的云原生内存数据库引擎HiEngine。SIGMOD,即Special Interest Group on Management Of Data数据管理国际会议,会议是是由美国计算机协会(ACM)数据管理专业委员会(SIGMOD组织的、数据库领域的的最顶级国际学术会议。HiEngine是云数据库创新LAB在云原生内存数据库领域取得的关键技术成果之一。
摘要
高性能内存数据库引擎已成为许多系统和应用程序中必不可少的基本构件,然而大多数现有系统是基于本地内存存储设计的,并不能充分发挥云计算环境的优势。现有的云原生数据库系统大多遵循以外存存储为中心的设计。HiEngine的关键特性包括:1) 除了采用存算分离架构外,在计算侧利用云基础设施的可靠性内存服务来实现快速持久性和可靠性;2) 实现跟主内存数据库引擎同等的性能;3) 以及向后兼容现有的云原生数据库系统。
HiEngine与华为GaussDB (for MySQL)集成,将内存数据库引擎的优势带到云端,并与基于磁盘的引擎共存。HiEngine的性能比传统的以存储为中心的解决方案高出7.5倍。
研究背景
1. Memory-centric计算架构
以内存为中心的计算已经成为学术界和工业界的研究热点。持久性内存提供了DRAM级的性能和Flash闪存级的容量,基于持久性内存的池式内存的研究和应用已经逐渐成为探索的新方向。学术界研究原型系统有HydraDB、RAM Cloud、NAM-DB、Hotpot、DDC及Infiniswap,工业界系统如FaRM、SAP HANA、SRSS SCM、WSCs、及DAOS等。
同时,内存数据库的客户将应用程序迁移到云,供应商提供云原生的内存优化的OLTP解决方案成为一种趋势。
2. OLTP数据库生态
现有的云本地数据库系统大多是磁盘驻留数据库,遵循以存储为中心的设计,如Aurora、PolarDB、GaussDB(for 用于MySQL)等。它们有以下特点:基于页面块的IO、,面向页面的布局和缓冲池。此外
特别地,它们拥有内存中数据库所没有的缓冲池,这直接影响了云平台中如何构建引擎和充分利用内存设备的硬件性能。当前,大多数内存数据库都是基于本地部署解决方案设计的,不能直接在云中工作。尽管部分存算分离的内存数据库(如NAM-DB)可以提供云原生特性,但它们在整个网络上的访问延迟很昂贵大。
3. 华为云基础设施
华为云存储基础设施服务具有如下特点:
- 硬件趋势和挑战:1)存算分离架构中引入持久内存,尤其在计算侧配置持久内存能够提供高速的事务日志缓存等功能,但是这与计算节点的Stateless特性相违背。2)基于ARM的多核处理器具有更好的性价比和理想的能耗,但是也带来Cross-NUMA的多核扩展挑战。
- SRSS:作为华为云新一代分布式存储服务,它使用RDMA建立在现代SSD/NVM硬件之上 ,采用日志结构型的追加存储。
- SRSS在云中提供了必要的持久性内存原语。SRSS支持内存语义和计算端持久存储,定制化的mmapMMAP内核驱动程序API支持从本地或远程持久存储层一致性的读取数据,SRSS通过内存映射提供除了打开、/关闭、/追加、/读取等接口外,还提供内存语义操作。数据在计算侧和存储侧三副本存储,采用具有低延迟存储网络。这允许计算节点可以在计算侧本地持久化和存储侧远端持久化,似的存储层之间关键路径上没有往返网络开销。
HiEngine架构
本文提出了一种云原生的内存优化的内存数据库引擎HiEngine来解决这些挑战。HiEngine在架构上呈现的特征包括:
1)将持久化状态引入到计算层,以支持快速持久化和低延迟事务。
2)日志即数据。
3)在计算层SRSS利用持久内存(如Intel Optane内存)在三个计算节点中同步存储副本日志,同时异步持久化到远端存储。
4)HiEngine系统有表现为三层物理结构和三层逻辑结构,其中逻辑的日志层与计算层位于同一物理位置。
1. 以日志为中心的Log-centric MVCC存储引擎概览
HiEngine是围绕“日志就是数据库”的理念构建的,并使用了一些关键技术如无锁索引、MVCC事务模型、tuple-level元组级的内存布局。它使用SRSS实现数据持久化和快速恢复。HiEngine通过rRowmap实现数据访问,rowmap它是HiEngine的核心数据结构,支持MVCC、高效的检查点和并行恢复。
2. Tuple-level内存布局
HiEngine使用MVCC事务模型,这充分挖掘了SRSS的性能和功能特性。在内存布局层面,它采用lock-free的ARTree索引、使用Row Map来映射rowid行ID到具体的数据版本version数据。
Tuple-level内存布局特性包括:
1)一个版本包含许多关键字段,如[tmin, tmax, nextver, loffset…]字段;
2)Index的叶节点是一个rowid行ID;
3)二级索引的键由用户自定义键和当前行IDrowid组成;
4)对版本链采用基于Epoch的空间管理机制和基于Session管控的Non-blocking的垃圾回收策略。
3. 事务模型
目前HiEngine提供快照隔离级别。当事务开始时,它被分配一个读CSN和一个全局唯一的TID,并在提交时将tminTMIN和TMAXtmax字段中的TID替换为CSN。HiEngine提出了两种时间戳授权方法。逻辑时钟的时间戳分配时延为40微秒,而全局时钟在无原子时钟下时延为20微秒。
在分布式数据库中,Global Clock是高性能时间戳授时和性能高扩展的最佳选择。
4. PIA/RowMap
HiEngine以日志的形式组织数据记录,没有“页面”的概念。PIA将版本行记录ID映射到记录地址。
PIA有以下好处:
- 行更新操作不会改变索引的内部结构
- 二级索引的“键”=“用户自定义键+ RID”
- 检查点变得轻量级,因为只需要持久化PIA而不是真实数据
- 恢复只会重新构建PIA,而不是读取元组版本
5. 高可靠高扩展的Redo-Only Logging
HiEngine中,WAL有两个目的:持久化保证和、数据副本实现。WAL被同步持久化到计算侧近端SRSS SCM池 pool中,然后异步的分发到存储端的SRSS PLOG。
SRSS通过PLOG提供了一个仅追加的抽象和段结构。HiEngine在计算端使用分布式日志记录,一旦事务的日志记录持久化到计算端持久化内存中,事务就会被提交。日志被批处理并异步刷新到存储层。
PLOGPLog在物理结构上,按段组织,然后映射到Plog。每个线程维护一个打开的PLOGPLog,段按需动态分配和释放。每个段由PLOG Plog ID和PLOGPlog中的偏移量来标识。
HiEngine采用分布式logging,它采用::
- 追加写和基于mmapMMAP的读
- 更新后的版本包含一条记录的完整内容
- 使用SRSS的追加接口将日志记录写入段/ PLOGPlog
- 数据成功三副本持久化到计算侧持久性内存后提交事务
6. Dataless的检查点和并行恢复
为了加速恢复,HiEngine在后台运行检查点。检查点变得非常轻量化,只需要持久化PIA。
恢复分为加载阶段和重放阶段: 1)一旦PIA设置完成,恢复就完成了;2)之后的访问将根据需要通过mmapMMAP将数据版本带入主存。我们还设计了一个并行恢复算法:
1). 多个重放线程依次扫描日志(每个线程一个)
2). 如果日志记录操作是插入或更新操作,则将相应的PIA条目更新为日志中偏移
3). 只有当PIA条目指向旧的记录版本时,重放线程才会用新的记录地址覆盖PIA条目
同时,HiEngine定期地执行日志合并来做日志垃圾回收。合并线程获取当前最低读LSN的快照,该快照存储在本地作为truncLSN,用于部分合并。完全合并需要删除表的所有版本和记录,以便将数据聚集到新的存储空间中修复loffset。异步当完成日志合并后,HiEngine将异步修复PIA中的loffset。
7. 索引持久化和检查点
在HiEngine中,索引树的修改不会立即持久化 。索引树的检查点类似于日志结构合并树。不过存在读放大。幸的是,读放大是存在的。
索引有以下特点包括:1)1个内存中的主R/W树+持久存储的R/O森林;2)基于AR-Tree的lock-free索引树;3)通过mmapMMAP读取持久存储的索引;4)森林中的树可以是不同种类 (意味着你可以有不同种类的树(例如比如B+ -tTree);5)索引合并:将多棵树合并为一棵。
部署方式
HiEngine提出了两种部署模式:
1. 垂直整合:HiEngine与GaussDB中已有的InnoDB引擎共存(针对MySQL),在CREATE TABLE语句中使用WITH ENGINE=HiEngine参数,查询(已编译或解释)将被路由到相应的存储引擎执行。
2. 横向整合。放在数据库表前面作为一个透明的ACID缓存,部分或全部作为表前ACID缓存。
本文专注于垂直整合的部署方式,HiEngine与华为GaussDB(for MySQL)集成为单个引擎。本文主要研究垂直集成模式。HiEngine与GaussDB中已有的InnoDB引擎共存(针对MySQL)。用户只需要在CREATE TABLE语句中声明引擎类型查询将被路由到相应的存储引擎。
系统评测
本文专注于垂直整合的部署方式,HiEngine与华为GaussDB(for MySQL)集成为单个引擎。
这两个引擎共享相同的SQL层,其中除了HiEngine使用代码生成技术。我们使用Sysbench和标准TPC-C基准来比较HiEngine和其他三种工业系统。所有的评价都是在两种环境下进行的,单服务器和云SRSS。
HiEngine在两个平台上的表现都明显优于DBMS-M。 HiEngine单服务器性能高达6500万tpmC。
编译执行下的端到端性能为> 50%。我们通过设置内存分配策略和工作负载分区来评估面向armARM的优化。在所有情况下,HiEngine存储引擎的性能都比DBMS-M高出60%。通过对ARM平台上的TPC-C模型的分析,跨Socket的远程访问每增加10%,性能下降5%。优化后的RTO性能提高了10倍。
总结
本文提出了HiEngine,这是一个云原生内存优化的内存数据库引擎。它利用现代云基础设施与计算端快速持久性内存,并将主内存数据库引擎的优点带到云端,并与基于磁盘的引擎共存。此外,它提供的性能可与本地内存数据库引擎相媲美。
1. 现代云基础设施一直在快速发展,尤其在现代硬件技术的发展中不断升级。新硬件包括多核处理器特别是基于ARM的平台、大容量主内存和持久性SCM、及RDMA网络等。
2. 现有的云原生数据库引擎大多是以存储为中心的设计,这让新硬件的潜力在云原生内存数据库里在很大程度上得不到开发,同时云给内存数据库引擎带来了一些独特的挑战。
3. HiEngine提出了一个云原生的内存优化的数据库引擎,它的特性包括:1)将存算分离的高性能内存数据库在云上呈现给用户;2)采用华为的高可靠共享云存储服务,支持以日志为中心的存储和计算侧高性能持久性内存;3)优化基于ARM的多核处理器;4)保持以内存为中心的引擎与以存储为中心的引擎之间的向后兼容性、可以部署为单个引擎或另一个引擎前面的ACID缓存;5)与之前的系统相比,提供高达7倍的性能。
4. HiEngine弥合了学术原型系统和云上生产系统之间的鸿沟。
5. HiEngine是华为云下一代云原生分布式内存数据库的关键引擎。
HiEngine:可媲美本地的云原生内存数据库引擎的更多相关文章
- 基于Drone+Gogs流水线-全面认识轻量级云原生CI引擎Drone
1. 介绍 Drone by Harness 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试.构建.发布.每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构 ...
- VMware vSphere 7.0 Update 2 发布 - 数据中心虚拟化和 Kubernetes 云原生应用引擎
2021 年 3 月 9 日,VMware 发布了 vSphere 7 Update 2.它可以通过 VMware Customer Connect 和 vSphere Lifecycle Manag ...
- 云原生流水线 Argo Workflow 的安装、使用以及个人体验
注意:这篇文章并不是一篇入门教程,学习 Argo Workflow 请移步官方文档 Argo Documentation Argo Workflow 是一个云原生工作流引擎,专注于编排并行任务.它的特 ...
- 开放融合 | “引擎级”深度对接!POLARDB与SuperMap联合构建首个云原生时空平台
阿里巴巴新一代自研云数据库POLARDB与超图软件SuperMap GIS实现 “引擎级”深度对接,构建了自治.弹性.高可用的云原生时空数据管理平台联合解决方案,推出了业界首个“云原生数据库+云原生G ...
- 云原生的弹性 AI 训练系列之二:PyTorch 1.9.0 弹性分布式训练的设计与实现
背景 机器学习工作负载与传统的工作负载相比,一个比较显著的特点是对 GPU 的需求旺盛.在之前的文章中介绍过(https://mp.weixin.qq.com/s/Nasm-cXLtJObjLwLQH ...
- CODING —— 云原生时代的研发工具领跑者
本文为 CODING 创始人兼 CEO 张海龙在腾讯云 CIF 工程效能峰会上所做的分享. 文末可前往峰会官网,观看回放并下载 PPT. 大家上午好,很高兴能有机会与大家分享 CODING 最近的一些 ...
- 阿里云弹性容器实例产品 ECI ——云原生时代的基础设施
阿里云弹性容器实例产品 ECI ——云原生时代的基础设施 1. 什么是 ECI 弹性容器实例 ECI (Elastic Container Instance) 是阿里云在云原生时代为用户提供的基础计算 ...
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...
- 深度解读阿里巴巴云原生镜像分发系统 Dragonfly
Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题.随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过 ...
- 《Kubernetes与云原生应用》系列之容器设计模式
http://www.infoq.com/cn/articles/kubernetes-and-cloud-native-app-container-design-pattern <Kubern ...
随机推荐
- JavaS:网页中的显示和隐藏
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- Android listview的item设定高度
在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...
- temp - Linux administration handbook 答案
我开始做第一章后的练习题,发觉不是很容易随意地回答,就像是C++ primer之后的练习题的感觉. 自己有这么多不会的,让我感觉很不爽啊- -! 先不要要求自己一下子都明了,一口吃不成胖子,先找一份工 ...
- 在ubuntu14.04 64位中使用jd-gui
使用时提示缺少库,输入命令sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6 参考:http ...
- 数据库版本管理工具Flyway(4.0.3)---介绍(译文)
Flyway Evolve your Database Schema easily and reliably across all your instances 简单的.可靠的升级(发展)你的数据库模 ...
- iOS GCD中级篇 - dispatch_group
1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2 ...
- mysql进阶(十七)Cannot Connect to Database Server
Cannot Connect to Database Server 缘由 由于不同的项目中使用的数据库用户名与密码出现了不一致的情况,在其中之前较早一个项目执行过程中出现"The user ...
- link标签链接CSS和@import加载的区别
link:基本语法 <link rel="stylesheet" href="路径"> @import 基本语法 <style> @im ...
- 修改phpMYadmin 链接其他数据库地址的方法
找到phpmyadmin的文件 修改 config.inc.php 文件 框红的地方修改成你需要链接的数据库信息 重启环境,再次访问 phpmyadmin 地址即可
- Map 综述(三):彻头彻尾理解 ConcurrentHashMap
https://blog.csdn.net/justloveyou_/article/details/72783008