了解数据库中常用存储引擎数据结构(3)

news2024/9/20 9:36:06

接上文了解数据库中常用存储引擎数据结构(2)-CSDN博客

目录

CoW BTree

补充:写入时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略;

Lazy BTree(惰性BTree)

Lazy-Adaptive Tree(惰性自适应BTree)

Bw Tree

怎样确保并发情况下这步操作的安全性也就是有两个操作同时要生成delta record怎么办?

并发情况下,生成 Delta Record

树结构修改

页分裂操作

页合并操作


CoW BTree

CoW BTree 也称写时复制 BTree,CoW BTree 采用 Copy-on-Write 技术来保证并发操作时的数据完整性,从而避免使用 Latch。

补充:写入时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略;

其核心思想是:如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变,这过程对其他的调用者都是透明的(transparently);

此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被建立,因此多个调用者只是读取操作时可以共享同一份资源;

当某个页要被修改时,就先复制整个页的内容,然后在复制出来的页上进行修改。

当然,复制产生的新页要替换旧页,此时父节点指向这个页的指针就要变化了;CoW BTree 的做法也非常的粗暴:直接将父节点也复制并修改一份!

接下来再复制并修改父节点的父节点,直到根节点!

CoW BTree 的修改逻辑如上图所示:对于叶子节点的修改会产生一个全新的根节点(即:一个全新的树)!

CoW BTree 在很大程度上具有 Out-of-place update 的特性,因为已经写入的页是不变的,所以 CoW BTree 可以像 LSM Tree 那样,完全不依赖 Latch 实现并发控制!

但是,为了达成这一点,CoW BTree 付出的代价也是非常巨大的:为了修改一个小小的数据,就要重新复制多个页,带来巨大的写放大!

也正是因为上面的问题,因此 CoW BTree 也一直没能成为主流。但是 CoW BTree 的思路却很重要!后续的许多变种都对其进行了借鉴和改良。

Lazy BTree(惰性BTree)

惰性 BTree 相比于上面提到的 CoW BTree 更进一步,为每个页都设置了一个更新缓冲区。

这样,更新的内容就放在了更新缓冲区中。读取时,将原始页中的内容和更新缓冲区进行合并,来返回正确的数据。

可以发现,惰性 BTree 和 LSM Tree 极为相似,甚至可以说,惰性 BTree 中的每一个页就像一个小型的 LSM Tree!

而更新缓冲区就像 MemTable,当更新缓冲区达到一定程度,就压缩到页中,类似于一个小的 Compaction 的过程!

惰性 BTree 同样避免了 Latch 机制,同时没有 CoW BTree 那么大的写放大代价,因此具有良好的性能。

MongoDB 的默认存储引擎 WiredTiger就是使用的这种存储结构!

Lazy-Adaptive Tree(惰性自适应BTree)

惰性 BTree 还有一个分支:Lazy-Adaptive Tree(LA Tree),整体思路和 Lazy BTree 一致,只是将更新缓冲区中的对象变为子树,用来进一步减少写放大。

如下图所示:

Bw Tree

随着新硬件(如SSD存储)技术的发展,其硬件实现原来越有利于 LSM Tree。

因此,BTree 方面自然也会对新硬件做出适应性的改造,如CoW BTree 和 Lazy BTree,都在相当程度上具有和 LSM Tree 类似的特性了。

本小节所介绍的 BwTree 是在这一方向上更进一步的一种 BTree 变种,甚至在很大程度上比 LSM Tree 都更近了一步!

BwTree 整体分为三层,从上而下分别是:

  • BwTree 索引层
    • 对于最上层的 BwTree 索引层,可以理解为一个逻辑上的类 BTree 结构,对外提供操作这个索引结构的 API,但其实现是完全无 Latch 的。
  • 缓冲层
    • 对于缓冲层,他将索引层和存储层连接起来,通过一个映射表 Mapping Table,记录逻辑页号到物理指针的映射,来实现了无锁追加的特性。
  • 存储层
    • 最底层的 Flash Layer 使用了 Log Structure Store 来与固态硬盘交互,管理物理数据结构。

Log Structure Store:利用 Append,即日志追加形式来实现的文件系统;其更符合 SSD 特性。原理类似于 LSM Tree。

来看下面的例子。

怎样确保并发情况下这步操作的安全性也就是有两个操作同时要生成delta record怎么办?

和 Lazy BTree 类似,BwTree 对每个节点的修改也是不直接修改页,而是生成一个 Delta Record 的结构,记录本次修改的情况,如果再有修改就再生成一个。因此,许多个 Delta Record 和页一起,组成了一个类似链表的数据结构(Delta 链表)。

在查找时,从新 Delta Record 向旧 Delta Record 至数据页查找,找到符合条件的结果就返回。

但是这里存在两个问题:

  • 如何确保并发情况下,生成 Delta Record 的安全性(两个操作要同时生成 Delta Record)?
  • 发生数据结构的修改,如:分裂、合并节点如何操作?
并发情况下,生成 Delta Record

对于第一个问题,BwTree 通过刚刚所说的映射表 Mapping Table,记录从逻辑页号到 Delta 链表头的指针。

如果要新增 Delta Record 就要修改 Mapping Table 中的 Value。这样,BwTree 将修改 Delta Record 的操作,转变为了修改 Mapping Table 的操作,再通过 CAS 操作实现对 Mapping Table 的修改,从而将整个过程原子化,以实现不依赖 Latch 的并发控制。

因此,调整 Delta 链表的操作就变得简单了:如果要修改一页中某一行的值,首先生成 Delta Record 结构,为其赋值,并让他指向原 Delta 链表头。随后,在 Mapping Table 中通过 CAS 操作将页号映射至这个 Delta Record。这样,整个修改操作就完成了!

如果 Delta 链表过长,则需要将他们固化到页中,操作也大同小异:首先生成一个新的页,将 Delta 链表加上原有 Page 中的所有结果合并到新的页中。随后在 Mapping Table 中通过 CAS 操作将页号映射到这个新页即可!

生成的新页不需要修改原来其父节点指向它的指针吗?实际上,BwTree 中的指针可以是逻辑指针,父节点记录子节点的逻辑页号,就可以找到子节点了!因此,只要不修改页号,父节点就不用改变。所以虽然我们替换了页,但是由于有映射表的存在,逻辑页号并没有变化,所以父节点也不用变化。

树结构修改
页分裂操作

当新增或删减节点时,BwTree 的做法基本上借鉴了 B-Link Tree 的思路:采用了一个指向右兄弟节点的指针,来使分裂过程分为 child split 和 parent update 两个步骤,每个步骤都是原子操作,从而实现了原子化的 SMO 操作。

页 P 分裂为 P 和 Q 的过程;

  • 首先,a步生成页 Q,但这时页 P 仍然是指向原下一个节点 R 的,页 Q 不可达。
  • b步对页 P 增加了一个特殊的 Delta Record,它负责对页 P 和页 Q 两部分的数据进行路由。
  • c步再按照相似的方法调整父节点。
  • 随着页 P 和父节点的压缩操作,会将 Delta Record 链表合并到页中!

 

页合并操作

页合并操作和上面的分裂思路类似,

  • 先通过增加一个 remove delta record 来标记要删除的节点。
  • 再通过对其前置节点增加一个 merge delta 标记修改,最后再修改父节点。

从前面的分析可以看到,BwTree 更像是 B-Link Tree 和 LSM Tree 的结合,从而兼具无 Latch 的特性,又在相当程度上拥有 BTree 一族的读优势!

目前,BwTree 在学术界还有不少的探索和关注,但在工业界还未听说有成功的实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】缓冲区和文件系统

目录 一、缓冲区 1.1 概念 1.2 用户缓冲区和内核缓冲区 二、磁盘的结构 三、文件系统 3.1 初识“块”和inode 3.2 磁盘分区和文件系统 一、缓冲区 1.1 概念 要理解什么是缓冲区&#xff0c;先看这段代码 #include <stdio.h> #include <string.h> #includ…

OpenTelemetry:新一代的开源可观测性标准

OpenTelemetry是由OpenTracing和OpenCensus两个开源项目合并而成&#xff0c;由云原生计算基金会&#xff08;CNCF&#xff09;托管。该项目旨在提供一套标准化的、跨语言的观测性工具&#xff0c;帮助开发人员和运维人员更好地理解和管理分布式系统的性能和行为。通过统一的Me…

html5宠物网站模板源码

文章目录 1.设计来源1.1 主界面1.2 主界面菜单1.3 关于我们界面1.4 宠物照片墙界面1.5 宠物博客界面1.6 宠物服务界面1.7 宠物团队界面1.8 联系我们界面 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 【博主推荐】&a…

微信小程序同城信息共享

前端uniapp 后端thinkphp 热乎的纯手工代码

机械学习—零基础学习日志(如何理解线性代数3)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 行列式 最早行列式&#xff0c;是莱布尼茨用于判断&#xff0c;一个方程有没有解。例如&#xff0c;三元一次方程&#xff0c;如果有解&#xff0c;对应行列式就有值&#xff0c;但是如果无解&#xf…

一篇文章理清Java持久化脉络(关于JDBC、JPA、Hibernate、Spring Data JPA)

Java持久化 一、JDBC、JPA、Spring Data JPA 的定义及关系二、JDBC&#xff08;古老的东西&#xff0c;只需简单知道是啥&#xff09;1.1 JDBC概念1.2 JDBC示例 三、JPA&#xff08;第二代持久化&#xff0c;代表是Hibernate等框架&#xff09;3.1 JPA概念3.2 JPA示例 四、Spri…

GB/T 38082-2019 生物降解塑料购物袋检测

生物降解塑料购物袋是指以生物降解树脂为主要原料制得的&#xff0c;具有提携结构的&#xff0c;在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目&#xff1a; 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…

html+css+js网页设计 大一电商6个页面 带js 有轮播图,增删改查等功能

htmlcssjs网页设计 大一电商6个页面 带js 有轮播图&#xff0c;增删改查等功能 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等…

JTAG标准笔记:IEEE1149.1、IEEE1149.4、IEEE1149.5、IEEE1149.6、 IEEE1500等协议之前的发展和联系

JTAG (Joint Test Action Group) 是一种串行通信协议。对于典型的串行通信&#xff0c;总线较少&#xff0c;线路数通常为1到4条&#xff0c;数据是以位为单位依次传输的。笔记中大部分图片来自JTAG标准介绍UP的视频 IEEE 1149.1&#xff0c;通常称为JTAG&#xff08;Joint Tes…

安防监控/视频汇聚平台EasyCVR如何配置,实现默认获取设备的子码流?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

设计模式22-迭代器模式

设计模式22-迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;动机定义结构定义结构结构图解释注意事项 C代码推导多态属性&#xff08;虚函数&#xff09;实现迭代器1. **返回值问题**2. **对象切割问题**3. **内存管理问题**4. **迭代器生命周期问题**5. **接口…

static、extern,const关键字

1、static关键字 static关键字&#xff1a;延长生命周期&#xff0c;限制作用域 static修饰局部变量&#xff1a;静态局部变量 static修饰全局变量&#xff1a;静态全局变量 static修饰函数&#xff1a;静态函数 2、extern关键字 extern&#xff1a;引用其他文件 .c 中的全局…

对敲期权组合如何操作?

对敲期权组合按照你说的对沖敲出期权应该是一种期权套利行为&#xff0c;在买入的同时卖出一个执行价格不同的期权进行对冲&#xff0c;或者在卖出一张期权合约的时候同时买进一张执行价不动的同类期权进行对中&#xff0c;这样亏报有限&#xff0c;是种套利行为&#xff0c;下…

Java基础之进制转换

1 进制基础 概念&#xff1a; ​ 进制就是进位制&#xff0c;是人们规定的一种进位方法&#xff0c;二进制逢2进1&#xff0c;八进制是逢8进1&#xff0c;十进制逢10进1&#xff0c;十六进制逢16进1。 不同进制形式&#xff1a; 二进制 0b或0B开头&#xff0c;由0和1组成 八…

爬虫配置代理:保护隐私有效地抓取数据

爬虫配置代理的详细指南 在进行网络爬虫时&#xff0c;使用代理可以帮助我们更有效地抓取数据&#xff0c;避免IP被封禁&#xff0c;并提高隐私保护。本文将详细介绍如何在爬虫中配置代理&#xff0c;包括不同的代理类型、如何选择合适的代理以及在Python中实现代理的具体步骤…

中国软件评测中心:2024年最新人工智能大语言模型技术发展研究报告 (附文档)

人工智能作为引领新一轮科技产业革命的战略性技术和新质生产力重要驱动力&#xff0c;正在引发经济、社会、文化等领域的变革和重塑&#xff0c;2023 年以来&#xff0c;以 ChatGPT、GPT-4 为代表的大模型技术的出台&#xff0c;因其强大的内容生成及多轮对话能力&#xff0c;引…

python-A+B again

[题目描述] 小理有一个非常简单的问题给你&#xff0c;给你两个整数 A 和 B&#xff0c;你的任务是计算 AB。输入格式&#xff1a; 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数&#xff0c;然后 2∗T 行&#xff0c;分别表示 A 和 B 两个正整数。注意整数…

调研在深度学习中如何读代码

这里调研了四个up主的内容&#xff0c;对他们讲的内容摘了一下主要的内容。想要看原文的画可以看原篇。 1.如何学习别人的代码&#xff08;代码量较大时&#xff09;_怎么学习别人的代码-CSDN博客 想要掌握的好&#xff0c;光阅读是不够的&#xff0c;一定要动手写、训练模型…

k8s 部署RuoYi-Vue-Plus之minio搭建

1.直接部署一个pod 需要挂载存储款, 可参考 之前文章设置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 创建部署文件 minio-deploy.yaml apiVersion: v1 kind: PersistentVolume metadata:name: minio-pvnamespace: ruoyi #使用ns ruoyi s…

MyCAT读写分离实现

1. 添加一个新的虚拟主机&#xff0c;设置ip为10.1.1.60,主机名为 mycat.yuanyu.zhangmin.关闭防火墙 SELinux NetworkManager 2. 上传jdk和mycat安装包 3. 解压并且添加到指定的位置 4. 查看并且配置jdk环境 、5. 测试启动myca就可以了 6. 找到server.xml和schema.xml 7. 配…