性能优化——存储性能优化

核心知识点:算法

存储性能优化无非从磁盘类型、数据结构以及存储备份方式来进行,根据业务场景选择最合适的方案。数据库

1.机械vsSSD(磁盘类型)安全

  a.机械:因为每次访问数据,都须要移动磁头臂,所以连续访问和随机访问性能差异比较大。快速顺序读写、慢速随机读写性能优化

  b.SSD:使用硅晶体存储数据,所以像内存同样随机访问,功耗和噪音也比较小,可是可靠性和性价比有待提升。服务器

2.B+树 vs LSM树(数据结构)数据结构

  a.为了优化磁盘的随机读写能力,文件系统或数据库系统会先将数据排序,保证数据更新、插入、删除以后依然有序,加快检索速度。并发

  b.B+树:传统的关系型数据库使用,N叉排序树,通常两级索引,最多三层树,须要5次才能更新一条数据。负载均衡

  c.LSM树:非关系型使用,N阶排序树,数据写在内存中完成,所以读写性能可能会因为B+框架

  d.LSM存储步骤:先往内存排序中写,到达阀值与磁盘最新排序树合并,再次到达阀值,与上下级排序树合并。分布式

  e.读:先访问内存,内存没有再访问磁盘;写:在内存中进行

 3.RAID vs HDFS(存储和备份方式)

1)RAID{关键词:条带(striping)、镜像(mirroring)、奇偶校验(XOR)}

  a.RAID0:将数据分段存储在多个磁盘上,没有冗余(条带)

  b.RAID1:将数据同时存储在两个或多个磁盘上,写的速度低,读的速度快,磁盘利用率低。(镜像)

  c.RAID01:先作条带(0),再作镜像(1);RAID10:先作镜像(1),在作条带(0);可是RAID10的安全性能高于RAID01。(条带+镜像)

  d.RAID3:拿出一块磁盘作奇偶校验块,可是对于数据修改较多的场景,奇偶校验块的压力比较大,更换频繁。(XOR)

  e.RAID5:数据条带分布在磁盘上,奇偶校验数据分布在全部磁盘上。(XOR)

  f.RAID6:与RAID5惟一不一样的是,使用不一样算法有两份校验数据,能在两块磁盘损坏的状况下恢复数据。(XOR)

 2)HDFS:

  a.在整个集群上进行数据读写和备份,不是一磁盘为单位,而是以服务器为存储单位。

  b.1个名称节点和多个数据节点。一份数据写完以后会自动存储两份。

 

 

在网站应用中,海量的数据读写对磁盘访问形成巨大压力,虽然能够经过Cache解决一部分数据读压力,

可是不少时候,磁盘仍然是系统最严重的瓶颈。并且磁盘中存储的数据是网站最重要的资产,磁盘的可用性和容错性也相当重要。

 

1、机械硬盘 vs 固态硬盘

机械硬盘是目前最经常使用的一种硬盘,经过马达驱动磁头臂,带动磁头到指定的磁盘位置访问数据,

因为每次访问数据都须要移动磁头臂,所以机械硬盘在数据连续访问(要访问的数据存储在连续的磁盘空间上)

随机访问(要访问的数据存储在不连续的磁盘空间)时,因为移动磁头臂的次数相差巨大,性能表现差异也很是大。

 

 

固态硬盘又称做SSD或Flash硬盘,这种硬盘没有机械装置,数据存储在可持久记忆的硅晶体上,

所以能够像内存同样快速随机访问。并且SSD具备更小的功耗更少的磁盘震动与噪音

 

在网站应用中,大部分应用访问数据都是随机的,这种状况下SSD具备更好的性能表现。

可是目前SSD磁盘还不太成熟,可靠性、性价比都有待提高,所以SSD的使用还在摸索阶段。

 

2、B+树 vs LSM树

因为传统的机械磁盘具备快速顺序读写、慢速随机读写的访问特性,这个特性对磁盘存储结构和算法的选择影响甚大。

 

为了改善数据访问特性,文件系统数据库系统一般会对数据排序后存储加快数据检索速度

这就须要保证数据在不断更新、插入、删除后依然有序,传统关系数据库的作法是使用B+树。

B+树是一种专门针对磁盘存储而优化的N叉排序树,以节点为单位存储在磁盘中,

从根开始查找所需数据所在节点编号和磁盘位置,将其加载到内存中而后继续查找,直到找到所需的数据。

 

目前数据库多采用两级索引的B+树,树的层次最多三层,所以可能须要5次磁盘访问才能更新一条记录

(三次磁盘访问获取数据索引及行ID,而后再进行一次数据文件读操做及一次数据文件写操做。)

 

可是因为每次磁盘访问都是随机的,而传统机械硬盘可能在数据随机访问时性能较差

每次数据访问都须要屡次访问磁盘,影响数据访问性能。

 

目前许多NoSQL产品采用LSM树做为主要数据结构。

 

LSM 树能够看做是一个N阶合并树。数据写操做(包括插入、修改、删除)都在内存中进行

而且都会建立一个新纪录(修改会建立新的数据值,而删除会记录一个删除一个标志),

这些数据在内存中仍然是一棵排序树,当数据量超过设定的内存阀值后,会将这颗排序树和磁盘上最新的排序合并。

当这棵排序树的数据量也超过设定阀值后,和磁盘上下一级的排序树合并。合并过程当中,会用最新更新的数据覆盖旧的数据(或者记录为不一样版本)。

 

在须要进行操做时,老是从内存的排序树开始搜索,若是没有找到,就从磁盘上的排序树顺序查找。

 

在LMS树上进行一次数据更新不须要磁盘访问,在内存便可完成,速度远快于B+树。

当数据访问以写操做为主,而都操做集中在最近写入的数据上是,使用LSM树能够极大程度地减小磁盘的访问次数,加快访问速度。

 

做为存储结构,B+树不是关系数据库所独有的,NoSQL数据库也可使用B+树。

同理,关系数据库有也可使用LSM,并且随着SSD磁盘的日趋成熟及大容量持久存储的内存技术的出现,相信B+树这一古老的存储结构会再次算法青春。

 

3、RAID vs HDFS

1.RAID

 RAID全称为独立磁盘冗余阵列(Redundant Array of Independent Disks),

基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。(目的)

RAID一般被用在服务器电脑上,使用彻底相同的硬盘组成一个逻辑扇区,所以操做系统只会把它当作一个硬盘。

RAID分为不一样的等级,各个不一样的等级均在数据可靠性及读写性能上作了不一样的权衡。 在实际应用中,能够依据本身的实际需求选择不一样的RAID方案。

1).RAID0

RAID0称为条带化(Striping)存储,将数据分段存储于 各个磁盘中,读写都可以并行处理。所以其读写速率为单个磁盘的N倍(N为组成RAID0的磁盘个数),可是却没有数 据冗余,单个磁盘的损坏会致使数据的不可修复。

 

2).RAID1

镜像存储(mirroring),没有数据校验。数据被同等地写入两个或多个磁盘中

可想而知,写入速度会比较 慢,但读取速度会比较快。读取速度能够接近全部磁盘吞吐量的总和,写入速度受限于最慢 的磁盘。 RAID1也是磁盘利用率最低的一个。

 

 3).RAID3

通常状况下,一台服务器上不会出现同时损坏两块磁盘的状况,在只损坏一块磁盘的状况下,

若是能利用其它磁盘的数据恢复损坏磁盘的数据,这样在保证可靠性和性能的同时,磁盘利用率也获得大幅提高。

 

RAID3在数据写入的时候,将数据分为N-1份,并发写入N-1块磁盘,并在第N块磁盘记录校验数据

任何一块磁盘损坏(包括校验数据磁盘),均可以利用其它N-1块磁盘的数据恢复。

但在数据修改较多的场景中,修改任何磁盘数据都会致使第N块磁盘重写校验数据,

频繁写入的后果是第N块磁盘比其余磁盘容易损坏,容易频繁更换,所以RAID3在实践中不多使用。

 

4).RAID5

奇偶校验(XOR),数据以块分段条带化存储。校验信息交叉地存储在全部的数据盘上

RAID5把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,

而且奇偶校验信息和 相对应的数据分别存储于不一样的磁盘上,其中任意N-1块磁盘上都存储完整的数据,

也就是 说有至关于一块磁盘容量的空间用于存储奇偶校验信息。

所以当RAID5的一个磁盘发生损坏 后,不会影响数据的完整性,从而保证了数据安全。

当损坏的磁盘被替换后,RAID还会自动利用剩下奇偶校验信息去重建此磁盘上的数据,来保持RAID5的高可靠性。

 

RAID 5能够理解为是RAID 0和RAID 1的折衷方案。RAID 5能够为系统提供数据安全保障,但 保障程度要比镜像低而磁盘空间利用率要比镜像高

RAID 5具备和RAID 0相近似的数据读取速度,只是由于多了一个奇偶校验信息,写入数据的速度相对单独写入一块硬盘的速度略慢。

 

5).RAID6

 相似RAID5,可是增长了第二个独立的奇偶校验信息块,两个独立的奇偶系统使用不一样的算法数据的可靠性很是高,即便两块磁盘同时失效也不会影响数据的使用

但RAID 6须要分配给奇偶校验信息更大的磁盘空间,同时须要计算,相对于RAID 5有更大的“写损失”,所以“写性能”很是差。

由图所知,每一个硬盘上除了都有同级数据XOR校验区外,还有一个针对每一个数据 块的XOR校验区。

固然,当前盘数据块的校验数据不可能存在当前盘而是交错存储的。

从数 学角度来讲,RAID 5使用一个方程式解出一个未知变量,而RAID 6则能经过两个独立的线性 方程构成方程组,从而恢复两个未知数据。

伴随着硬盘容量的增加,RAID6已经变得愈来愈重要。

TB级别的硬盘上更容易形成数据丢失, 数据重建过程(好比RAID5,只容许一块硬盘损坏)也愈来愈长,甚至到数周,这是彻底不可接受的。

而RAID6容许两 块硬盘同时发生故障,因此渐渐受到人们的青睐。

 

6).RAID 01

RAID0和RAID1的结合。先作条带(0),再作镜像(1)。

RAID01中块做为独立的个体,所以一个块中的部分发生损坏,整个块都不能访问。

 

7).RAID10

相对于RAID01来讲,先作镜像(1),再作条带(0)。

RAID01和RAID10很是类似,两者在读写性能上没有什么差异。可是在安全性上RAID10要好于 RAID01

如图中所示,假设DISK0损坏,在RAID10中,在剩下的3块盘中,只有当DISK1故障, 整个RAID才会失效。

但在RAID01中,DISK0损坏后,左边的条带将没法读取,在剩下的3快盘 中,只要DISK2或DISK3两个盘中任何一个损坏,都会致使RAID失效。

2.HDFS

RAID技术能够经过硬件实现,好比专用的RAID卡或者主板直接支持,也能够经过软件实现。

RAID在传统关系数据库及文件系统中应用比较普遍,可是大型网站比较喜欢用NoSQL,以及分布式文件系统。

 

在HDFS(Hadoop分布式文件系统中),系统在整个存储集群的多台服务器上进行数据并发读写和备份

能够看做在服务器集群规模上上实现了相似RAID的功能,所以不须要磁盘RAID。

 

HDFS以块(Block)为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,

每写完一个Block,HDFS就将其自动恢复到另外两台机器上,保证每一个Block有三个副本,

即便有两台服务器宕机,数据依然能够访问,至关于实现了RAID1的数据恢复功能。

 

当对文件进行处理计算时,经过MapReduce并发计算任务框架,能够启动多个计算子任务(MapReduce Task),

同时读取文件的多个Block,并发处理,至关于实现了RAID0的并发访问能力。

 

在HDFS中有两种重要的服务器角色:NameNode(名称服务节点)和DataNode(数据存储节点)。

在整个HDFS中只部署一个实例,提供元数据服务。至关于操做系统中的文件分配表(FAT),

管理文件名Block的分配,维护整个文件系统的目录树结构。

DAtaNode则部署在HDFS集群中其它服务器上,提供真正的数据存储服务。

 

和操做系统同样,HDFS对数据存储空间的管理以数据块(Block)为单位,只是比操做系统中的数据块(512字节)要大的多,默认为64MB。

HDFS将DataNode上的磁盘空间分红N个这样的块,供应用程序使用。

 

应用程序(Client)须要写文件时,首先访问NameNode,请求分配数据块,

NameNode根据管理的DataNode服务器的磁盘空间,按照必定的负载均衡策略,分配若干数据供Client使用。

 

当Client写完一个数据块时,HDFS会将这个数据块再复制两份存储在其余DataNode服务器上,HDFS默认同一份数据有三个副本,保证数据可靠。

所以在HDFS中,即便DataNode服务器有多块磁盘,也不须要使用RAID进行数据备份,而是在整个集群上进行数据备份,

并且系统一旦发现某台服务器宕机,会自动利用其它机器上的数据将这台服务器上存储的数据块自动再备份一份,从而得到更高的数据可靠性。

 

HDFS配合MapReduce等并行计算框架进行大数据处理时,能够在整个集群上并发访问全部的磁盘,无需RAID支持。