论文部分内容阅读
目前的内存数据库为了保证数据不会丢失,会把内存中的数据备份到磁盘中。因为备份操作以及I/O操作的引入会极大降低内存数据库的效率。近年出现的非易失性内存(NVM)具有掉电不丢失数据、字节可寻址以及读写速度快等特点,如果把内存数据库部署在NVM上,可以极大地提升数据库的效率。然而,现有的内存数据库不能很好地利用NVM的优势,主要存在以下三个问题:1)现有内存数据库使用操作系统管理的临时内存和数据结构,可能被系统回收或置换到外存,不能持久化保存在内存里;2)现有内存数据库的一致性机制依赖于块设备文件系统,不能利用NVM按字节寻址等特性提高性能;3)数据库的操作数据量较小,需要细粒度的内存空间管理。为此,本次研究的目的是设计一个新的基于非易失性内存的key-value内存数据库。和传统的内存数据库相比,基于非易失性内存的数据库在保证访问效率的同时,又可以避免数据丢失,避免数据库备份以及I/O操作。本文的主要研究内容如下:(1)非易失性内存物理空间管理。对非易失性内存的操作都是通过映射到用户空间的地址,在非易失性内存上直接操作。通过空闲链表和位图共同管理空闲空间。大空间分配采用直接在空闲链表上分配的方式,小空间分配采用提前预分配的方式,减少对空闲链表的操作。这种分配分配方式减少了内部碎片,提高对小空间的分配效率。(2)利用非易失性内存的非易失性持久化数据库,需要设计数据库的元数据信息。当数据库存储于非易失性内存上时,虽然它具有非易失性,但是存储数据的具体位置和索引等信息已经不在,不能恢复数据库。为此我们根据需求,设计数据库的元数据,在设备固定位置保存数据库的索引和组织结构信息。在重新启动或者系统掉电后依然可以快速恢复数据库。(3)由于非易失性内存的引入,重新设计并实现保证一致性的方案。普通的磁盘数据库是依靠文件系统的一致性机制来保证一致性,在非易失性内存中已经不适用。本文通过日志与写入时复制(COW)相结合的方式来保证数据库的一致性。这种方式可以在保证一致性的同时保证高并发能力。本文使用提出的技术,基于开源的key-value内存数据库Redis实现了一个面向非易失性内存的持久化内存数据库,Persistent Redis(PRedis)。在Redis基础上,PRedis新增加非易失性内存管理单元,数据库元数据和一致性性算法。本文用标准工具验证PRedis的性能。在数据量是1000万条的情况下,数据库的启动和关闭效率有1000倍的提升。相比基于磁盘做备份的Redis,本文提出的PRedis可取得1000多倍的性能提升;相比基于内存文件系统EXT4-DAX做备份的Redis,本文PRedis有84.5%的性能提升。