概述
在计算机系统中,常用的存储介质包括寄存器、内存、SSD、磁盘等,寄存器的速写速度与CPU相同,一个时钟周期是0.3纳秒,而内存访问需要120纳秒,寄存器的读写速度比内存要快几百倍,固态硬盘访问需要50~150μs,磁盘访问需要一到十几毫秒,磁盘的读写速度比内存慢了几万倍,网络访问则更慢,需要几十到上百毫秒。
如果把CPU的一个时间周期当作一秒,磁盘访问需要几个月才能完成。
1 ns = 10-9 seconds 1 ms = 10-3 seconds * Assuming ~1GB/sec SSD
磁盘在存储金字塔所处的位置
越是底层存储,容量越大,价格越低,但读写的速度越慢。越是顶端存储,容量越小,价格越高,但性能越好。
从磁盘结构角度理解为何顺序读写比较快?
磁盘的读写速度通常是毫秒级别的
磁盘由很多**盘面(Platter)**组成,我们用运动场的跑道类比,每个盘面上面有很多同心圆磁道,就像运动场里面的跑道一样。
每个磁道(Track)上面又划分了多个扇区(Sector),就像把一个400m的跑道划分成4个100m的跑道。每个扇区大小是相同的,通常是512字节。
很多盘面堆叠在一起组成磁盘,这些到轴心相同半径的磁道组成一个柱面(Cylinder)。
什么是寻道?
磁头通过在不同的柱面上来回移动读写数据,这个过程称为寻道。
读写耗时的计算公式
磁盘读写的耗时等于寻道时间(找到柱面)+旋转时间(找到扇区)+传送时间(包括数据读写时间)
读写影响因素
寻道时间通常为几毫秒,旋转时间是移动到对应的扇区,最长为“1/转速×60×1000”毫秒,通常磁盘转速在每分钟5400~15000转(RPM),传送时间又等于“1/转速×60×1000/每个磁道扇区数”,主要取决于磁盘转速和每个磁道的扇区数。
每次数据读取的速度主要取决于三个方面:寻道时间、磁盘转速和每个磁道扇区数。伴随着磁盘密度不断上升、转速越来越快,寻道时间成为最大的影响因素,所以,为了提高磁盘的读写速度,应该顺序读取,从而降低磁头来回切换的频率。
操作系统为此设计了相关的磁盘调度算法,其中,“电梯调度”是最常用的调度算法。
增加磁盘的容量通常有两种方式
- 增加盘片的尺寸或盘面数量
- 当前磁盘的规格和服务器插槽大小是统一的,调整盘面数(厚度增加)或者改变盘面大小(增加直径)都会导致兼容问题,而且盘面直径增大还会导致磁头的寻道路径加长
- 增加存储的密度
- 提高单位面积的存储容量,这种方案目前比较流行,并且每年保持100%的提升
什么是逻辑块
512个字节的扇区是磁盘的最小管理单元,但这些扇区分布在不同的盘面上,如果每次读写扇区都需要通过柱面(Cylinder)、磁头(Head)、扇区(Sector)三元组去定位数据就太复杂了。所以,集成在存储设备里面的存储控制器抽象了一个简单数据管理单元“逻辑块”,这就是块存储的来历。
什么是LBA?
这些逻辑块通过数组方式暴露给操作系统,每次操作系统需要读取某一个扇区的数据时,发送逻辑块的编号**(LBA,Logical Block Address)**,存储控制器将它翻译成为CHS(柱面、磁头、扇区)三元组,从而读取磁盘的数据。SCSI就是采用了这种寻址方式。
它的优点除了上述的简单管理以外,还能够兼容不同的硬件设备,例如,磁带或网络存储就没有上面的三元组,通过这种抽象能统一管理各种存储。
如果知道了LBA地址,对于磁盘来说,可以使用下面公式获取c柱面、h磁头、s扇区的具体值,其中,H代表磁头数,S代表扇区数:
●#c=#lba/(S*H)
●#h=(#lba/S)%H
●#s=(#lba%S)+1
固态硬盘SSD是闪存技术。目前已经出现了全闪存的存储系统,在未来将有可能取代硬盘,目前主要受限于价格和容量,在当前的数据中心内,还是以磁盘为主。由于SSD采用闪存芯片取代了机械臂移动和盘片旋转,读写速度非常快,普通的SSD读写都在500MB/s以上
什么是raid?
RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列),它的基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使得性能达到甚至超过一个价格昂贵、容量巨大的硬盘。RAID技术提供了一种高性能、高可靠的数据存储技术,通过RAID技术组合多个盘,当数据读写时可以分散到多个磁盘,从而提高读写速度。并且配合校验、纠错技术,当有一个磁盘出现故障后,能恢复数据,从而保证数据的高可靠。
RAID核心技术
条带指将数据拆分成多个子块,分别保存到不同的磁盘中。
例如,1GB的数据可以拆分成5个200MB的数据块,分别存储到5个硬盘上面,这样可以并行写入。
分布式存储和RAID有相同的设计思想
分布式存储和RAID有相同的设计思想:数据拆分存储。通过条带极大地提高了I/O的性能,但也存在明显的单点故障,导致数据丢失。
避免单点故障校验码
校验码原理是通过算法结合数据分块得出校验块,然后将数据块和校验块分布到不同磁盘上面,如果某一个或者多个磁盘损坏,通过数据校验算法逆向生产数据块,常用的算法是海明校验和异或校验。异或校验是通过将一个有效信息与一个给定的初始值进行异或运算,得到校验信息。如果有效信息出现错误,通过校验信息与初始值的异或运算还原之前的有效信息。
raid的分类
RAID等级从RAID0~RAID6七个等级。其中,RAID 0只做条带化,没有数据高可用保障
RAID 1通过镜像技术将数据同时原样写入两个磁盘,保障数据高可靠性;而RAID 5通过校验码的方式保存数据
raid1
RAID 1采用的就是镜像技术,它的写入速度会比较慢,但读取速度会比较快,如图所示。读取速度可以接近所有磁盘吞吐量的总和,写入速度受限于最慢的磁盘,没有校验数据。RAID1由于是数据镜像,所以浪费了一组磁盘,并且写性能不好,而读性能提升了。
raid5
RAID 5是当前最流行的RAID,RAID 5是通过计算数据的校验和,如果图所示数据文件A被拆分成A1、A2、A3三个数据块,通过校验算法计算出校验块Ap,并将这四个数据块保存到四个磁盘上面。无论是哪一个磁盘发生故障,都可以通过逆向生成数据块,从而保障数据的安全,RAID 5可以允许一个磁盘发生故障。
什么是存储总线?
总线是贯穿整个计算机系统的一组电子管道,它负责在各个部件之间传输字节信息,通常是8个字节(64位)。当CPU需要读取存储数据的时候,先通过内存总线从内存中获取数据。如果数据不在内存中,则通过主机I/O总线去获取,于是请求便到了I/O控制器,也就是常说的HBA卡(可能是集成在系统主板上面的,也可能是独立的插槽),例如,iSCSI适配卡,接下来我们能看到存储I/O总线,下面连接着物理存储设备
如果是网络存储设备,则会进入网络适配器,例如网卡,经过网络传输,连接到存储服务器的网络适配器上,然后经过与上面相似的路径写入存储设备
iSCSI协议
SCSI(Small Computer System Interface,小型计算机系统接口)是一种用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)数据传输和通信的协议。SCSI协议已经被广泛应用到很多高端的SAN存储系统中,但成本很高,需要专用的光纤交换机等设备,而大部分机房的建设都是基于相对廉价的以太网交换设备的。随着软件定义存储被推广,使用TCP/IP去承载SCSI协议的方案逐渐成熟,这就是iSCSI协议又被称为IP-SAN的原因
文件系统
分散的数据块不能直接被程序读写,还需要一种更加直观的管理方式。文件系统是一种存储和组织计算机数据的方法,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据,不必关心数据实际保存在硬盘(或者光盘)地址为多少,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的哪个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写到了哪个文件中
整个存储I/O从上到下主要分为:
VFS、Block层、I/O调度层、SCSI驱动层。
其中VFS为了兼容各种文件系统,例如:ext4、xfs、proc等,对上层提供统一的open、write、read等接口。对文件的读写最终都会转化为Block层的数据库的读写,在Block层,可以对多个读写请求进行合并,从而降低读写次数。I/O调度层通过I/O调度算法(电梯算法、NOOP等)控制读取顺序。最终将请求发送到SCSI驱动。如果底层是磁盘设备,那么将会通过控制磁头移动来读写数据。