日志结构的存储引擎--LSM存储引擎

基础概念

  • 日志: 通常日志是指程序运行输出的日志,在这里主要是指仅能追加的记录序列集合,可以是人类不可读,比如是二进制格式,只能被程序来读取的文件。
  • 索引:一种数据结构,用于提高查询性能,因为索引需要维护,过多索引会影响写的速度。
  • 哈希索引:键-值数据解耦的索引,与大多数编程语言重字典接口非常相似。通常采用hash map(或者 hash table、哈希表)来实现。可以百度算法资料了解
  • LSM存储引擎(Log-Structured Merge-Tree):基于合并和压缩排序文件原理的存储引擎

1、哈希索引用途说明

1、假设用一个文件记录学生的分数,文本格式如下(图1-1):
在这里插入图片描述
图1-1

在这里插入图片描述
图1-2

在没有使用索引的情况下,每次检索分数都需要从头遍历文件直到找到对应名称。
如果针对姓名作为key和该姓名在文件中字节偏移量作为value 建立一个哈希索引(图1-2),
这样在每次在文件中追加记录新的学生分数时,同时更新该哈希索引该数据的偏移量。当检索某个姓名时,只需要找到姓名对应的偏移量,一次磁盘寻址,就可以读取该姓名对应的分数。

采用这种存储方案,比较适合将key放入内存(hash map 需要保存在内存中)

2、日志文件分段、压缩、合并

场景:用一个文件来记录不同视频的点击率,该场景可以采用上述方案,key为视频名称,value为视频的点击次数。每次点击视频,在日志文件追加一次记录(图2-1)

在这里插入图片描述
图2-1

  • 问题1:如何避免最终磁盘空间用尽?
    可以采用把日志分解成一定大小的段,当文件达到一定大小的时就关闭它,并将后续写入到新的段文件中,然后在这些段(冻结段)上进行压缩操作,压缩会去掉文件重复的key,并且只保留每个key最近的更新(图2-1 压缩后 如 图 2-2)。压缩后的段更小,可以在执行压缩同时,将多个段合并在一起,由于段在写入后不再更改,所以合并的段会被写入新的文件,对于这些冻结段合并和压缩过程,可以在后台线程中完成,合并压缩的过程,可以继续用旧的段文件正常处理读写请求,当合并完成,将读请求切换到新的合并段上,旧的段文件可以安全删除。
    在这里插入图片描述
    图2-2 压缩后文件

每个段都有自己的内存哈希表,将键映射到文件的偏移量,为了找到键值,首先检查最新的段的hash map, 如果键不存在,检查第二最新的段,以此类推,由于合并过程可以维持较少的段数量,因此查找不需要检查很多hash map。

  • 问题2 删除记录
    如果要删除和它关联的键,可以在数据文件中追加一个特殊的删除记录(有时候称为墓碑),当合并日志段时,发现墓碑标记,可以丢弃改键的所有值

  • 问题3 崩溃恢复
    如果数据库重新启动,内存中hash map将丢失,如果从头开始计算偏移量,再加载到内中,会效率很低,可以为每个段的hash map的快照存在磁盘上,提高hash map恢复速度

3、排序字符串表—SSTable

哈希表有2个问题:
1、如果键值太多,内存放不下的问题
2、区间查询查询效率低的问题

上述描述的存储段都是一组key–value的序列,这些序列是按照写入顺序排列的。并且日志中同一个键,后出现的值优于之前的值。
现在改变段文件中格式:要求key–value对顺序按键排序。

这种格式成为 排序字符串表,简称SSTable。要求每个键在每个段文件中,只出现1次(压缩过程确保)。
SSTable 相比 哈希索引的日志段,具有一下优点:
1、合并段更加高效,即使文件大于内存。合并过程类似排序算法,
2、内存中不需要保存所有键的索引,采用稀疏索引的方式,采用区间键来组成索引,
3、可以把一个范围内的记录保存到一个块中并在写入磁盘之前将其压缩。稀疏内存索引的每个条目指向压缩块的开头,可以节省磁盘空间,减少IO带宽的占用

4、如何构建维护SSTable

如何让数据按键排序?
1、写入时,将去添加到内存中的平衡树数据结构,这个内存中的树,有时被称为内存表。
2、当内存表大于某个阈值,将其作为SSTable文件写入磁盘。
3、读请求,首先尝试内存表查找键,然后是最新的磁盘段文件,接下来次新的磁盘段文件,以此类推,知道找到目标
4、后台周期性的执行段合并和压缩过程,以合并多个段文件,并丢弃那些被覆盖或删除的值

如何防止数据库崩溃时,丢失写的操作(内存表尚未写入磁盘)?
可以在磁盘上保留单独的日志,并为每个写入立即追加到该日志,不需要按照案件排序,当改内存表写入SSTable时,相应的日志可以被丢弃。

5、总结

LSM存储引擎就是采用SSTable的排序文件进行合并压缩的存储引擎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值