6
博客lsm-tree 的底层原理

lsm-c7电子娱乐

2024-11-07设计原理

基本概念:

  • lsm - tree(log - structured merge - tree)即日志结构合并树,是一种用于存储和管理数据的数据结构,主要应用在数据库存储系统中,特别是一些需要处理高写入吞吐量的场景,如 nosql 数据库。
  • 它的设计理念是将随机写入转化为顺序写入,以提高写入性能。因为在传统的磁盘存储中,顺序写入的速度要比随机写入快得多。


结构组成:

  • memtable(内存表):这是 lsm - tree 存储结构的最上层。新的数据首先会被写入到 memtable 中。memtable 通常是一个基于内存的有序数据结构,比如红黑树或者跳表。以跳表为例,它能够在内存中高效地维护数据的有序性。当有新的数据插入时,跳表可以快速地确定插入位置,并且插入操作的复杂度较低。
  • sstables(sorted string tables):当 memtable 达到一定的大小后,其数据会被刷新(flush)到磁盘上的 sstables。sstables 是存储在磁盘中的有序键值对集合,其内部的数据是按照键(key)进行排序的。sstables 并不是单个的大文件,而是一系列的文件,每个文件都有自己的范围(key 的区间)。例如,在一个存储用户信息的数据库中,可能会有一个 sstable 负责存储姓名以 a - f 开头的用户信息,另一个 sstable 存储姓名以 g - l 开头的用户信息等。


写入过程:

  • 当有新的数据写入时,首先将数据插入到 memtable 中。一旦 memtable 已满或者达到一定的条件(如写入时间间隔、数据量阈值等),就会触发将 memtable 中的数据刷新到磁盘上的 sstable 中。这个过程是顺序写入磁盘,利用了磁盘顺序写入速度快的特点,从而提高了写入性能。
  • 在将 memtable 数据写入 sstable 的过程中,会对数据进行排序和压缩,以减少磁盘空间的占用。例如,可能会对具有相同前缀的键值对进行合并,或者删除一些过期的数据(如果数据库支持数据过期策略)。


读取过程:

  • 当进行数据读取时,系统首先会在内存中的 memtable 中查找数据。如果在 memtable 中没有找到,就会按照一定的顺序查找 sstables。由于 sstables 中的数据是按照键排序的,所以可以使用二分查找等高效的查找算法来定位数据所在的 sstable。
  • 但是,因为数据可能分散在多个 sstables 中,而且可能存在数据更新后旧版本数据仍然存在于某些 sstables 中的情况,所以读取过程可能需要合并来自不同 sstables 的数据,以获取最新的结果。这种合并操作可能会增加读取的时间复杂度,但在很多情况下,通过合理的设计和优化,可以将这种影响控制在可接受的范围内。


合并过程:

  • 随着时间的推移和数据的不断写入,磁盘上会产生多个 sstables。为了避免 sstables 数量过多导致读取性能下降和磁盘空间浪费,lsm - tree 会定期进行合并操作。
  • 合并操作会选择一些相邻的 sstables(例如,键范围有重叠的 sstables),将它们合并成一个新的 sstable。在合并过程中,会删除重复的数据和过期的数据,并且对数据进行重新排序和压缩。这个过程可以优化磁盘空间的使用,并且在一定程度上提高读取性能,因为合并后的 sstable 包含的数据更加紧凑和有序。
点赞6
收藏

声明

本网站下的“博客”等板块为技术爱好者提供分享、交流的平台。发布者发布的任何内容、信息等,并不反映或代表本网站的观点、立场或政策。本网站不对其任何内容和信息的错误以及由此产生的损失或损坏承担任何责任。

尊重知识产权是本网站的基本原则之一,如您在使用本网站过程中发现本网站中存在侵犯您或其他第三人合法知识产权的情况,请您即可将侵权材料及初步证据提交至下述邮箱:obcompliance@oceanbase.com 。本网站将在收到材料后尽快进行审核及处理。

b

已发布 11 篇博文

相关推荐
网站地图