高级数据库二十五:不易失内存数据库

Non-Volatile Memory Databases

背景

新兴的存储技术提供像DRAM一样的低延迟读取/写入,但具有永久写入和大容量等类似SSD的特性。

  • AKA存储级内存,永久内存

最早的设备将是块地址(NVMe),但是基于块地址的设备并不被数据库研发人员所青睐,它的性能仅仅类似于一个更好更快的NAND flash内存。

后来的设备,字节地址改变了人们设计操作系统结构的方式。

发现的过程这儿就不描述了,大概就是发现了除了电容、电阻、电感以外的第四种原件,忆阻器(Memristor)。

论文How We Found the Missing MemristorTwo centuries of memristors

技术

没必要太过深入地了解这些元器件的具体工作方式,只需要知道大致的高层次的工作模式即可。

Phase-Change Memory (PRAM)

论文Phase Change Memory Architecture and the Quest for Scalability

存储单元由两个被电阻加热器和相变材料(硫族化合物,可以根据温度的不同而改变)隔开的金属电极组成。

单元格的值根据材料的加热方式而改变。

  • 短脉冲将单元更改为“0”。
  • 一个长而渐进的脉冲(加热)将细胞变成“1”。

Resistive RAM (ReRAM)

论文How We Found the Missing Memristor

两个金属层之间有两个二氧化钛层。 运行电流的一个方向将电子从顶部TiO 2层移动到底部,由此改变电阻。

可能是可编程存储结构,具体的工作方式不明。

  • 伯特兰罗素的物质蕴涵逻辑

这个是惠普实验室发明的,他们从06年发现并宣布马上就要投产啦,一直到2016年都没有真正产品出现。

Magnetoresistive RAM (MRAM)

论文Spin Memory Shows Its Might

使用磁性存储元件存储数据,而不是电荷或电流。自旋转移力矩(STT-MRAM)是这种类型NVM的领先技术。

  • 据说能缩放到非常小的尺寸(10nm),并具有SRAM的延迟。
  • 从理论上比上面两种方式都快。

对工业界的影响

工业界已经对标准技术和外形因素达成了统一。

Linux和微软在其内核(DAX)中增加了对NVM的支持。

2017英特尔增加了将缓存行清空到NVM的新指令。在这之前人们是无法控制CPU将缓存清空至NVM的,都是由CPU自己决定的,但是有了这些指令之后就可以确定地将数据存入NVM。

NVM DIMM 的类型

NVDIMM-F(2015)

  • 只有闪存(flash)。必须与DRAM DIMM配对。
  • 对于操作系统来说,太慢了

NVDIMM-N(2015)

  • 在同一个DIMM共同含有flash和DRAM。
  • 作为易失性存储器出现在操作系统上,比通常的DRAM大多了。

NVDIMM-P(2018)

  • 真正的持久性内存,用到之前说过的三种技术。
  • 没有DRAM或闪存。

NVM 对数据库系统的影响

Block-addressable NVM不是那么有趣,这在之前简单地提到了一些。

字节寻址NVM将是一个行业改变者,但需要一些工作才能正确使用。

  • 内存数据库管理系统可以更好地使用可定制的NVM。(无法证明)
  • 面向磁盘的DBMS最初将NVM视为更快的SSD。

论文Let’s Talk About Storage & Recovery Methods for Non-Volatile Memory Database Systems

SYNCHRONIZATION

现有的编程模型假设任何写入内存都是非易失性的。

  • CPU决定何时将数据从高速缓存移动到DRAM。

DBMS需要一种方法来确保将数据从缓存刷新到NVM。

这个问题在Intel为NVM添加CPU指令集之后就被解决了。

NAMING

如果DBMS进程重新启动,我们需要确保内存数据的所有指针都指向相同的数据。

其中不仅包含索引对数据的指针,还包含类似MVCC中数据表内部的指针。

NVM-AWARE MEMORY ALLOCATOR

功能#1:同步

  • 分配器使用CLFLUSH指令将CPU高速缓存行写回到NVM。
  • 然后发出SFENCE指令,等待数据在NVM上变为持久。

功能#2:命名

  • 分配器确保即使在OS或DBMS重新启动后,分配给内存映射区域的虚拟内存地址也不会改变。

DBMS ENGINE ARCHITECTURES

选择1:in-place更新
  • 具有预写日志+快照的表堆。
  • 示例:VoltDB

如果想要更新一个元组,先往日志中写入信息,再进行更新,最后在进行快照保存。

所以要进行3次写入,重复的数据、恢复延迟。

利用分配器的非易失性指针来记录改变的内容,而不是改变它的方式。

DBMS只需要维护一个txn的临时UNDO日志,直到它提交。

  • 来自未提交的txn的脏高速缓存行可以由硬件刷新到内存控制器。
  • 没有REDO日志,因为我们在提交时刷新所有对NVM的更改。

所以我们只需要2次写,就能保证数据不丢失。

选择2:copy-on-write
  • 更新时创建表的影子副本。
  • 没有预写日志。
  • 例如:LMDB

对于SLOTTED PAGES,我们维护一个树形结构。当我们想要去改变一个page的某个值时,我们就需要拷贝一个副本,然后将指针维护好(包括父指针和子指针)。

那么我们也都知道复制的代价是非常大的。

对于NVM版本,我们不需要去维护一个SLOTTED PAGES中的元组,而是维护这些元组的指针。

选择3:Log-structured
  • 所有写入都附加到日志中。 没有表堆。
  • 例子:RocksDB

如果要更新一个元组,那么也就需要维护它的日志,它的日志不仅在内存中存在,在硬盘中也存在。这儿的数据需要拷贝多份和压缩。

对于NVM而言,就不需要磁盘上的日志维护了。

总结

存储优化

  • 利用字节寻址能力避免不必要的数据重复。

恢复优化

  • NVM优化的恢复协议避免了处理日志的开销。
  • 非易失性数据结构确保一致性。

完结撒花~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值