众多数据库使用到的LSM(面试题).docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
众多数据库使用到的LSM(面试题) 2021-03-19 很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等。所以在面试过程中会经常被问到,最新重新又复习了一遍 LSM Tree 的原理。 特点 总的来说就是通过将大量的随机写转换为挨次写,从而极大地提升了数据写入的功能,虽然与此同时牺牲了部分读的功能。 只适合存储 key 值有序且写入大于读取的数据,或者读取操作通常是 key 值连续的数据。 存储模型 WAL 在设计数据库的时候经常被使用,当插入一条数据时,数据先挨次写入 WAL 文件中,之后插入到内存中的 MemTable 中。这样就保证了数据的长久化,不会丢失数据,并且都是挨次写,速度很快。当程序挂掉重启时,可以从 WAL 文件中重新恢复内存中的 MemTable。 MemTable MemTable 对应的就是 WAL 文件,是该文件内容在内存中的存储结构,通常用 SkipList 来实现。MemTable 供应了 k-v 数据的写入、删除以及读取的操作接口。其内部将 k-v 对依据 key 值有序存储,这样便利之后快速序列化到 SSTable 文件中,仍旧保持数据的有序性。 Immutable Memtable 顾名思义,Immutable Memtable 就是在内存中只读的 MemTable,由于内存是有限的,通常我们会设置一个阀值,当 MemTable 占用的内存达到阀值后就自动转换为 Immutable Memtable,Immutable Memtable 和 MemTable 的区分就是它是只读的,系统此时会生成新的 MemTable 供写操作连续写入。 之所以要使用 Immutable Memtable,就是为了避开将 MemTable 中的内容序列化到磁盘中时会堵塞写操作。 SSTable SSTable 就是 MemTable 中的数据在磁盘上的有序存储,其内部数据是依据 key 从小到大陈列的。通常为了加快查找的速度,需要在 SSTable 中加入数据索引,可以快读定位到指定的 k-v 数据。 SSTable 通常接受的分级的结构,例如 LevelDB 中就是如此。MemTable 中的数据达到指定阀值后会在 Level 0 层创建一个新的 SSTable。当某个 Level 下的文件数超过肯定值后,就会将这个 Level 下的一个 SSTable 文件和更高一级的 SSTable 文件合并,由于 SSTable 中的 k-v 数据都是有序的,相当于是一个多路归并排序,所以合并操作相当快速,最终生成一个新的 SSTable 文件,将旧的文件删除,这样就完成了一次合并过程。 常用操作的实现 写入 在 LSM Tree 中,写入操作是相当快速的,只需要在 WAL 文件中挨次写入当次操作的内容,成功之后将该 k-v 数据写入 MemTable 中即可。虽然做了一次磁盘 IO,但是由于是挨次追加写入操作,效率相对来说很高,并不会导致写入速度的降低。数据写入 MemTable 中其实就是往 SkipList 中插入一条数据,过程也相当简约快速。 更新 更新操作其实并不真正存在,和写入一个 k-v 数据没有什么不同,只是在读取的时候,会从 Level0 层的 SSTable 文件开头查找数据,数据在低层的 SSTable 文件中必定比高层的文件中要新,所以总能读取到最新的那条数据。也就是说此时在整个 LSM Tree 中可能会同时存在多个 key 值相同的数据,只要在之后合并 SSTable 文件的时候,才会将旧的值删除。 删除 删除一条记录的操作比较特殊,并不马上将数据从文件中删除,而是记录下对这个 key 的删除操作标记,同插入操作相同,插入操作插入的是 k-v 值,而删除操作插入的是 k-del 标记,只要当合并 SSTable 文件时才会真正的删除。 Compaction 当数据不断从 Immutable Memtable 序列化到磁盘上的 SSTable 文件中时,SSTable 文件的数量就不断添加,而且其中可能有很多更新和删除操作并不马上对文件进行操作,而只是存储一个操作记录,这就形成了整个 LSM Tree 中可能有大量相同 key 值的数据,占据了磁盘空间。 为了节省磁盘空间占用,把握 SSTable 文件数量,需要将多个 SSTable 文件进行合并,生成一个新的 SSTable 文件。比如说有 5 个 10 行的 SSTable 文件要合并成 1 个 50 行的 SSTable 文件,但是其中可能有 key 值反复的数据,我们只需要保留其中最新的一条即可,这个时候重生成

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档