LSM树

前言

LSM树全称为The Log structured Merage - Tree,根据名称可以大概认识到主要有以下特点:

  • 是基于日志结构思想的。其中日志结构主要特点就是可以不断追加,而不做原始日志的覆盖。
  • 要进行Merage,即要把日志结构进行Merage。

所以根据名称可以大概推测LSM的一些基本特性。

概念

LSM的思想起源于1996年的一篇论文(点击查看)

LSM的核心思想:将数据的添加和增量修改首先保存在内存中(追加日志的形式),而后满足一定条件后,将内存中的数据flush到磁盘上。磁盘中按照不同层级组织数据文件,内存中的数据首先flush到某一层级,而后当该层级满足一定条件后,会和磁盘上下一个层级的数据文件进行合并(Merage)。为了保证查询性能,内存中数据和磁盘中不同层级的数据都需要保持有序。如下图所示:


1.png

关键流程

写入

LSM的写入流程如下:1)首先写WAL日志,避免故障导致数据丢失;2)将数据写入C0内存中memtable,相当于在内存中保留最新的数据更新。3)当C0内存中的数据达到一定量级的时候(大小限制)会将C0中的数据flush到磁盘C1中,并且对磁盘C1层级的数据进行合并(归并排序)。4)当磁盘C1层级大小到一定规模,又会将C1中的数据同C2合并(归并排序)。5)以此类推,上一层级的数据文件达到一定规模后,会向下一层级合并。

特别说明

  1. 由于后面的磁盘文件合并是后台异步进行,不会阻塞数据写入内存,所以LSM的数据写入性能很高。
  2. 磁盘上不同层级数据文件合并时,会将原有本层级的数据删掉,重新写入新的数据文件,使磁盘是顺序写,这也避免了磁盘的时间消耗。
  3. 磁盘不同层级数据文件合并时,都会对本层级数据进行归并排序,也就是说,每一层级的数据永远都是有序的,这是为了保证查询时的效率。

查询

LSM的查询比较麻烦,由于内存中只保留了最近更新的数据,而且磁盘上不同层级的数据也不是完全完整的数据,越靠上层的数据越新,越靠下层的数据越老,所以查询时需要从上至下分别查询多次。1)首先查看内存中是否包含指定目标。若查到则直接返回,若没有查到则继续向下查找。2)其次查看磁盘C1层级中是否包含指定目标。以此类推,一直向下层级查找,直到命中指定目标或者查完所有层级后仍然没有命中(不存在)。

特别说明

  1. 由于上述查询的特性,所以LSM更适合高密度写入,低密度查询的场景。
  2. 有很多对于LSM查询的优化,比如增加布隆过滤器,来直接判断该key是否存在,而避免遍历所有层级的磁盘文件。又比如会增加一个类似于元数据的结构(levelDB中的Mainfest 文件,它描述各个层级数据的key最小值,最大值,层级数)查询时可以直接通过该结构快速定位要查找的数据层级。

更新

k-v的更新也就是写入的流程,内存中都是向后追加最新的数据记录,磁盘中合并的时候较新的数据值(上层级)会覆盖较老的数据值(下层级),每个层级合并完之后仅保留唯一并且有序的key。

删除

由于LSM不会直接在内存或磁盘上直接删除某个key,而是发生删除请求的时候追加一个特定标志的数据记录,比如 key-del,这意味该key被做了删除标记。只有当磁盘中数据文件合并的时候才会执行真正的删除。

LSM的优劣性

  • 将用户随机写,转换为顺序写,以追加的方式快速写入,这些要素保证了其写入性能高,吞吐量大。
  • 由于需要多次分批查询,导致读性能相对较差。(这个读性能查是相对的,在实际场景中,并不一定性能差)
  • 读写放大问题:读写放大(read and write amplification)是 LSM-tree 的主要问题。读写放大 = 磁盘上实际读写的数据量 / 用户需要的数据量。由于磁盘IO带宽是共享的,特殊情况下,会对用户读写造成一定影响。

LSM的实现

LSM思想提出后,有很多基于该结构的数据库或文件系统的出现。并且在此基础上实现时对一些细节都做了不同的优化。
LevelDB、RocksDB、Cassandra、Hbase以及一些时序数据库(InfluxDB)都实现或借鉴了LSM的思想。
以下分别就LevelDB 和 Hbase 中的关键结构说明一下。

LevelDB

2.png

上图为LevelDB的基本架构。其中内存中有两种类型的memtable:一种是正常的memtable,接受用户的写入数据更新。一种是Immutable,将作为固定的不可更新的memtable。硬盘中包括若干个SStable,他们分别按照L0到L6进行分层,每一层都包含多个SStable文件,每一层的容量大小限制均为上一层的10倍。

写入时:1)还是先写入wal日志。2)然后写入memtable。3)当memtable满足容量限制后,则转换为immutable,停止接受数据写入,并再新开启一个memtable接收新数据的写入。这样的处理使得数据写入更加的连续,不会受到flush磁盘的影响。4)immutable的数据会直接flush到L0层,并且采取向L0层直接追加SStable文件而不是合并的方式添加,所以L0层的SStables中可能存在冗余数据(重复key)。5)然后L0超过限制后,会选择一个(最老)SStable同下层级进行合并,然后下一层级所有受此影响的SStable都会进行更新。更新完成后保证该层级(所有SStable)中的数据是唯一有序的。
查询时:依次memtable、immutable、L0、L1-L6

Hbase

3.png

数据先写入到内存中,对应HRegion中的memStore。
为了防止数据丢失同时写Log(类似WAL),对应HRegion中的Hlog文件。
MemStore 到达一定大小后,刷磁盘,对应HRegion中的StoreFile(其中Hfile是真正的数据文件,并且里面还会包含类似于布隆过滤器的结构以及索引数据)。
HRegion内部的StoreFile 会不断合并更新。

总结

传统关系型数据库的索引一般是通过B/B+树结构实现的,B+树为了保证查询性能,其索引结构必须保证全局有序,所以这就导致在添加数据的时候需要树节点而引起重新排序(树平衡),也就造成了大量随机写磁盘的操作,影响效率。

LSM的重要思想就是使大量随机写变成了顺序写,大大提高了数据写入的性能,但是牺牲了部分读性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351