# 2020-Fall-DBMS-Project
This the project of DBMS course in 2020 Fall.
## 文档目的
读了介绍文档,你应该知道**需要做什么**和**不能做什么**。
## 注意事项
1. 各小组请自行建立属于小组的Github仓库,所有作业小组成员通过Github或其他代码托管网站协作完成(请自学Git相关操作)。
2. 课程设计以小组为单位进行,小组个人评分时根据Github的贡献量,请小组自行分工。
3. Git仓库地址对其他小组保密,避免被抄袭。
4. **各小组切忌参考别人的代码,TA将使用软件查重,一抓一个准,高度雷同的小组都按抄袭处理,课程也会大概率挂科**。
## Persistent Memory Linear Hash
这次课程设计的主题是实现一个简单的基于NVM的线性哈希索引,涉及到的知识点有数据库系统的线性哈希,非易失性内存NVM环境的仿真模拟,PMDK库的安装和使用,NVM编程要点。项目已经写好头文件,包括数据结构的基本设计和相应的函数接口,目标是实现这些接口来满足相应的需求
### 线性哈希
索引是数据库系统中重要的数据结构,数据库的数据存储依靠索引来进行组织,可以理解为一种存放协议。有了存放的规则,我们就可以依据存放的规则进行相应的查找,怎么放就怎么找。有了查找功能,我们也可以相应实现修改和删除功能。所以索引具有四大基本操作:**增删改查**,而操作的数据对象都是**键值对**的形式。
常见的索引有B+Tree和哈希索引,线性哈希属于一种哈希索引。线性哈希的核心是会将所有哈希表维护成一种连续的数组的模式,这样我们就可以方便地直接通过下标来访问相应的哈希桶。本次课程设计的线性哈希实现参考课本《数据库管理系统原理与设计》第三版的283页部分对线性哈希的描述来实现其增删改查操作。
### 非易失性内存NVM
Non-Volatile Memory(NVM)也即非易失性内存,是一种新型存储硬件。其不仅具有传统内存的字节寻址特性,同时也具有磁盘的数据持久化的特性,将数据存放在NVM上面可以实现持久化。这次课程设计中的线性哈希的键值数据等就是要存放到NVM上,以达到持久化和可恢复的目的。要实现持久化,需要进行相应的数据存储的设计,即解决如何存放持久的数据然后如何读取这些数据的问题,便于程序依靠这些数据恢复。
### NVM环境模拟
NVM设备目前还不常见,但是Intel已经提供了一份[教程](https://software.intel.com/content/www/us/en/develop/articles/how-to-emulate-persistent-memory-on-an-intel-architecture-server.html)来讲解如何利用自己机器上的普通内存来模拟NVM环境。在Ubuntu 18等具有较新Linux内核的操作系统中进行模拟的话,直接从GRUB Configuration步骤开始即可。
### NVM编程要点
由于NVM属于一种特殊的存储硬件,所以编程上需要按照特定的模式进行以对NVM的持久数据按字节访问而不是IO流的形式。现在主流的NVM编程模型是依据SNIA的推荐的标准,使用mmap内存映射的方式进行NVM文件数据的访问,mmap相关背景请自行百度了解。具体来说,就是在NVM的设备上安装一个NVM-aware的文件系统如EXT4,然后开启DAX模式以供程序能够以直接访问模式访问文件数据,然后程序以mmap的形式打开NVM文件,以字节寻址的方式操作文件数据。而在实际编程中,可以借助开源的PMDK库依据这个编程模型进行NVM编程。
为了实现NVM编程,对于数据操作细节,需要注意几点:
1. 先通过mmap的形式打开文件通过其虚拟地址来操作相应的数据,然后通过unmap的形式关闭文件
2. 每次修改NVM上的数据,都是会先在CPU Cache中进行。为了真正持久化到NVM中,都要调用CLWB/CLFLUSH指令来将数据扫回NVM,然后调用一次sfence来保证先后写入的有序性
上述操作和NVM编程可以借助PMDK来实现。
### PMDK库
PMDK库是开源的NVM编程的工具库,详情请查看官方[github仓库](https://github.com/pmem/pmdk)和[主页](https://pmem.io)。本次课程设计使用的库是最基本的libpmem库,主要用到的函数只有三个,用于协助我们进行NVM编程和解决NVM编程要点的数据操作问题:
1. pmem_map(): 这个函数将目标文件通过内存映射的方式打开并返回文件数据的虚拟地址,这样操作这个虚拟地址的数据即通过字节寻址的方式操作数据
2. pmem_persist(): 这个函数调用CLFLUSH和SFENCE指令来显式持久化相应的数据,每次NVM数据的修改都应调用一次
3. pmem_unmap(): 这个函数用于关闭pmem_map打开的NVM文件
### YCSB Benchmark测试
完成索引实现后,要运行给定的benchmark数据集测试自己的索引性能,对于benchmark测试请自行百度相关背景知识。这次采用的是YCSB测试,一种键值benchmark,给定的数据集每行操作由操作类型和数据组成,由于项目使用8字节键值,所以在读取数据的时候直接将前8字节的数据复制进去即可,键和值内容相同。运行流程分load和run,load用于初始化数据库,run为真正运行阶段。
## 具体任务
本次课程设计分几步完成,涉及环境搭建和项目代码实现:
1. 实验环境应是Ubuntu 18等具有较新Linux内核的操作系统,推荐使用Ubuntu 18或20
2. 每个小组应建立自己的Git仓库进行协同编程,没有Git的提交记录当没有贡献处理
3. 根据[Intel的教程](https://software.intel.com/content/www/us/en/develop/articles/how-to-emulate-persistent-memory-on-an-intel-architecture-server.html),利用普通内存模拟NVM环境并测试是否配置正确
4. 根据PMDK的README安装教程进行库安装
5. 根据项目框架和需求实现代码并运行,测试每个功能运行并截图相应结果
6. 自行编写YCSB测试,运行给定的Benchmark数据集并测试OPS(Operations per second)和延迟两个性能指标
7. 撰写report总结任务3-6的实现过程,重点在第5步
## PML-Hash设计细节
### 数据结构设计
PMLHash的主要结构已经在头文件中给出,主要包括元数据,存储的哈希表数组数据以及溢出哈希表数据,默认将所有数据放在一个16MB的文件中存储,结构如下:
```
// PMLHash
| Metadata | Hash Table Array | Overflow Hash Tables |
+---------- 8 MB -------------+------- 8 MB ---------+
// Metadata
| size | level | next | overflow_num |
// Hash Table Array
| hash table[0] | hash table[1] | ... | hash table[n] |
// Overflow Hash Tables
| hash table[0] | hash table[1] | ... | hash table[m] |
// Hash Table
| key | value | fill_num | next_offset |
```
### 操作详解
#### Insert
插入操作用于插入一个新的键值对,首先要找到相应的哈希桶,然后插入。插入的时候永远插入第一个空的槽位,维持桶的元素的连续性。可能原本的哈希桶本身已经满了且有溢出桶,那就插入溢出桶。插入后桶满,就出发分裂操作,分裂的桶被metadata中的next标识。
产生新的溢出桶从数据文件的Overflow Hash Tables区域获取空间,其空闲的起始位置可以通过metadata的overflow_num在启动时计算出来,每获取一个新的溢出桶,就将空间位置的指针往后移动即可,可以支持到8MB的溢出桶空间使用完毕。
#### Remove
删除操作用于移除目标键值对,为了位置哈希桶的连续性,采用将移除键值位置后的其他键值向前移动的方式进行覆盖,然后更新桶的fill_num指示桶的最后一个元素位置,达到删除的目的。
删除可能将一个溢出桶清空,直接将桶从溢出链中去除即可。对于空溢出桶的空间回收操作作为加分项进行。
#### Update
更�
没有合适的资源?快使用搜索试试~ 我知道了~
基于NVM的线性哈希索引数据库的简单实现.zip
共24个文件
txt:11个
png:5个
md:3个
0 下载量 183 浏览量
2024-08-23
09:46:41
上传
评论
收藏 5.48MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无VIP,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的酬劳 3. 积分资源不提供使用问题指导/解答
资源推荐
资源详情
资源评论
收起资源包目录
基于NVM的线性哈希索引数据库的简单实现.zip (24个子文件)
DSsjkV1ff
CMakeLists.txt 228B
benchmark
10w-rw-75-25-run.txt 248KB
10w-rw-75-25-load.txt 2.56MB
10w-rw-0-100-load.txt 2.56MB
10w-rw-0-100-run.txt 262KB
10w-rw-50-50-run.txt 253KB
10w-rw-25-75-load.txt 2.56MB
10w-rw-50-50-load.txt 2.56MB
10w-rw-100-0-run.txt 243KB
10w-rw-25-75-run.txt 258KB
10w-rw-100-0-load.txt 2.56MB
.github
workflows
cmake.yml 2KB
src
pml_hash.h 2KB
pml_hash.cc 10KB
main.cc 5KB
docs
3.png 32KB
1.png 17KB
5.png 12KB
4.png 12KB
report.md 22KB
README.md 9KB
2.png 13KB
.gitignore 37B
README.md 745B
共 24 条
- 1
资源评论
热爱技术。
- 粉丝: 2633
- 资源: 7860
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功