讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来:

  • 哈希存储引擎  是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是your Mr.Right
  • B树存储引擎是B树(关于B树的由来,数据结构以及应用场景可以看之前一篇博文)的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。
  • LSM树(Log-Structured Merge Tree)存储引擎和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

通过以上的分析,应该知道LSM树的由来了,LSM树的设计思想非常朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。

LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。

以上这些大概就是HBase存储的设计主要思想,这里分别对应说明下:

  • 因为小树先写到内存中,为了防止内存数据丢失,写内存的同时需要暂时持久化到磁盘,对应了HBase的MemStore和HLog
  • MemStore上的树达到一定大小之后,需要flush到HRegion磁盘中(一般是Hadoop DataNode),这样MemStore就变成了DataNode上的磁盘文件StoreFile,定期HRegionServer对DataNode的数据做merge操作,彻底删除无效空间,多棵小树在这个时机合并成大树,来增强读性能。

关于LSM Tree,对于最简单的二层LSM Tree而言,内存中的数据和磁盘你中的数据merge操作,如下图

图来自lsm论文

lsm tree,理论上,可以是内存中树的一部分和磁盘中第一层树做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,但是实际应用中,一般lsm有多层,当磁盘中的小树合并成一个大树的时候,可以重新排好顺序,使得block连续,优化读性能。

hbase在实现中,是把整个内存在一定阈值后,flush到disk中,形成一个file,这个file的存储也就是一个小的B+树,因为hbase一般是部署在hdfs上,hdfs不支持对文件的update操作,所以hbase这么整体内存flush,而不是和磁盘中的小树merge update,这个设计也就能讲通了。内存flush到磁盘上的小树,定期也会合并成一个大树。整体上hbase就是用了lsm tree的思路。

HBase总结(七)LSM理解相关推荐

  1. 海量吞吐的实时NoSQL—HBase的七剑和20151111圣战(数据脱敏版)

    2015年11月11日,作为媒体大屏(dataV).消费记录.支付宝风控.物流详情.库存对账核心数据库的集团HBase,当天稳定运行,顺利完成了任务.并交出了非常漂亮的几项数据: QPS=1993W, ...

  2. 2021年大数据HBase(七):Hbase的架构!【建议收藏】

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hbase的架构 一.Client 二.Master ...

  3. HBase学习之路(七):理解计数器的基本概念及计数器的使用

    内容简介 一.计数器的基本概念 二.在Shell中创建并操作计数器 三.单计数器 四.多计数器 五.总结 一.计数器的基本概念 我在前两篇文章中详细介绍了HBase的过滤器,这是HBase的高级特性之 ...

  4. hbase 中的LSM树存储引擎

    LSM的原理:将对数据的修改增量保存在内存中,达到指定大小限制之后批量把数据flush到磁盘中,磁盘中树定期可以做merge操作,合并成一棵大树,以优化读性能.不过读取的时候稍微麻烦一些,读取时看这些 ...

  5. 对HBase整个框架的理解

    HBase是一个分布式的.可扩展的.高容错性的,可以用于存储海量数据的数据库,对于存储半结构化.非结构化数据优势明显. 相比于传统的数据库,HBase有以下几点优势: 1.传统的数据库比如mysql, ...

  6. Hbase中的LSM树详解

    一.前言 哈希存储引擎 是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统.对于key-value的插入以及查询,哈希表的复杂度都是O( ...

  7. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

    前几篇分析了一下AQS的原理和实现,这篇拿Semaphore信号量做例子看看AQS实际是如何使用的. Semaphore表示了一种可以同时有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据, ...

  8. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  9. Python学习心得(七) 深入理解threading多线程模块

    Python提供了多个模块来支持多线程编程,包括thread.threading和queue模块等. thread模块提供了基本的线程和锁定支持:而threading模块提供了更高级别.功能更全面的线 ...

最新文章

  1. 如何更改微信标签名字_微信透明昵称代码复制
  2. 国产操作系统进入被彻底抛弃的时代
  3. Hibernate懒加载问题
  4. C++STL——概述
  5. 非对称加密算法之RSA算法实现
  6. java arraylist 初始化_一不小心就让Java开发踩坑的fail-fast是个什么鬼?
  7. 工业相机选型_工业相机与镜头的选型方法
  8. 拼多多上架专供湖北平价口罩 每天300万只
  9. mysql_connect() 不支持 请检查 mysql 模块是否正确加载 解决方法
  10. 阿里云虚拟主机针对恶意频繁攻击式访问造成CPU爆满的解决方法
  11. Syncovery for mac(文件备份和同步工具)
  12. C++中struct和class的区别 [zz]
  13. 自动与时间服务器时间同步,Windows系统时间同步(附时间同步服务器地址)
  14. 微信小程序自动回复机器人(模拟云信案例)
  15. Python 使用Gmail发送邮件
  16. PS去水印的四种方式
  17. python的十句名言_程序员的二十句励志名言,看看你最喜欢哪句?
  18. 深入解析棋牌湖南放炮罚,跑胡子手游源码(java版)
  19. 【UVM基础】uvm_agent 中的 is_active 变量释义
  20. OneTab: 一键合并所有 Chrome 浏览器标签页

热门文章

  1. python批量读取csv并写入_Python如何批量读取CSV文件中指定信息并写入doc文件命名中?...
  2. PHP 运动会,运动会成绩管理系统
  3. java与c++中的对象序列化分析
  4. linux配置服务器心得体会,linux 学习 linux上搭建dhcp服务器
  5. java+spring+mysql配置_JAVA后台搭建(springboot+mybatis+mysql)项目搭建
  6. android透明activity,Android 简单实现透明Activity
  7. asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02
  8. 杰瑞服务器虚拟化,大家在Mac中开发PHP,是用虚拟机的方式还是直接在Mac下搭建环境...
  9. #创建记事本程序在哪打开_微软Windows 10记事本商店版归来?系统可选,能卸载...
  10. mysql主从异步复制_centos7mysql主从复制(默认异步)