应用服务器性能优化 (存储性能优化)
在网站应用中,海量的数据读写对磁盘访问造成巨大的压力,虽可以通过Cache解决一部分读压力,但很多时候,磁盘仍然是系统最严重的瓶颈。
1. 机械硬盘 vs 固态硬盘
机械硬盘同多马达驱动磁头臂,带动磁头到指定的磁盘位置访问数据,由于每次访问数据都需要移动磁头臂,因此机械硬盘在数据连续访问和随机访问时,由于移动磁头臂的次数相差巨大,性能表现也非常大。
固态硬盘又被称作SSD或Flash硬盘,这种硬盘没有机械装置,数据存储在可持久记忆的硅晶上。
2. B+树 vs LSM树
B+树是一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到所需的数据。
目前数据库多采用两级索引的B+树,树的层次最多三层。因此可能需要5次磁盘访问才能更新一条记录(三次磁盘访问获得数据索引及行ID,然后再进行一次数据文件读操作及一次数据文件写操作)。
但是由于每次磁盘访问都是随机的,而传统机械硬盘再数据随机访问时性能较差,每次数据访问都需要多次访问磁盘影响数据访问性能。
目前许多NoSql 产品采用LSM树作为主要数据结构。
LSM树可以看作是一个N阶合并树。数据写操作(包括插入、修改、删除)都在内存中进行,并且都会创建一个新纪录(修改会记录新的数据值,而删除会记录一个删除标志),这些数据在内存中仍然还是一颗排序树,当数据量超过设定的内存的阙值后,会将这个颗排序树和磁盘上最新的排序树合并。当这颗排序树的数据量也超过阙值后,和磁盘上下一级的排序树合并。合并过程中,会用最新更新的数据覆盖旧的数据。
在需要进行读操作时,总是从内存中的排序树开始搜索,如果没找到,就从磁盘上的排序树顺序查找。
再LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树。当数据访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大程度地减少磁盘的访问次数,加速访问速度。
作为存储结构,B+树不是关系数据库所独有的,NoSql数据库也可以使用B+树。同理,关系型数据库也可以使用LSM。
3. RAID vs HDFS
RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。目前服务器级别的计算机都支持插入多块磁盘(8快或者更多),通过使用RAID技术,实现数据在多块磁盘上的并发读写和数据备份。
RAID技术可以通过硬件实现,比如专用的RAID卡或主板直接支持,也可以通过软件实现。RAID技术在传统关系数据库及文件系统中应用广泛,但是在大型网站比较喜欢使用Nosql,以及分布式文件系统中,RAID技术却遭到冷落。
在HDFS(hadoop分布式文件系统)中,系统在整个存储集群的多台服务器上进行数据并发读写和备份,可以看作在服务器集群规模上实现了类似RAID的功能,因此不需要磁盘RAID。
HDFS以块(Block)为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,每写完一个Block,HDFS就将其自动复制到另外两台机器上,相当于实现了RAID1的数据复制功能。
当对文件进行处理计算时,通过MapReduce并发计算任务框架,可以启动多个计算子任务(MapReduce Task),同时读取文件的多个Block,并发处理,相当于实现了RAID0的并发访问功能。
在HDFS中有两种重要的服务器角色:NameNode(名字服务节点)和DataNode(数据存储节点)。NameNode在整个HDFS中只部署一个实例,提供元数据服务,相当于操作系统中文件分配表(FAT),管理文件名Block的分配,维护整个文件系统的目录树结构。DateNode则部署在HDFS集群中其他所有服务器上,提供真正的数据存储服务。
和操作系统一样,HDFS读数据存储的管理以块(Block)为单位,只是比操作系统中的数据块(512字节)要大的多,默认为64M。HDFS将DataNode上的磁盘空间分成N个这样的块,供程序使用。
应用程序(Client)需要写文件时,首先访问NameNode,请求分配数据块,NameNode根据管理的DataNode服务器的磁盘空间,按照一定的负载均衡策略,分配若干数据块供Client使用。
当Client写完一个数据块时,HDFS会将这个数据块再复制两份存储在其他DataNode服务器上,HDFS默认同一份数据有三个副本,保证数据可靠性。因此在HDFS中,即使DataNode服务器有多块磁盘,也不需要使用RAID进行数据备份,而在整个集群上进行数据复制,而且系统一旦发现某台服务器宕机,会自动利用其他机器上的数据将这台服务器上存储的数据块自动再备份一份,从而获得更高的数据可靠性。
HDFS配合MapReduce等并行计算框架进行大数据处理时,可以在整个集群上并发读写访问所有的磁盘,无需RAID支持。