Non-Volatile Memory Databases
背景
新兴的存储技术提供像DRAM一样的低延迟读取/写入,但具有永久写入和大容量等类似SSD的特性。
- AKA存储级内存,永久内存
最早的设备将是块地址(NVMe),但是基于块地址的设备并不被数据库研发人员所青睐,它的性能仅仅类似于一个更好更快的NAND flash内存。
后来的设备,字节地址改变了人们设计操作系统结构的方式。
发现的过程这儿就不描述了,大概就是发现了除了电容、电阻、电感以外的第四种原件,忆阻器(Memristor)。
论文How We Found the Missing Memristor和Two 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优化的恢复协议避免了处理日志的开销。
- 非易失性数据结构确保一致性。
完结撒花~