CMU 15445 学习笔记—3 Storage Manager

发表于 2年以前  | 总阅读数:781 次

存储介质

一个数据库系统大致由以下几个不同的部分组成:

  • query plan(执行计划)
  • operator execution(执行器)
  • access method(访问方法)
  • buffer pool(缓冲池)
  • disk manager(磁盘管理)

以及其他的的一些组成部分,例如并发控制、分布式等。 这个课程系列将会自底向上逐一介绍。

首先来看看存储管理,通常来说,不同的存储介质,在存储容量和速度上存在较大的差异,容量越大的介质速度越慢,反之容量越小的介质,速度越快。

以上图为例,cpu 寄存器和高速缓存(L1、L2、L3),以及内存是常见的易失性存储,容量小速度快,但是掉电之后无法恢复,不能持久化保存数据。

而磁盘例如 SSD 或者 HDD,容量更大,但是访问速度慢,能够持久化保存数据。

下面对这几种存储介质的访问速度做一个简单的量化(同比放大),可以看到 L1 缓存大概是秒级别的,而机械硬盘甚至长度16 周,容量越大访问速度越慢。

对于磁盘来说,顺序访问也比随机访问更快,因为磁盘的主要时间消耗在于寻道。

数据库系统对于磁盘管理的设计目标,主要是以下几个方面:

  • 能够管理远超过 memory 容量的数据
  • 读写磁盘开销巨大,因此需要尽量避免频繁读写磁盘,或者更加高效的读写磁盘,防止 write stall 带来的影响
  • 尽量避免随机磁盘 IO

数据库中,内存和磁盘的结构和关系大致如下图,磁盘上的数据通常以 page 为单位进行组织,内存中维护了一个缓冲池 buffer pool,缓存了磁盘中的 page。

当上层的执行引擎需要读写数据时,首先从 buffer pool 中获取数据,如果 buffer pool 中没有,则从磁盘中加载到 buffer pool,然后返回到执行引擎中。

这样的组织方式比较类似操作系统提供的 MMap 机制,即内存映射。

内存映射(MMap)指的是将磁盘文件内容映射到内存地址空间中,进程访问该地址时,触发缺页异常,将磁盘的内容加载到物理内存中进行读写。

一个常见的问题是,为什么数据库中不直接使用操作系统提供的 MMap 机制,而是自己去实现内存 buffer 和 disk 的管理呢?

数据库的上层执行引擎通常是多线程并发执行,如果此时访问 MMap,访问的 page 可能会各不相同,由此可能频繁发生缺页中断,导致系统 stall。

而数据库对于磁盘管理有着更加定制化的需求:

  • 以正确的顺序将脏页刷到磁盘
  • 特定的预读策略
  • buffer 替换策略
  • 线程/进程调度

总之,数据库系统希望能够自己控制磁盘和内存管理,而不依赖于操作系统,满足自己特定的需求和场景。

补充知识: 在 PostgreSQL 中,底层的存储管理基于虚拟文件描述符,即 Virtual File Descriptior,简称 VFD,使用 vfd 的主要目的是绕开操作系统对同一个进程最大打开文件数的限制。

进程不直接持有操作系统的 fd,而是由数据库系统分配的 vfd,如果进程打开文件数达到了上限,那么会暂时关闭未被使用的文件。

在 vfd 之上,postgres 封装了操作磁盘文件的基本 API,例如打开、关闭、删除文件等,代码可参考: https://github.com/postgres/postgres/blob/master/src/backend/storage/file/fd.c https://github.com/postgres/postgres/blob/master/src/backend/storage/smgr/smgr.c

Page 概览

绝大多数数据库系统中的磁盘数据都是以 page 为单位进行组织的,所以先来详细看看磁盘 page 的结构。

数据库中的磁盘 Page 指的是一个有固定大小的文件块,Page 中通常可以存储元组、元信息、索引、日志等。每个 page 都有一个唯一的标识,称为 page id。

不同的数据库的 page size 是不同的,常见的几种如下:

在数据库系统中,page 肯定不止一个,那么如此多的 page 之间,需要进行统一管理,例如增加一个 page、删除一个 page、遍历所有的 page 等,该怎么组织这些 page 来实现这些目的呢?

最常见的组织方式叫做 heap file,heap file 指的是一个无序的 page 集合,page 是随机进行排列的。

heap file 有两种常见的组织方式:

  • linked list
  • page directory

linked list 是按照链表的方式组织 page,链表头有两个指针,一个指向 free page list,表示空闲的 page 列表,一个指向 data page list,指向实际存储数据的 page。

这种方式虽然直观,但是效率低下,因为 page 是通过指针完全无序排列的,查找 page 需要进行遍历,这种组织方式实际使用并不多。

另一种更加常用的方式是 page directory。

page directory 实际上就是维护了一个特殊的 page,这个 page 中存储的是其他 page 的位置,可以看做是 page 的元数据。

这个特殊的 page 还存储了每个 page 的 free space 空间等信息,便于上层应用对需要读写的 page 进行选择。

Page 组织方式

log structured

page 中数据可以通过类似日志的方式组织,即对 tuple 的增删操作都以日志追加的方式写到 page 中,这样做的最大好处是可以利用顺序 IO,写性能能够得到提升。

但是这种 log 式的组织方式,需要进行数据的回收处理(compaction),并且在读数据的时候,因为数据存在新旧多个版本,可能会有额外的磁盘 IO 消耗。

日志组织方式对于写多读少的应用非常合适,一些 NoSQL 引擎例如 leveldb、rocksdb、HBase 都采用了这种方式,但是在关系型数据库中,这种方式并不是主流。

slotted page

page 的内部结构,关系型数据库中常用的组织方式叫做 slotted page,其大致结构如下:

page 最靠前的部分,叫做 page header,这通常是由一个固定 size, header 中通常包含一些关于此 page 的元数据,例如 page 大小、校验和、DB 版本、事务信息、数据压缩信息。

header 之后的部分叫做 slot array,每一个 solt array 都存储了 tuple 的开始位置,这样能够快速定位到每条记录。

例如 postgres 中对于每条记录都有一个隐藏的 CTID,记录的是该 tuple 的物理位置,其内容是 page id + offset,即 tuple 所在页的 id,以及在页内的位置。

select *, ctid from some_table;

每个 tuple 实际上就是一个不定长的字节序列,里面存储了具体的数据信息。

读者有兴趣的话可以再看下 postgres 的磁盘 page 结构,与这里的 slotted page 基本上是一致的,代码: https://github.com/postgres/postgres/blob/master/src/include/storage/bufpage.h

Large Values

前面提到了一个 page 通常都有固定的 size,那么如果存储的数据太大,超过了 page 的大小,应该怎样存储这些数据呢?

最常见的方式是使用一个额外的 page 来存储,原来的 page 中保存一个指向它的指针,如果数据仍然很大,额外的 page 还是放不下,那么可以在新开一个 page,并且由上一个 page 指向它。

这个额外的 page 通常叫做 overflow page,不同的数据库有不同的称呼或做法,例如 PostgreSQL 中把这种存储叫做 TOAST。

Tuple 的结构

再来看一下 tuple 的内部结构,tuple 大致由两部分组成,header 和数据部分。

header 中主要存储了一些元数据信息,例如 tuple 的可见性(用于并发控制),用于判断 null 列的 bit map 等等。

postgres 中 tuple 的内部结构可以参考:https://github.com/postgres/postgres/blob/master/src/include/access/htup_details.h

Storage Model

最后再来看一下,在宏观的角度,对于不同 workload 的数据库的存储方式有什么区别。

目前根据不同的应用场景和数据读写特征,大致将数据库划分为了两种:OLTP 和 OLAP,他们的存储方式也存在很大的差异。

OLTP,即 On-Line Transaction Processing,在线事务处理,其特征是读写简单,通常是读/写一小部分数据,并且事务可保证数据的一致性。

目前大多数在线业务均使用 OLTP 类型的数据库,例如电商,通常选择、购买商品,针对一个用户,大多数情况下,都只会读取和更新一部分只关于这个用户的数据。

OLAP,即 On-Line Analytic Processing,在线分析处理,其特征是查询复杂,需要读取大批量数据进行统计分析。

针对这两种不同的 workload,数据库中的数据组织上也有一些区别,分别是以行存和列存为主流。

行存是最常见、符合直观思维的存储模式,将不同属性的数据一行行的组织起来,并且存储到 page 当中。

这样更适合 OLTP,因为能够非常方便的更新或者获取到某一条(或几条)具体的数据(点查)。

但如果我们的查询只需要取出一部分的列,而不是一个 table 中的全部列,那么这样会造成一定的浪费,因为我们可能会把毫不相关的列取出来然后丢弃掉。

列存的组织方式则完全不同,它会将有相同属性的数据一起组织起来,这样更方便大批量扫描数据。

具体的存储方式,是将表中一个列的数据存到 page 中。由于具有相同属性的数据,会更可能有类似的特征,所以这样的数据组织方式更适合压缩,节省存储空间。

列存更适合 OLAP 类型的数据库。


这一节主要讲述了数据库的存储管理,并且掺杂了一些 PostgreSQL 的 demo,大家可以自行参考。下一节会向上一层,来看看对于内存 buffer pool 的管理。

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/AVSt6AismqlVwbPCEr2EOQ

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237227次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录