GaussDB Ustore存储引擎解读
目录
一、数据库存储引擎
二、GaussDB Ustore存储引擎
总结
本文将介绍GaussDB中的Ustore存储引擎,包括Ustore的设计背景、特点介绍和适用业务场景等。
一、数据库存储引擎
数据库的存储引擎负责在内存和磁盘上存储、检索和管理数据,确保每个节点的数据能够长久保存。
存储引擎主要分为行存储(Row-Store)和列存储(Column-Store)两种方式。其中,行存储主要适合于在线交易型的OLTP场景;而列存储主要用于海量静态数据的分析,一般应用于OLAP场景。
二、GaussDB Ustore存储引擎
1. 背景介绍
在Ustore存储引擎出现之前,GaussDB的行存储引擎是Astore。Astore引擎采用了优化的Append Update(追加更新)存储格式设计,其元组(数据)的存储方式如图1所示。
图1 Astore引擎元组(数据)的存储方式
当一个更新操作将 v0 版本元组更新为v1 版本元组后,如果 v0 元组所在页面有空闲空间,则直接在该页面内插入更新后的v1元组,并将v0的元组指针指向v1的元组指针。在此过程中,新版本元组以追加写的方式和被更新的老版本元组混合存放,从而可以减少更新操作的I/O开销。
Astore在处理业务中的插入、删除及Hot-Update(同一页面内的更新)场景时表现出色。然而,对于跨数据页面更新的非Hot-Update场景,新数据需插入到新的页面,并插入新的索引,这不仅会引入额外的I/O操作,还可能导致索引膨胀。
由于新旧版本元组混合存放,需要通过vacuum操作遍历表数据并清理其中的死元组。vacuum操作不仅会占用一定系统资源,且在清理时需要对页面加写锁,读写锁的冲突也会影响用户的读写业务。因此,如果频繁vacuum操作可能会导致性能问题;反之,但如果vacuum操作频率太低,清理元组不及时,又会导致存储空间膨胀。
可以看出,Astore更适用于插入较多而更新较少的业务场景。为了应对频繁更新的业务场景,Ustore存储引擎应运而生。Ustore也是行存储引擎,又名In-place Update(原地更新)存储引擎,特别适用于频繁更新的业务场景。
2.核心目标
Ustore存储引擎的核心目标为:
第一,针对OLTP场景,降低Append-Update存储引擎由于频繁更新导致的数据页空间膨胀,以及由此引起的索引空间膨胀。
第二,去除vacuum依赖,vacumm不再清理ustore的页面,从而减少大量页面I/O操作,节省系统资源,同时避免因vacuum操作引起的性能波动。
3.原理介绍
In-place Update
Ustore存储引擎将新旧版本的数据分开存储,最新版本的数据被存储在数据页上,并且单独开辟一段Undo空间,专门用来统一管理历史版本的旧数据。因此,数据空间不会由于频繁更新而膨胀,旧版本的垃圾数据回收效率也会更高。
图2 Ustore的原地更新操作
Ustore的原地更新操作,如图2所示,当对数据页上的Tuple(元组)进行更新时,系统会将页面上的旧版本Tuple采用追加写的方式写入到Undo空间,这样旧版本数据的读取和写入不会发生冲突,同时在数据页上对Tuple的位置进行原地更新;当需要查询旧版本数据时,系统会检查TD(事务目录),然后从Undo空间中取出旧版本数据。
Ustore的原地更新机制保证了元组RowId稳定,对于在多个事务并发更新同一行的场景,更新时延相对稳定。同时,由于数据的最新版本和历史版本被分离存储,历史版本的批量回收不影响数据页的读写操作,因此,对最新版本的堆表数据空间膨胀友好。
多版本索引
Ustore实现了多版本索引Ubtree,Ubtree叶子节点的页面结构如图3所示。
图3 Ubtree叶子节点的页面结构
Ubtree的叶子结点中,每个索引元组的尾部附加了对应的xmin和xmax(插入和删除的事务ID)。通过检查xmin和xmax,可以判断这个索引元组是否对当前事务可见,这种机制允许进行独立的多版本并发控制(MVCC)。索引可见性检查使得Index Scan和IndexOnly Scan的性能有所提升,还增加了IndexOnly Scan的比例,大大减少回表操作的次数。
空间管理和回收
Ustore不依赖vacuum清理机制,实现了自治式的空间管理机制,堆表和索引的空间分配和回收都在业务运行的时候平稳进行,可以减少由于vacuum异步数据清理带来的大量页面I/O。
当页面上的数据元组被删除时,系统会在页面上记录对应的潜在空闲空间(Potential Free Space),用于估计页面上的空闲空间。在执行DML语句时,如果发现空间不足或者潜在空闲空间达到某个阈值,会尝试对页面进行清理。在执行DQL查询语句时,若检测到页面上潜在空闲空间达到阈值,此时会尝试申请页面的写锁,一旦拿到了页面的写锁,同样会尝试对页面进行清理。
对于那些一直不被访问的页面,也可能存在可清理的元组。清理这些元组的机制如下:
当DML业务通过FSM(Free Space Map,自由空间映射)发现没有足够的可用空间,并且在对堆表的物理文件进行扩展前,会随机选取一些页面进行清理。经过多次尝试后,选取的页面会覆盖整个表的全部页面。
支持NUMA-aware
Ustore采用了NUMA-aware(非统一内存访问感知)的Undo子系统设计,这使得Undo子系统可以在多核平台上实现有效扩展。Undo空间被划分为多个逻辑区域(UndoZone) ,线程会在自己的逻辑区域上进行分配,确保与其他线程完全隔离,从而写入旧数据分配空间时就不会有额外的锁开销。同时,UndoZone可以按照CPU的NUMA核进行划分,每个线程会从当前的NUMA核上的UndoZone进行分配,进一步提升分配效率。
4. Ustore闪回功能介绍
数据备份恢复是保护数据安全的重要手段之一。备份恢复类型一般可以分为物理恢复、逻辑恢复、闪回恢复。
物理恢复是通过物理文件拷贝的方式来备份数据库,通过备份的数据文件和归档日志(Redo Log),可以完全恢复数据库。这种恢复方式一般用于全量备份,能够恢复整个数据库到备份时的状态。
逻辑恢复是通过逻辑导出操作对数据库进行备份,但只能恢复到备份时保存的数据状态,无法恢复到具体某个时间点。由于逻辑恢复需要重建数据库并导入备份数据,因此,需要恢复的时间太长,这种恢复方式通常会用于数据迁移场景。
闪回恢复也是数据库恢复技术的一种,如图4所示。它可以有选择性地高效撤销一个已提交事务的影响,将数据从人为的不正确的操作中恢复出来。闪回恢复具有高效、可靠、精确的特点,通过恢复操作使得数据表可以回溯到某个历史状态,而不需要还原整个数据库。
图4 闪回恢复,快速回溯到历史状态
Ustore提供了闪回查询、闪回表、闪回Drop、闪回Truncate四类闪回功能,对于误操作数据后恢复十分有效。
闪回查询和闪回表
闪回查询:基于MVCC机制,定时捕获并存储快照作为闪回点,并且保留一定期限内的元组旧版本。通过使用保存的闪回点快照,可以检索出指定的旧版本数据,可以查询某个表在过去某个时间点的快照数据。这一特性可以用于查看和逻辑重建因意外删除或更改而受损的数据。
闪回表:基于MVCC机制,通过删除指定时间点和该时间点之后的增量数据,可以将表恢复至特定时间点,实现表级的数据还原。当逻辑损坏仅限于一个或一组表,而非整个数据库时,此特性可以快速恢复表的数据。
闪回Drop/Truncate
闪回Drop和闪回Truncate都是基于回收站(Recycle Bin)机制实现的,这一机制类似于windows系统的回收站,将已删除的表信息保存到回收站中,通过还原回收站中记录的表的物理文件,实现已Drop/Truncate表的恢复。
-
闪回Drop:可以恢复因意外而被删除的表,从回收站中恢复被删除的表及其附属结构,如索引、表约束等。
-
闪回Truncate:可以恢复因误操作或意外而被进行Truncate的表,从回收站中恢复被Truncate的表及索引的物理数据。
采用闪回技术后,恢复已提交的数据库修改前的数据只需要秒级,而且恢复时间和数据库大小无关,可以快速有效的进行数据恢复。
5.核心优势
1)高性能
对插入、更新、删除等不同负载的业务,系统可以做到性能和资源使用表现相对均衡,相比Append Update 引擎性能提升10%。
对于更新操作,由于采用原地更新策略,系统在频繁更新类的业务场景下,拥有更高、更平稳的性能表现。
通过DML操作中执行动态页面清理,系统成功去除对Vacuum依赖,减少由于异步数据清理而产生的大量读写I/O操作,适合事务短、更新频繁、性能要求高的OLTP类业务场景。
2)高效存储
支持原地更新机制,通过将数据页面和回滚段分离存储,具备更高效、平稳的I/O处理能力,TPCC负载平均节约空间15%~20%。
Undo空间采用统一分配,集中回收的方式,复用效率更高,使得存储空间使用更加高效、平稳。
3)细粒度资源控制
通过Undo子系统,实现事务级的空间管控,可基于事务运行时长、单事务使用Undo空间大小以及整体Undo空间限制等方式监管事务运行,防止异常行为出现,方便数据库管理员对数据库系统资源使用进行规范和约束。
总结
GaussDB的Ustore存储引擎在数据频繁更新场景下,依旧保持性能平稳,抖动范围缩减了81%,因此,适应更多业务场景和工作负载;同时,还支持闪回功能,可以恢复因误操作而丢失的数据,这使得Ustore存储引擎更适用于对性能和稳定性有更高要求的金融核心业务场景。
相关文章:

GaussDB Ustore存储引擎解读
目录 一、数据库存储引擎 二、GaussDB Ustore存储引擎 总结 本文将介绍GaussDB中的Ustore存储引擎,包括Ustore的设计背景、特点介绍和适用业务场景等。 一、数据库存储引擎 数据库的存储引擎负责在内存和磁盘上存储、检索和管理数据,确保每个节点的…...

JAVA基础:数组 (习题笔记)
一,编码题 1,数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”&…...

VMWARE ESXI VMFS阵列故障 服务器数据恢复
1:河南用户一台DELL R740 3块2.4T硬盘组的RAID5,早期坏了一个盘没有及时更换,这次又坏了一个,导致整组RAID5处于数据丢失的状态, 2:该服务器装的是VMware ESXI 6.7,用户把3块硬盘寄过来进行数据…...

实时金融股票数据API接口websocket接入方法
一、使用websocket的协议提升传输速度 实时金融股票数据对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票类数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的…...

机器学习与成像技术
机器学习与成像技术 在科技日新月异的今天,机器学习与成像技术的结合正引领着智能视觉领域进入一个全新的发展阶段。这一结合不仅推动了图像识别、目标检测、视频分析等领域的快速发展,还深刻影响着医疗、安防、自动驾驶等多个行业。本文将从机器学习与…...

【系统架构设计师】预测试卷一:综合知识(75道选择题)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5~6题】【第7题】【第8~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17~18题】【第19~20题】【第21~22题】【第23~24题】【第25~26题】【第2…...

【addRepository 在tomcat 8和tomcat 9的支持情况】
项目中涉及将远程下载的 jar包进行解密后加载到 tomcat 容器中。 File jarFile new File(fileUrl); String jarFileUrl jarFile.toURI().toURL().toString(); WebappClassLoader webLoader (WebappClassLoader) classLoader; webLoader.addRepository(jarFileUrl);在升级到 …...

2024网鼎杯web1+re2 wp
这两道题属于比较简单的,顺道说一下,今年的题有点抽象,web不是misc,re不是web的,也有可能时代在进步,现在要求全栈✌了吧 web1 最开始被强网的小浣熊带偏思路了,进来疯狂找sql注入,…...

Python 自动化运维:安全与合规最佳实践
Python 自动化运维:安全与合规最佳实践 目录 🔒 Python安全编程实践与最佳实践🔑 使用Hashlib与Cryptography进行数据加密📊 安全审计与合规检查的重要性🔍 处理敏感数据与隐私保护的方法 1. 🔒 Python安…...

I2S、PDM、PCM、TDM、DSM、DCODEC、VAD、SPDIF
I2S (Inter-IC Sound) 用途: 一种用于芯片之间传输音频数据的串行总线标准。特点: 常用于高质量音频设备,如DAC、ADC和音频编解码器。I2S主要传输PCM格式的音频数据。PDM (Pulse Density Modulation) 用途: 主要用于数字麦克风等设备,以简化硬件接口。特点: 使用脉冲密度来编…...

关于我的编程语言——C/C++——第四篇(深入1)
(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过) 字符类型介绍 char…...

2025年上半年软考高级科目有哪些?附选科指南
新手在准备报考软考时,都会遇到这样的一个问题——科目这么多,我适合考什么?2025上半年软考高级有哪些科目可以报考?要想知道自己适合报什么科目,就需要了解每个科目是什么,考什么等一系列的问题࿰…...

线上查企业该用哪家平台?
在销售领域,经常会遇到电话接通率低的问题。这可能是因为许多电话号码来源于某些商业信息平台,这些号码可能已经被代账公司使用,或者已经被同行业多次联系过,导致接通率不高。为了解决这一问题,可以采用数据过滤服务&a…...

Metrix:实现CI服务器上的DORA指标自动化计算
本文还有配套的精品资源,点击获取 简介:Metrix项目是一个Go语言编写的工具,旨在自动化计算DevOps效能的关键指标——DORA指标,这些指标包括部署频率、前置时间、平均恢复时间和变更失败率。它通过集成到CI服务器如Jenkins或GitH…...

【STL_list 模拟】——打造属于自己的高效链表容器
一、list节点 list是一个双向循环带头的链表,所以链表节点结构如下: template<class T>struct ListNode{T val;ListNode* next;ListNode* prve;ListNode(int x){val x;next prve this;}};二、list迭代器 2.1、list迭代器与vector迭代器区别…...

Java 基础教学:高级特性与实战-集合框架
Java 集合框架提供了一套性能优良、使用方便的接口和类,用于存储和操作群组数据。最常用的集合接口有 List、Set 和 Map。 List List 接口可以存储一系列有序的元素,并且可以包含重复的元素。List 的实现类常用的有 ArrayList 和 LinkedList。 ArrayL…...

单片机原理及应用笔记:C51数组与项目实践
作者介绍 刘滋瑞,男,银川科技学院计算机与人工智能学院,2022级计算机与科学技术8班本科生,单片机原理及应用课程第九组。 指导老师:王兴泽 电子邮箱:602054774qq.com 前言 本篇文章是参考《单片机原理…...

综合项目--博客
一。基础配置: 1.配置主机名,静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器,将博客网站资源…...

ARM64的Mac Node.js前置工作,nvm在线安装
1,通过 终端 ping raw.githubusercontent.com 获取到ip地址185.199.110.133 2,终端输入sudo vi /etc/hosts,打开hosts文件 3,在最后添加 185.199.110.133 raw.githubusercontent.com 保存后退出 3.1,清除环境 完全…...

C++《list的模拟实现》
在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用,接下来在本篇当中我们将试着模拟实现list,在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同,接下来就开始…...

Kubernetes的概述与架构
Kubernetes 的概述 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于…...

Elasticsearch实战应用:构建高效的全文搜索引擎
Elasticsearch实战应用:构建高效的全文搜索引擎 在当今信息爆炸的时代,如何快速、准确地从海量数据中检索出所需信息成为了企业和开发者面临的重要挑战。Elasticsearch作为一款开源的分布式搜索引擎,凭借其强大的全文搜索、实时分析和可扩展…...

达梦数据库和人大金仓数据库对数据库的运行查看情况
1、查看服务器自身资源使用情况 查看内存: free -g 查看整体负载: top 查看磁盘io : iostat -d -x 1 2、查看数据库占用服务器内存情况,登录DM管理工具,达梦数据库使用的内存大致等于 BUFFER MPOOL,对应的 SQL 语句为:…...

Spring Boot解决 406 错误之返回对象缺少Getter/Setter方法引发的问题
目录 前言1. 问题背景2. 问题分析2.1 检查返回对象 3. 解决方案3.1 确保Controller返回Result类型3.2 测试接口响应 4. 原理探讨5. 常见问题排查与优化建议结语 前言 在Spring Boot开发中,接口请求返回数据是系统交互的重要环节,尤其在开发RESTful风格的…...

Automa入门教程详解(Automa工作流概述)
一、什么是工作流? 工作流其实就是一组功能模块,通过彼此的连接来完成一系列的自动化操作流程。你可以把它理解为一个流程图,系统会根据你设置的顺序,从触发块开始,一步一步地执行,直到最后一个模块。这让…...

Python并发编程库:Asyncio的异步编程实战
Python并发编程库:Asyncio的异步编程实战 在现代应用中,并发和高效的I/O处理是影响系统性能的关键因素之一。Python的asyncio库是专为异步编程设计的模块,提供了一种更加高效、易读的并发编程方式,适用于处理大量的I/O密集型任务…...

vueui vxe-form 分享实现表单项的联动禁用,配置式表单方式的用法
官网文档:https:/vxeui.com 实现表单项的联动禁用 在使用 vxe-form 时,有时候需要将表单项直接进行关联操作,比如某一项选择后,另外一项设置为禁用状态不可选择,使用插槽的话神容易实现,本章是分享配置式的…...

供应SW1655集成功率管的高频率、高性能同步整流
概述 SW1655 是一款集成 N 沟道 MOSFET 的高频率、高性能同步整流功率开关。针对离线式反激 变换器的副边同步整流应用,替代肖特基整流二极管,可以显著提高系统效率的同时,实现高集 成度与高功率密度。 SW1655 具有 VCC 自供电功能&#…...

电动机出现故障后怎么处理?
在工业生产中,电动机作为重要的驱动设备,其运行状态直接关系到生产线的效率和稳定性。然而,由于各种因素的影响,电动机在运行过程中可能会出现多种故障。那么,电动机出现故障后怎么处理? 一、电动机在工业…...

练习LabVIEW第四十题
学习目标: 用labvIEW做一个循环闪烁指示灯,要能够在前面板调节周期和占空比。 开始编写: 前面板 一个布尔指示灯一维数组,两个数值输入控件; 程序框图 添加一个while循环,循环内添加初始化数组&…...