分布式基础-存储引擎

author author     2023-04-12     151

关键词:

参考技术A 题目和文章内容有点不太符合,这里存储引擎是指单机存储引擎。对于分布式存储系统来说,存储引擎是必须的。存储引擎决定了数据在内存和磁盘中具体如何存储的,如何方便地拿出来的问题。可以说直接决定了存储系统的性能和可以干什么,不可以干什么的问题;本文参考《数据密集型应用系统的设计》 和《大规模分布式存储系统原理解析和架构实战》。

存储系统的功能做机制的简化就是存储和查询,如果从一般功能出发就是基础的增删改查。从最简单的开始想起,最简单的存储系统,无非就是把数据直接写入到文件中(可以按照K,V一行方式存储),需要的时候就顺序读取文件,找到可以需要查询的行。这在少量的数据的时候并没有问题,但是如果是大批量数据,几百MB或者几GB,甚至TB,PB的时候,顺序读取大量文件那速度慢的吓人。

顺序读取文件做遍历查找,速度很慢,我们第一想到的思路是建索引,索引最常用的就是哈希表了,如果我们对文件中的数据建个索引,Key 保存着我们下次要查询的值,Value对应这哪个文件的哪个位置。在内存中保存这个索引,下次查询的时候,我们通过哈希表快速定位到文件和位置,就可以迅速取到需要的值了。Bitcask折中日志型小型文件系统就采用这种存储方法,它可以提供高性能的读写,只需要经过一次磁盘的寻址就可以获取到所需要的数据。

作为日志型的存储系统,Bitcask的删除和修改是通过顺序记录到文件中,并不是对原来的文件进行修改,这减少了随机磁盘的读写操作。数据写入到文件中,如果一直写,显然文件越来越大,不便于操作,所以限制文件的大小,当大小达到一定规模后,重新写入一个文件。 对于更新和删除的数据,如果不处理,会产生大量的垃圾数据,占用了空间,所以后台会定时进行文件合并,合并的时候删除标记删除的具体数据。

Bitcask

哈希存储引擎的数据分为两份,一份是内存中的数据,一个是磁盘的文件,系统崩溃后,磁盘中的哈希表就没有了。如果恢复的时候通过读取文件的方式也是可以重建的,但是如果文件很多,很大,恢复的时间就会很长,Bitcask对每个段的文件的哈希表快照存储在文件中,下次恢复的时候可以快速恢复。

Bitcask只有一个写入线程追加,可以采用多个读取的线程并发读取,性能上还是很不错。

哈希存储引擎 因为采用哈希表,查找的性能不错,但是同样因为采用哈希存储引擎,会导致范围查询,只能通过遍历的方式去查询数据,范围查询慢。

刚才结构也说了,索引必须可以保存在内存中,才可以性能够好,但是如果数据量超大,内存中无法保存,保存到磁盘中,会产生大量的随机访问。另外哈希还存在着哈希冲突的问题。

刚才的哈希存储引擎的两个缺点,一是范围查询性能很差,我们要做范围查询,最好数据是有序的,有序的就可以不用遍历全部数据去做范围查询了。所以我们内存的数据不就不适合哈希索引,我们可以考虑改造成一个支持排序的数据结构。 另外刚才的哈希存储引擎,数据是按照顺序写入到数据文件中的,如果同一个key的多次更新,只保留最后一个数据的时候,是不是挺麻烦。

我们可以将文件中和内存中的数据都排序,这种格式称为排序字符串,在Level DB中叫SSTable。文件中的K-V结构排序后,好处是我们在做多文件合并的时候,可以按照多路归并的算法,快速排序,用多个指针依次比较和后移就可以办到。多个文件含有同一个值的时候,我们可以保留最新的字段值。

内存中的数据排序后,我们不一定对所有的数据的key都保存,可以只保存部分,根据key的排序特性,也可以很容易找到要找的值。 由于要对内存中的数据排队,而且数据要经常插入和删除,所以红黑树和AVL树是比较适合这种场合。对于存储在磁盘上的文件,也是有序的,用普通的AVL树或红黑树,保存到磁盘上后,数据多的话,树的层次会很高,这样通过多个指针需要多次随机读取,所以一般采用专门为大数据存储磁盘而设计的B+树,B+树的每个节点的分叉很多,一个节点可能有上千个分支。这样很少的层次就可以支持大量的数据了。

这种引擎如何写入数据:

如何读取数据:

这个存储引擎就是LSM 存储引擎的本质了,Level DB 就是采用这个存储引擎的。

类似的存储引擎还用于HBASE,以前还记得学习HBase的时候minor compaction(少量的HFile合适小文件合并,为提升性能同时减少IO压力)和major compaction(一个Node节点的所有文件合并),还比较迷茫。 从上图的Level DB存储引擎图可以看出,数据处理过程:

说明清单文件保存的是元数据信息,记录了每个SSTable文件所属的Level,文件中的key的最大值和最小值。同时由于SSTable文件经常变动的,所以增加个当前文件指向当前的清单文件这样操作起来就不用加锁了。

相对于以上两种引擎,B树存储引擎应用的最广泛,在关系型数据库中运用的很多。B树存储引擎不光支持随机查询,还很好地支持范围查询。像SSTable一样,B树引擎同样保持了对key的排序。在文件存储上,还是有很大的差异。LSM存储引擎的段文件大小不一,是顺序写入到磁盘的。B-Tree不像LSM树那样有内存表和SSTable,而只有一个B树,当然一些顶层块常在内存中。

B树是按照块存储数据库的数据的,它一般是一个多叉树,比如InnoDB引擎采用B+树存储,每个节点大概有1200个子分支。B树分为叶子节点和非叶子节点,叶子节点存储的是key和具体的数据,而非叶子节点存的是key和磁盘地址。

B树存储结构

以B+树为例说明查询和插入的基本流程

读取一个节点,如果对应的节点所在的数据页不在内存中,需要按照下面的过程从磁盘中读取,然后缓存在内存中。

插入和更新按照InnoDB引擎为例的话,还是比较复杂。

实际中还涉及到bin log日志。可以看到实际工程中,B-树引擎还是通过redo log这种WAL日志,用顺序磁盘读写替换了随机读写;change buffer 减少了随机读数据的过程,可以合并多条修改记录,一次性写,增加了性能。

B树和LSM树相比有以下特点: B-树引擎特点:

java基础

...据库:Mysql基础,事务隔离,InnoDB存储引擎原理,MVCC和锁分布式缓存:redis、memcache等的原理、协议、区别、集群部署Spring:AOP和IOC分布式系统:CAP、分布式事务、分布式一致性原理MQ消息队列:比如kafka(底层原理,包括数据存... 查看详情

elasticsearch-基础介绍及索引原理分析(代码片段)

介绍Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene(TM)基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:分布式实时文件存储... 查看详情

elasticsearch基础理论&配置调优

...ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。它不但包括了全... 查看详情

elasticsearch-基础介绍及索引原理分析

...tps://www.cnblogs.com/dreamroute/p/8484457.html介绍Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene™基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还... 查看详情

elasticsearch-基础介绍及索引原理分析(代码片段)

...ttp://www.cnblogs.com/dreamroute/p/8484457.html介绍Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene(TM)基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可... 查看详情

elasticsearch基础操作01

ElasticSearchES是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩... 查看详情

hive基础(代码片段)

...文件),定义了类似SQL的查询语言,通过它来读写和管理分布式存储的数据。它的底层执行引擎可以是MapReduce、Spark等(将SQL语句转化成M/R或者Spark语言)。优点:简单SQL,常用于数据分析,扩展性好(计算和存储 查看详情

从分布式分析引擎到分布式存储

...没做太多思量的情况下,开始了真正的数据搬运工生涯。分布式分析引擎由于一开始只对spark和storm有所了解,所 查看详情

elasticsearch原理(代码片段)

...望指明,一起探讨,学习,进步。介绍Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene(TM)基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以... 查看详情

elasticsearch性能监控基础

一、Elasticsearch是什么Elasticsearch是一款用Java编写的开源分布式文档存储和搜索引擎,可以用于nearreal-time存储和数据检索。1、Elasticsearch简要组成在开始探索性能指标之前,让我们来看看Elasticsearch的工作原理,在elasticsearch中,集... 查看详情

elk安装

...源软件Elasticsearch,Logstash和Kibana。Elasticsearch是一个实时的分布式搜索和分析引擎,它可以用于全文搜索以及分析。它是一个建立在全文搜索引擎ApacheLucene基础上的搜索引擎,便用java语言编写。主要特点:实时分析;分布式实时文... 查看详情

elk日志分析基础

...earch,Logstash和Kibana组成ElasticSearchElasticSearch是一个实时的分布式搜索和分析引擎,用于支持全文搜索,结构化搜索以及分析,采用java语言编写ElasticSearch主要特点如下实时搜索,实时分析分布式架构,实时文件存储,将每一个字... 查看详情

分布式基础

 小小吐槽一番:因为一直在学习分布式架构,所以分布式架构博客一直到现在才开始写,在写的过程也等于是在复习了!废话不多说,进入正题什么是分布式?1,任务分解2,节点通讯分布式和集群的关系?分布式:一个业务拆分... 查看详情

数据库基础---存储引擎--表的格式

1储存引擎就是表的类型,针对不同的储存引擎,mysql会有不同的处理逻辑  现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等  数据库中的表也应该有不同的... 查看详情

python下使用elasticsearch(代码片段)

一什么是ElasticSearchElasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene(TM)基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:分布... 查看详情

分布式爬虫之elasticsearch基础1(代码片段)

一:搜索引擎elasticsearch介绍  Elasticsearch 是一个全文搜索引擎,可以快速地储存、搜索和分析海量数据。二:应用场景海量数据分析引擎站内搜索引擎数据仓库三:安装我们可以到Elasticsearch的官方网站下载Elasticsearch... 查看详情

查看mysql支持的存储引擎

...的说明、评论”、“是不是支持事务”、“该引擎支持的分布式是否支持XA规范”、“是否支持事务处理中的保存点”等方面逐个地、详细地显示出来;使用“;”和“\g”作用相同,仅简单显示各个存储引擎的信息。 查看详情

3.高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建(代码片段)

高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建如果大家看了我的上一篇《2.高并发教程-基础篇-之nginx+mysql实现负载均衡和读写分离》文章,如果能很好的利用,那么其实已经可以轻松日抗千万级别的访问量了,但是... 查看详情