文章目录

  • 一、背景
  • 二、lsm-tree简介
  • 三、lsm-tree设计思想
  • 四、lsm-tree原理
    • 1.写操作
    • 2.读操作
    • 3.有序表持久化
    • 4.后台压缩
  • 五、lsm-tree的应用
  • 六、lsm-tree优缺点分析
  • 总结

一、背景

由于传统机械磁盘的原理,它在读写时有个寻道的操作,在读写时都需要消耗一个寻道时间。

这就造成了顺序读写的速度远远快于随机读写的速度。这之间存在几个数量级的差距。

二、lsm-tree简介

LSM-tree起源于 1996 年的一篇论文《The Log-Structured Merge-Tree (LSM-Tree)》,今天的内容和图片主要来源于 FAST’16 的《WiscKey: Separating Keys from Values in SSD-conscious Storage》。

LSM-tree 是专门为 key-value 存储系统设计的,key-value 类型的存储系统最主要的就两个个功能,put(k,v):写入一个(k,v),get(k):给定一个 k 查找 v。

三、lsm-tree设计思想

之前我们说过,在传统磁盘上,顺序读写的性能要远高于随机读写。而这也是lsm-tree的设计出发点。

它通过一种方法,将对数据的写操作变为顺序写操作,以此来优化数据写性能。

而后台的压缩进程将数据不断压缩成有序结构,使得顺序读成为可能。

四、lsm-tree原理

1.写操作

当进行写操作时,先将该写操作以日志的形式追加写到文件中,这样就是以顺序写的形式写数据。

同时将其加入内存中的有序表结构当中。(作为kv数据库,内存中势必会有那种排序表结构用于快速查找)

2.读操作

先找内存,看内存中是否有,如果没有,那么就去持久化的文件中依次查找,因为每个文件的kv对是有序的,所以我们可以利用一些算法(比如二分)来加快查找速度。

又因为持久化的文件可能有多个,所以在极端情况下,lsm-tree需要读取多个文件才可能查找到对应的kv对。

3.有序表持久化

尽管lsm-tree写操作已经是顺序写,但是其有个弊端,那就是磁盘中的数据存储并不是有序的

PS:仔细想想如果磁盘中的数据不是有序的那会有什么问题?当我们需要按顺序遍历时,对于非有序存储的磁盘数据,那么会造成多次的随机读,这对于传统磁盘而言是不可接受。

为了保证有序,真正的磁盘数据持久化应该是根据内存中有序表来持久化的,这样之前写的日志文件作用只是保证数据写入操作不会因为宕机等原因而丢失。

而这种持久化往往是周期性触发,比如内存中有序表kv键值对达到一定数量或者到达一定时间,会触发数据持久化。

可以这么理解,每隔一段时间,操作系统中的文件系统就会多一个存储有序数据的文件,每个文件都是一个小型的有序表。

4.后台压缩

文件多了怎么办,之前说了经过lsm-tree的处理,数据持久化为多个小文件,而对于数据的查找往往需要遍历多个小文件。

这样查找效率可就低了,为了加快查找效率,也为了减少文件描述符(因为这是有限的),lsm-tree需要在后台进行压缩。主要目的就是将多个小文件进行合并,合并成大文件。

五、lsm-tree的应用

lsm-tree在工业界应用十分广泛,比如leveldb,rocketdb等等。因为随机写优化成了顺序写,所以性能非常可观。

六、lsm-tree优缺点分析

我们仔细回顾下lsm-tree到底做了什么来使性能提升的。
其实一句话就是将随机写改为顺序写,不管是日志持久化,还是有序表持久化,亦或者是后台压缩,其写操作皆是顺序写。

但是我们仔细思考下,它所做的事情真的减少了吗?

其实不然,非但没有减少,实际的写入的数据还有增加。

不考虑后台压缩操作,光日志持久化和有序表持久化就将数据写放大到两倍。更别提还有极度消耗资源的后台压缩操作。而它能提升性能的原因仅仅是顺序写和随机写操作在传统磁盘上的性能差距实在太大了,大到即使是多了这些额外的操作,lsm-tree所带来的性能收益也要大于其消耗

但是这个前提正在被逐渐打破,注意到我之前的用词了吗?

传统磁盘!

在传统磁盘中,这种优化是没有任何毛病的,但已渐渐成为主流的SSD正在将这种前提打破!

尽管SSD的顺序写操作性能依旧要比随机写要好,但是其性能差距并没有像传统磁盘那么大。

在2019年SOSP上有一篇论文——KVell: the Design and Implementation of a Fast Persistent Key-Value Store中,就提到了现代硬盘SSD针对lsm-tree的一些问题。

在这篇论文中提到了lsm-tree在现代磁盘上的两个问题,一个是CPU成为瓶颈,另一个是性能波动问题。

在lsm-tree中,之前提到的后台压缩操作实际上是个CPU大户,我们经常可以看到请求量不多,但是CPU耗费拉满的情况。

这是因为随着技术的发展,SSD无论是带宽还是性能都已有了巨大的提升。在论文中提到一个明显现象就是,LSM-tree始终无法利用整个设备的I/O带宽,而CPU往往处于高负荷运转的状态。

同时,后台压缩操作在请求量大的情况下势必影响客户端的吞吐量,因为有时更新需要等待压缩完成,从而导致LSM-tree性能的波动。

总结

lsm-tree是一个以优化写操作的存储策略,核心思路就是顺序写替换随机写。
lsm-tree在传统磁盘上的读写性能表现非常出色,在工业界非常流行,比如腾讯tendis和360的pika底层用的Rocksdb就是采用lsm-tree来实现的。

但是随着时代的发展,SSD性能的提升和读写方式的变化,使得lsm-tree渐渐暴露出一些问题,也让我们不禁去探寻一种更为高效的存储方式。

数据存储策略——lsm-tree相关推荐

  1. odoo tree视图过滤数据_数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)...

    随着使用数据库的深度和理解能力的提升,有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击. 我们公认的BTREE B+TREE  是否还能面对现在的硬件的变化.  BTREE 到底是为那 ...

  2. 华为云FusionInsight MRS HDFS组件数据存储策略配置指导

    操作场景 默认情况下,HDFS NameNode自动选择DataNode保存数据的副本.在实际业务中,可能存在以下场景: DataNode上可能存在不同的存储设备,数据需要选择一个合适的存储设备分级存 ...

  3. 列车时刻表的数据存储策略

    做一个类似极品列车时刻查询软件,初步想用数据库存储列车时刻信息,不知极品列车时刻是如何存储数据,操作数据的. 另一个中可能的做法是采用数据结构的方法,用树来组织数据. 探讨中...

  4. tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?

    LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用: 参考资料[4]这么牛X的名单,你不想了解下L ...

  5. 8、HDFS内存存储策略支持和“冷热温”存储

    Hadoop系列文章目录 1.hadoop3.1.4简单介绍及部署.简单验证 2.HDFS操作 - shell客户端 3.HDFS的使用(读写.上传.下载.遍历.查找文件.整个目录拷贝.只拷贝文件.列 ...

  6. 中小企业的四个数据存储方法和措施

    "每家企业都是一家科技公司",随着大数据的增长,这个说法最近被抛在脑后,但这是真实的.各种规模的公司,从成长中的企业,政府机构,社会企业和非营利组织,正在面临编制数据和保护数据的新 ...

  7. 企业不可忽视的数据存储和数据安全问题!

    当今"大数据"已经渗透到各行各业,越来越多的企业每天都会产生海量数据,这些需要长期存储的数据不容小觑,无论是在保证数据安全方面还是存储成本上,对企业来说都是一项比较大的挑战. 对于 ...

  8. 2.3大数据存储技术

    大数据存储技术面向的是海量.异构数据,因此,它需要提供高性能.高可靠的存储和访问能力.本节将介绍大数据存储技术的概率和原理,包括Hadoop分布式文件系统(HDFS).列式数据库(HBase)和其他数 ...

  9. 大数据技术原理与应用——大数据存储与管理

    大数据技术原理与应用--大数据存储与管理 1.分布式文件系统 (1)计算机集群结构 集群的概念 集群是指将多台服务器整合在一起,每台服务器都实现相同的业务,做相同的事情. 每台服务器并不是缺一不可,它 ...

最新文章

  1. jsp cookie 中文乱码 的解决方法
  2. C#中方法的参数四种类型(值参数、ref、out、params)详解
  3. 2.6 多分类问题-机器学习笔记-斯坦福吴恩达教授
  4. Swift - 使用set,get确保索引加减在正常的范围内
  5. Git 初始化及仓库创建及操作
  6. 【Linux网络编程】无连接和面向连接协议的区别
  7. mysql8.0.15远程登陆权限,MySQL8.0给root用户赋予远程连接权限
  8. [zz from newsmth] 王大牛的Memory Model reading list
  9. java开发windows应用_Java开发在生活中实际的应用有哪些?
  10. 使用VC6.0缺少Dll或头文件解决方法
  11. Hive 不支持 where 子句中的子查询, SQL 常用的 exist in 子句需要改写。这一改写相对简单。考虑以下 SQL 查询语句:
  12. python操作系统存储管理作业答案_操作系统课后题答案一
  13. Shader序列帧动画——UnityShader学习笔记复习
  14. python读取图片信息_笔记整理4——python实现提取图片exif信息
  15. 网站被攻击客户信息被泄露如何解决
  16. android 弹幕stg模板,STG游戏在弹幕设计上有何讲究?
  17. 《未来简史(下)》万维钢解读
  18. 联通用户取消plus黄金会员自动续费
  19. 2021-10-29 2021年资料员-通用基础(资料员)考试题及资料员-通用基础(资料员)免费试题
  20. 电话销售话术模板有哪些 电话销售技巧

热门文章

  1. 如何在Typora中以可视化或源码的方式使用markdown
  2. webservice连接验证用户名密码
  3. 非等级式随机森林----随机蕨分类器
  4. 为InfiniBand而哭泣
  5. java 采集新闻数据
  6. 使用ffmpeg制作时光影集
  7. 【Python】位运算(按位与 、按位或 |、左移位运算符 <<(相当于乘以2)、右移位运算符 >>(相当于除以2))
  8. 浅谈SystemInit时钟系统
  9. java与go对接AES-GCM加解密
  10. 入行数据分析,自学好还是报班培训比较好