1.物理存储介质介绍
当前计算机系统会根据访问速度,介质成本,介质可靠性等,搭配多种不同的存储介质,有代表性的可用存储介质包括。
- 高速缓存(cache)
- 主存(main memory)
- 闪存(flash memory)
- 磁盘存储器(magnetic-disk storage)
- 光学存储器(optical storage)
- 磁带存储器(tape storage)
- 下图是一个存储设备的层次结构,从上往下,访问速度变慢·,价格变低。主存往上的存储系统都是易失的,主存往下的存储系统都是非易失的
2.存储器接口
磁盘以及基于闪存的固态硬盘都通过高速互连连接到计算机系统,磁盘通常支持串行ATA(Serial ATA,SATA)接口或者串行连接的SCSI(Serial Attached SCSI,SAS
)。SAS接口通常仅在服务器中使用。
非易失性存储器标准(Non-Volatile Memory Express,NVMe
)接口是为了更好地支持SSD而开发的逻辑接口标准,通常与PCIe接口一起使用(PCIe接口提供计算机系统内部的高速数据传输)
而磁盘通常可以通过电缆直接连接计算机系统的磁盘接口,它们也可以被远程放置并通过高速网络连接到计算机。在存储区域网(Storage Area Network,SAN
)体系结构中,大量的磁盘通过高速网络与许多服务器机相连。
通常采用一种叫做独立磁盘冗余阵列(Redundant Arrays of Independent Disks,RAID
)的存储组织技术来对磁盘进行本地组织,以便磁盘提供非常大而且非常可靠的磁盘的逻辑视图。
在存储区域网中使用的互联技术包括iSCSI
,它允许在IP网络上发送SCSI命令;光纤通道(Fiber Channel,FC)以及InfiniBand
.
附网存储(Network Attach Storage,NAS
)是SAN的一种替代方案,它使用NFS或CIFS那样的网络文件协议来提供文件系统接口,而不是看似一张大磁盘的网络存储。
云存储近年也在增长,但他延迟较高,不适合数据库底层存储。
3.磁盘
磁盘(Hard Disk Dirver,HDD
)提供了现代计算机系统的大部分存储,SDD近年来逐渐也成为其对手,其性能更好,但由于成本高,还不是主流。
3.1 磁盘的物理特性
下图是磁盘示意图,其盘面(platter)两面均用来记录信息。盘面按同心圆划分了磁道(track),磁道被划分为扇区(sector).内侧磁道更短,拥有的扇区数更少。盘面上方的读写头可以将内容磁化存储到扇区上。一张磁盘上往往有多个磁盘,它们通过转轴连接,而它们对应的读写头固定在磁盘臂上。磁盘和读写头被合称为磁头-磁盘装置,因为所有盘面上的读写头是一起移动的,所以它们在同一时刻会在同一个磁道i上,所有第i条磁道合在一起被称为一个柱面。
下图展示了磁盘实际的内部结构。
为了增加记录密度,读写头会离盘面很近,可能出现读写头接触到盘面从而刮损磁盘的情况。读写头刮掉的介质会在空气中飘浮并且散落到其他盘面和读写头之间,引起更多的损坏。
磁盘控制器是磁盘与计算机系统之间的接口。他会根据高层次的读写命令来控制磁盘读写的物理操作。校验和用于检验读写的准确性。
磁盘控制器的另外一个作用是坏扇区的重映射。如果某扇区被检测到已损坏,会将其在逻辑上重新映射到为重映射预留的扇区,写操作将在新的位置上执行。
3.2 磁盘的性能度量
磁盘的性能度量指标主要是容量、访问时间、数据传输率和可靠性。
- 访问时间。从发出读写命令到数据开始传输的时间。其中为了访问磁盘臂必须先移动到正确的磁道上,然后再等待磁盘旋转,直到指定的扇区出现在它下方。
- 寻道时间。磁盘臂重定位的时间称为寻道时间。平均寻道时间,一般为最坏寻道时间的1/3,2~20ms。
- 延迟时间。等待磁盘旋转,直到指定的扇区出现在它下方的时间。平均延长时间一般为磁盘旋转一整周时间的一半。
- 数据传输率。此磁盘获取数据或从磁盘读取数据的速率。内侧磁道数据传输率低,因为它扇区少。
- 每秒I/O次数(I/O Operation per Second).磁盘I/O请求的时需要指定引用的磁盘地址,这个地址称为块号,磁盘块是存储分配和检索的逻辑单元,又被称为页面。访问页面的方式分为随机访问和顺序访问,顺序访问时访问的磁盘块块号相连,因此不需要寻道或者只需要在附近磁道寻道,IOPS较小。
- 平均故障时间(Mean Time Tp Failure,MTTF),这是磁盘稳定性的重要指标,是指磁盘可用的平均时间。
4.闪存
有两种闪存:NAND
和NOR
.
NAND闪存读取的单位是一页,其页大小类似于磁盘中的扇区。固态磁盘SSD是由NAND构建的,提供与磁盘类似的面向块的接口,其速度比磁盘快的多,功耗也更低。
闪存不能够直接重写,需要先擦除再重写。其操作单元必须以组为单位,通常一组为128-256个页,而且擦除次数是有限制的,通常为100 000到1 000 000 次。
为了避免擦除时间对更新数据的效率影响,闪存提供逻辑页面到物理页面的映射,映射关系记录到内存的转换表中。这样当一个数据被更新时,可以将其映射到一个已经被擦除的任何物理页,原来的位置则随时可以再擦除。
包含多个删除页的块将定期被删除,其中没有被删除的也将复制到不同的块。由于每个物理页只能够被擦除固定的次数,被擦除多次的物理页将被存储冷数据(不用频繁更新的数据),未被擦除多次的物理页则被存储热数据,这由闪存控制器进行控制,被称为损耗均衡(wear leveling)。
所有以上操作基于闪存转换层完成。
新型内存SCM(Storage Class Memory)的性能、成本位于主存闪存之间
作为新型内存的SCM,具有如下几个突出特点:
1、非易失
2、极短的存取时间(DRAM-like)
3、每比特价格低廉(Disk-like)
4、固态,无移动区(SSD-like)
基于以上特点,SCM势必成为大数据时代炙手可热的重要内存产品。
混合硬盘驱动器是指将磁盘和少量闪存结合起来的硬盘系统,他被用在频繁访问数据的缓存。
现代NAS和SAN系统支持磁盘和SSD组合使用,并且可以把SSD用作驻留在磁盘上的数据缓存。
5.RAID
数据存储的需求增长太快,以至于需要大量磁盘存储应用的数据。独立磁盘冗余阵列(Redundant Array of Indepent Disk,RAID)等磁盘组织技术设计来在磁盘上并行执行读、写操作提升效率,它还使磁盘更易于管理和更可靠。
5.1 通过冗余提高可靠性——数据镜像
一张磁盘发生故障的可能性可能不高,但是N张磁盘组成的集合这个几率就会提升,引入冗余是避免数据丢失的好办法。
最简单的方法是镜像(mirroring或shadowing),即一张逻辑磁盘由两张物理磁盘存储。第一张读不出,读第二张。这个期间还可以修复损坏的磁盘。
除非第二张磁盘也被损坏,你的数据是安全的,这概率看上去很低。
电源故障可能导致数据不一致的情况,即使有磁盘镜像,如果他们是同时写数据的,在磁盘没写完时出现电源故障,他们仍然会出现数据不一致。其解决方案是,先写一个拷贝,再写另一个拷贝。这样即使掉电,总有一个拷贝是一致的数据。在供电恢复的时候再采取其他动作从不完全的写操作中恢复。
5.2 通过并行提高性能——数据拆分
对磁盘镜像。我们同时并行读两个磁盘单位时间内读操作的数目可以翻倍。
翻一倍太少了,我们还可以通过多张磁盘对数据进行数据拆分(striping data),又被称为数据条带,其最简单的方式是将跨多张磁盘将每个字节按比特分开存储,这被称为比特级拆分(bit-level striping)。比如我们有八张磁盘,将每个字节的第i个比特存储在第i张磁盘,读的效率可以变八倍。
块级拆分是将块拆分到多张磁盘,这样可以大型数据可以拆分到多个磁盘,并行的在多个磁盘读取n个块的数据,提高速度。读取单个块时,数据传输率与在一张磁盘一样,但是剩下的n-1张磁盘也可以干别的事情。
实际上生产中运用的都是块级拆分。并行可以提升数据读取的吞吐量和响应速度。
5.3 数据校验
镜像具有高安全性、高读性能,但冗余开销太昂贵。数据条带通过并发性来大幅提高性能,然而对数据安全性、可靠性未作考虑。数据校验是一种冗余技术,它用校验数据来提供数据的安全,可以检测数据错误,并在能力允许的前提下进行数据重构。相对镜像,数据校验大幅缩减了冗余开销,用较小的代价换取了极佳的数据完整性和可靠性。数据条带技术提供高性能,数据校验提供数据安全性, RAID 不同等级往往同时结合使用这两种技术。
采用数据校验时, RAID 要在写入数据同时进行校验计算,并将得到的校验数据存储在 RAID 成员磁盘中。校验数据可以集中保存在某个磁盘或分散存储在多个不同磁盘中,甚至校验数据也可以分块,不同 RAID 等级实现各不相同。当其中一部分数据出错时,就可以对剩余数据和校验数据进行反校验计算重建丢失的数据。校验技术相对于镜像技术的优势在于节省大量开销,但由于每次数据读写都要进行大量的校验运算,对计算机的运算速度要求很高,必须使用硬件 RAID 控制器。在数据重建恢复方面,检验技术比镜像技术复杂得多且慢得多。
奇偶校验基本上是最简单的校验。其原理是这样的,稍微看下就能懂吧。对计算机来说,他是通过异或运算进行奇偶校验的。
但上述都是我们人类对于奇偶的计数统计,对于计算机只需要对所有信息位进行异或操作就可以实现求偶校验位和进行偶校验
如对于1001101的求偶校验位:
所有位的依次异或得到0,故1001101的偶校验位为0
对01001101进行偶校验,若结果为1说明出错
01001101的异或结果为0,故没错
海明校验码是由理查德.海明提出的,不仅能检测错误,还能给出错误位置并自动纠正。海明校验的基本思想是:将有效信息按照某种规律分成若干组,对每一个组作奇偶测试并安排一个校验位,从而能提供多位检错信息,以定位错误点并纠正。可见海明校验实质上是一种多重奇偶校验。异或校验通过异或逻辑运算产生,将一个有效信息与一个给定的初始值进行异或运算,会得到校验信息。如果有效信息出现错误,通过校验信息与初始值的异或运算能还原正确的有效信息。
5.4 RAID级别
5.4.1.RAID0
RAID0 是一种简单的、无数据校验的数据条带化技术。实际上不是一种真正的 RAID ,因为它并不提供任何形式的冗余策略。 RAID0 将所在磁盘条带化后组成大容量的存储空间(如下图 所示),将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作,总线带宽得到充分利用。再加上不需要进行数据校验,RAID0 的性能在所有 RAID 等级中是最高的。理论上讲,一个由 n 块磁盘组成的 RAID0 ,它的读写性能是单个磁盘性能的 n 倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。
RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。 因此, RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等。
5.4.2.RAID1
RAID1 称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50% 。 RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作。工作原理如下图所示。
RAID1 与 RAID0 刚好相反,是为了增强数据安全性使两块 磁盘数据呈现完全镜像,从而达到安全性好、技术简单、管理方便。 RAID1 拥有完全容错的能力,但实现成本高。 RAID1 应用于对顺序读写性能要求高以及对数据保护极为重视的应用,如对邮件系统的数据保护。
一些产商使用RAID1表示不带拆分的镜像,RAID1+0或者RAID10级表示待拆分的镜像
5.4.3.RAID5
RAID5 应该是目前最常见的 RAID 等级,数据和奇偶校验都被划分到n+1个磁盘中(如下图)。
检验数据做奇偶校验(通过异或运算),它没有采用专门的校验磁盘,而是将其分布在各个磁盘之间(如下图)。对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。
RAID5的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。为了便于理解,我们举一个简单的例子。比如我们5块磁盘组成的RAID5,其中4块数据盘,一块校验盘。假设里面存储的数据非常简单,分别是0和1,具体如图3所示。假设一块磁盘坏了(红色),那么我们可以通过剩下的磁盘中的数据经过异或运算得到故障磁盘的数据(具体如何运算大家自己思考一下)。
如果对RAID 5的算法或原理感兴趣,推荐阅读:从原理到实现,RAID5原理详解及代码实现浅析
与其他 RAID 等级一样,重建数据时, RAID5 的性能会受到较大的影响。
RAID5 兼顾存储性能、数据安全和存储成本等各方面因素,它可以理解为 RAID0 和 RAID1 的折中方案,是目前综合性能最佳的数据保护解决方案。 RAID5 基本上可以满足大部分的存储应用需求,数据中心大多采用它作为应用数据的保护方案。
5.4.4.RAID6
前面所述的各个 RAID 等级都只能保护因单个磁盘失效而造成的数据丢失。如果两个磁盘同时发生故障,数据将无法恢复。 RAID6 (如下图 )引入双重校验的概念,它可以保护阵列中同时出现两个磁盘失效时,阵列仍能够继续工作,不会发生数据丢失。 RAID6 等级是在 RAID5 的基础上为了进一步增强数据保护而设计的一种 RAID 方式,它可以看作是一种扩展的 RAID5 等级。
RAID6 不仅要支持数据的恢复,还要支持校验数据的恢复,因此实现代价很高,控制器的设计也比其他等级更复杂、更昂贵。 RAID6 思想最常见的实现方式是采用两个独立的校验算法,假设称为 P 和 Q ,校验数据可以分别存储在两个不同的校验盘上,或者分散存储在所有成员磁盘中。当两个磁盘同时失效时,即可通过求解两元方程来重建两个磁盘上的数据。
RAID6 具有快速的读取性能、更高的容错能力。但是,它的成本要高于 RAID5 许多,写性能也较差,并有设计和实施非常复杂。因此, RAID6 很少得到实际应用,主要用于对数据安全等级要求非常高的场合。它一般是替代 RAID10 方案的经济性选择。
想要连接RAID等级的知识,参考博客:RAID技术全解图解-RAID0、RAID1、RAID5、RAID100
5.5 硬件问题
RAID可以只在软件层面实现,即软件RAID,但是使用硬件支持也会有其优势,即硬件RAID。
硬件RAID可以记住非易失性RAM在执行写操作之前记录他们。在电源故障时,即可轻松完成数据恢复。
比如Write Hole问题。Write Hole是一种非常形象的描述。对于一个采用条带内部通过校验数据进行数据保护的系统,当应用程序正在更新条带内部数据的时候,如果系统突然断电,条带数据无法正常更新完成,那么此时就会出现条带中的数据部分更新完成。在这种情况下,当系统重启之后,条带中的数据是不完整的,校验数据和条带中的有效数据无法匹配上,条带处于数据不一致的情况。这种问题就被称之为Write Hole问题,如下图所示:
采用NVRAM的这种方法是比较完美的Write Hole解决之道。对于硬RAID,往往采用热备电池或者超级电容的方式保护RAID卡上的内存,起到的就是这个作用。所以,和软RAID相比,硬RAID在这一点上会更胜一筹。在软RAID中,可以在系统中使用PCIe NVRAM或者NVDIMM来实现RAID的非易失数据缓存。通常在存储系统中,软RAID会和文件系统、上层的应用系统进行配合,因此,NVRAM也会和文件系统进行共享,从而解决掉Write Hole的问题。EMC的很多存储系统就会采用非易失内存NVRAM,让文件系统与RAID进行配合,避免RAID处于Write Hole的状态。
如果通过软件来检测电源故障之前可能已经部分写入的块,需要花很多时间用于校验扫描。
推荐阅读:你知道RAID中的Write Hole问题吗?
即使所有的写操作都正确完成,也有很小的概率某个扇区在某个时刻变得不可读,这种数据丢失的情况被称为潜在故障(latent failure)或位腐(bit bot).发现即使可以对这些磁盘修复,否则数据将被丢失。
为了避免这种情况,良好的RAID控制器将进行擦洗。即在空闲时间对扇区扫描,发现坏的扇区,通过前文提到的映射方式恢复磁盘。
服务器硬件通常允许被设计成热交换,即在不关机情况下更换磁盘。RAID控制器可以检测到一张新磁盘,立即进行旧磁盘上的数据重建,并将这些数据写入新磁盘。
许多RAID会给阵列分配备用磁盘,检测到坏盘后进行替换。
好的RAID系统会提供多个冗余电源,避免单个部件的损坏影响RAID系统工作。
5.6 RAID级别选择
选择指标有:
经济成本
每秒I/O操作数量
故障时性能
重建性能
下表给出了主流 RAID 等级技术对比
RAID0被用于高性能轻安全的应用程序。RAID1提供了最佳写入性能,在日志文件存储系统中很受欢迎,而且对于高随机I/O和中等存储需求,RAID1也是首选。RAID5具有更低的存储开销,但是其写入性能低于RAID1.对于经常读数据而很少写数据的系统,RAID5是首选。RAID6提供了高可靠性,被用于数据安全性很高的应用。
5.7 其他的RAID应用
RAID的概念已经被推广到其他存储设备,比如SSD中的闪存设备、磁带阵列,甚至还有无线系统上的广播。
6.磁盘块访问
查询需要对磁盘进行I/O操作。前面已经提及过随机访问需要在寻道上花很多额外的时间。因此要减少磁盘随机访问。SSD的随机访问会快很多,因此其受随机访问影响较小。但下面的技术仍然对二者都有好处。
缓冲。从磁盘读取的块暂时缓冲在内存缓冲池,以满足将来的需求。
预读。当磁盘块被访问时,相同磁道的连续块也读入内存缓冲池,但这对随机访问不是很有用。
调度。对请求进行重排序以提高性能,通过磁盘臂调度,选择最佳的磁盘臂移动策略,通常会使用电梯算法。
文件组织。如果我们预计一个文件将被顺序访问,理想情况下应连续存储在相邻柱面。对大型文件,操作系统一次性会将一个区分配给文件,对文件的访问需要在每个区上寻道一次,足够大的区可以将寻道成本降到最低。数据可能出现碎片化,也就是说它的块散布在磁盘上。一些系统提供工具,通过扫描磁盘整理碎片对性能提升非常显著。
非易失性写缓冲区。避免电源故障丢失数据。适用于更新密集型数据库,如事务型数据库。