云计算那些事儿:从IaaS到PaaS进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 存储基础知识拾遗

数据的处理和保存贯穿整个计算机系统发展的历史。数据的存储一直是一个热议话题。在没有云计算之前,数据存储已经发展了很久。世界上第一块硬盘发明于1956年,至今已超过60年,半个多世纪的历史。它由IBM公司制造,世界上第一块硬盘350 RAMAC。盘片直径为24英寸(1英寸:2.54cm),盘片数为50片,重量则是上百公斤,体积相当于两个冰箱,储存容量只有5MB。时至今日,几百克左右的单盘容量已经达到6TB,并且在容量继续增长的情况下,读写速度也在迅速提高,特别是在SSD(固态硬盘)出现之后。大数据信息爆炸时代,存储的容量更是指数级别增长,存储的重要性日益凸显。

4.3.1 存储介质

在计算机系统中,常用的存储介质包括寄存器、内存、SSD、磁盘等,寄存器的速写速度与CPU相同,一个时钟周期是0.3纳秒,而内存访问需要120纳秒,寄存器的读写速度比内存要快几百倍,固态硬盘访问需要50~150μs,磁盘访问需要一到十几毫秒,磁盘的读写速度比内存慢了几万倍,网络访问则更慢,需要几十到上百毫秒。给读者一个感性的认识,如果把CPU的一个时间周期当作一秒,磁盘访问需要几个月才能完成。

CPU运行速度非常快,但存储读取的速度远远落后于CPU,并且程序执行具有局部性特征。计算机系统设计时将数据分层次存储,如图4-2存储金字塔所示。越是底层存储,容量越大,价格越低,但读写的速度越慢。越是顶端存储,容量越小,价格越高,但性能越好。上面的存储通常是下面存储的缓存,把CPU正在使用,或者将要使用的数据缓存起来,例如,当我们播放存储在硬盘上面的2GB视频时,并非是播放到什么位置,临时从硬盘读取数据,而是操作系统会预先把将要解码播放的部分视频预先加载到内存中,通过内存去缓存数据CPU执行所需的数据,从而降低CPU的等待时间和I/O操作次数。

图4-2 存储器的金字塔式层次结构

我们这里主要讨论的存储系统是指底层的本地存储和远程存储。他们的主要存储介质是硬盘和SSD。

磁盘的读写速度通常是毫秒级别的,磁盘由很多盘面(Platter)组成,我们用运动场的跑道类比,每个盘面上面有很多同心圆磁道,就像运动场里面的跑道一样。每个磁道(Track)上面又划分了多个扇区(Sector),就像把一个400m的跑道划分成4个100m的跑道。每个扇区大小是相同的,通常是512字节。磁盘结构示意图存储层次结构如图4-3所示。

图4-3 磁盘结构示意图存储层次结构

而很多盘面堆叠在一起组成磁盘,这些到轴心相同半径的磁道组成一个柱面(Cylinder)。磁头通过在不同的柱面上来回移动读写数据,这个过程称为寻道。磁盘读写的耗时等于寻道时间(找到柱面)+旋转时间(找到扇区)+传送时间(包括数据读写时间)。寻道时间通常为几毫秒,旋转时间是移动到对应的扇区,最长为“1/转速×60×1000”毫秒,通常磁盘转速在每分钟5400~15000转(RPM),传送时间又等于“1/转速×60×1000/每个磁道扇区数”,主要取决于磁盘转速和每个磁道的扇区数。综合来看,每次数据读取的速度主要取决于三个方面:寻道时间、磁盘转速和每个磁道扇区数。伴随着磁盘密度不断上升、转速越来越快,寻道时间成为最大的影响因素,所以,为了提高磁盘的读写速度,应该顺序读取,从而降低磁头来回切换的频率。操作系统为此设计了相关的磁盘调度算法,其中,“电梯调度”是最常用的调度算法。

通过上面的分析,增加磁盘的容量通常有两种方式。一种是增加盘片的尺寸或盘面数量,这个很好理解。把磁道数增加或者层次变多,存储容量自然上去了,但这存在很多问题。第一是当前磁盘的规格和服务器插槽大小是统一的,调整盘面数(厚度增加)或者改变盘面大小(增加直径)都会导致兼容问题,而且盘面直径增大还会导致磁头的寻道路径加长;另一种方案是增加存储的密度,提高单位面积的存储容量,这种方案目前比较流行,并且每年保持100%的提升。

512个字节的扇区是磁盘的最小管理单元,但这些扇区分布在不同的盘面上,如果每次读写扇区都需要通过柱面(Cylinder)、磁头(Head)、扇区(Sector)三元组去定位数据就太复杂了。所以,集成在存储设备里面的存储控制器抽象了一个简单数据管理单元“逻辑块”,这就是块存储的来历。这些逻辑块通过数组方式暴露给操作系统,每次操作系统需要读取某一个扇区的数据时,发送逻辑块的编号(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以上。

4.3.2 RAID

RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列),它的基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使得性能达到甚至超过一个价格昂贵、容量巨大的硬盘。RAID技术提供了一种高性能、高可靠的数据存储技术,通过RAID技术组合多个盘,当数据读写时可以分散到多个磁盘,从而提高读写速度。并且配合校验、纠错技术,当有一个磁盘出现故障后,能恢复数据,从而保证数据的高可靠。

RAID核心技术是条带,所谓的条带指将数据拆分成多个子块,分别保存到不同的磁盘中。例如,1GB的数据可以拆分成5个200MB的数据块,分别存储到5个硬盘上面,这样可以并行写入。分布式存储和RAID有相同的设计思想:数据拆分存储。通过条带极大地提高了I/O的性能,但也存在明显的单点故障,导致数据丢失。所以RAID还需要借助另一个技术:校验码。校验码原理是通过算法结合数据分块得出校验块,然后将数据块和校验块分布到不同磁盘上面,如果某一个或者多个磁盘损坏,通过数据校验算法逆向生产数据块,常用的算法是海明校验和异或校验。异或校验是通过将一个有效信息与一个给定的初始值进行异或运算,得到校验信息。如果有效信息出现错误,通过校验信息与初始值的异或运算还原之前的有效信息。

RAID等级从RAID0~RAID6七个等级。其中,RAID 0只做条带化,没有数据高可用保障;RAID 1通过镜像技术将数据同时原样写入两个磁盘,保障数据高可靠性;而RAID 5通过校验码的方式保存数据。当然,还可以组合(如RAID10等),下面详细介绍一下常用的RAID 1和RAID5。

RAID 1采用的就是镜像技术,它的写入速度会比较慢,但读取速度会比较快,如图4-4所示。读取速度可以接近所有磁盘吞吐量的总和,写入速度受限于最慢的磁盘,没有校验数据。RAID1由于是数据镜像,所以浪费了一组磁盘,并且写性能不好,而读性能提升了。

图4-4 RAID1

RAID 5是当前最流行的RAID,RAID 5是通过计算数据的校验和,如果图4-5所示数据文件A被拆分成A1、A2、A3三个数据块,通过校验算法计算出校验块Ap,并将这四个数据块保存到四个磁盘上面。无论是哪一个磁盘发生故障,都可以通过逆向生成数据块,从而保障数据的安全,RAID 5可以允许一个磁盘发生故障。

图4-5 RAID5

4.3.3 存储总线

总线是贯穿整个计算机系统的一组电子管道,它负责在各个部件之间传输字节信息,通常是8个字节(64位)。当CPU需要读取存储数据的时候,先通过内存总线从内存中获取数据。如果数据不在内存中,则通过主机I/O总线去获取,于是请求便到了I/O控制器,也就是常说的HBA卡(可能是集成在系统主板上面的,也可能是独立的插槽),例如,iSCSI适配卡,接下来我们能看到存储I/O总线,下面连接着物理存储设备,整体如图4-6所示。如果是网络存储设备,则会进入网络适配器,例如网卡,经过网络传输,连接到存储服务器的网络适配器上,然后经过与上面相似的路径写入存储设备,如图4-7所示。

图4-6 存储总线结构示意图

图4-7 网络存储设备结构示意图

4.3.4 iSCSI协议

在介绍iSCSI协议之前需要先了解SCSI协议,SCSI(Small Computer System Interface,小型计算机系统接口)是一种用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)数据传输和通信的协议。SCSI协议已经被广泛应用到很多高端的SAN存储系统中,但成本很高,需要专用的光纤交换机等设备,而大部分机房的建设都是基于相对廉价的以太网交换设备的。随着软件定义存储被推广,使用TCP/IP去承载SCSI协议的方案逐渐成熟,这就是iSCSI协议又被称为IP-SAN的原因,如图4-8所示。

图4-8 iSCSI协议

通过iSCSI协议在主机之间建立TCP连接传输数据,默认是3260端口。通过TCP/IP传输iSCSI协议。

实战操作

在两台CentOS7虚拟机上面通过iSCSI挂载一个存储块。

●创建文件块,代码如下所示。

●创建target,代码如下所示。

上面的命令会自动生成一串唯一的IQN(iSCSI Qualified Name),用户可以自己定义符合规范的IQN。

●开放权限。

权限设置分为两个部分,第一是export挂载IP,通过/iscsi/iqn.20.../tpg1/portals>create 10.10.10.10(如果设置0.0.0.0则表示开放所有IP)设置。第二是设置acls权限,需要将被挂载机器的initiator name(通过cat/etc/iscsi/initiatorname.iscsi获取)配置到acls中(acls>create initiator name)。如果不设置,则可以通过以下命令跳过。

●分配LUN。

通过上面的操作,target端已经完成配置,需要注意上面所有的操作都必须在指定的目录下才能生效。

●客户端挂载。

下面将介绍客户端如何挂载,先通过discovery命令。

执行login登录(挂载)。

检查挂载效果。

可以看到主机上面多了一块硬盘sdb,可以通过fdisk查看具体大小。

对于挂载磁盘的主机来说,不需要区分这个磁盘到底是本地磁盘还是远程挂载的磁盘,使用方法与上面完全相同。

4.3.5 文件系统

分散的数据块不能直接被程序读写,还需要一种更加直观的管理方式。文件系统是一种存储和组织计算机数据的方法,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据,不必关心数据实际保存在硬盘(或者光盘)地址为多少,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的哪个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写到了哪个文件中。图4-9是Linux存储内部架构图。

图4-9 Linux存储内部架构图

整个存储I/O从上到下主要分为:VFS、Block层、I/O调度层、SCSI驱动层。其中VFS为了兼容各种文件系统,例如:ext4、xfs、proc等,对上层提供统一的open、write、read等接口。对文件的读写最终都会转化为Block层的数据库的读写,在Block层,可以对多个读写请求进行合并,从而降低读写次数。I/O调度层通过I/O调度算法(电梯算法、NOOP等)控制读取顺序。最终将请求发送到SCSI驱动。如果底层是磁盘设备,那么将会通过控制磁头移动来读写数据。