为何需要存储系统?
-
想起刚开始学习编程的时候,课后的小作业是在控制台做一个模拟的用户存储系统,但是那个时候的程序一关闭,c存储系统的用户就会消失。为了解决这个问题,后续又学习了
Java的输入输出流,知道如果想存储或者读取数据,至少需要把应有的数据以文件的形式存放到硬盘上。而这个硬盘,就是一整个存储系统的一部分 -
后端入门课中给予了这样一个很生动的例子,小明下载了一个
app,在经过注册之后,数据以json的形式发送到了服务器:
{
"用户名":小明,
"密码":helloworld,
"密码提示问题":coding
}
- 这样的数据自然不能让服务器的内存存储,肯定是要以文件形式存在于服务器上,这也是我们为何能够成为已注册用户,访问自己的相应信息而不怕丢失的原因。
什么是存储系统?
-
百度百科给的解释是:
存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备(硬件)和算法(软件)所组成的系统 -
而字节后端基础课的导师是这样说的:
一个提供了读写,控制类接口,能够安全有效把数据持久化的软件,就可以成为存储系统 -
简而言之,我的概括是:
计算机中支持增删查改的软硬件集合,别看文章的题目是数据库和存储系统,实际上,二者是包含与被包含的关系,数据库是存储系统的一种.
存储系统的那些事儿
系统特点
性能敏感
- 存储系统作为后端软件的底座和最后一道门槛,掌握着上下层交互的关键。在现代大型后端架构中,许多服务都离不开持久化数据的保存和交互。大量的用户带来的是庞大的数据访问量,存储系统必须拥有强大的性能,才能处理如此之大的数据并发。
简繁并具
-
一方面,存储系统对性能的要求及其苛刻,这就意味着在我们
IO的过程中,任何过于复杂的操作都可能会对存取的性能造成巨大的影响,处理业务的代码必须简洁高效,此为”简“ -
另一方面,在
IO或非IO的业务处理过程中,可能会出现各种各样的错误或异常情况,既然存储系统是一个软硬件集合,那么在设计存储系统时就应该考虑到软件和硬件都有可能出现问题。墓碑上的墓志铭尚且会因风吹日晒而导致磨损或腐蚀,更别提现代的高精度硬件。存储系统的设计必须能覆盖可能考虑到的所有异常情况,无论是多复杂的异常,此为”繁“
硬大于软
- 存储系统的软件架构容易受到硬件影响。无论如何,硬件是一切的基石。无论用户层的软件大厦多么辉煌靓丽,没有了硬件作为最基础的地基,一切都是空中楼阁,无稽之谈。当存储结构的硬件发生改变的时候,软件也必须进行相应的改变才能适配,当硬件改变过大时,甚至需要对整个软件架构进行重构,从零开始。
存储器的层级结构
- 如图所示
-
金字塔越往上,硬件价格越昂贵,读写速度越快,容量越小,访问方式越友好 -
一般越频繁访问的数据越放在上层,以增加数据访问效率
-
在第三第四层中间又出现了一个新概念,
Persistent Memory
Persistent Memory
-
简称为PMEM/PM,有时候也称为
Storage clustered memory -
是一项新兴的技术,例子如
Intel的3D XPoint -
这项技术使得产品拥有硬盘和内存的特性
(Storage and Memory Attributes)-
持久化
(Persistent):和硬盘一样能保存数据,断电后数据不丢失 -
基于字节寻址
(Byte addressable):和运存一样寻址以字节为单元,程序可以精准地访问数据
-
-
这项技术使得程序可以直接从处理器访问,不需要像传统硬盘一样把
I/O访问积累到一起进行请求。这就意味着处理器不必花费时间用于处理程序栈,而专注于大部分的时间用于处理媒体文件,这极大地提高了程序的性能。在3D PointX中,这项技术使得媒体和运存总线连接,处理器可以不用任何驱动或者PCIe的额外开销从而直接访问数据,并且由于运存是64字节为单元访问,处理器只用读需要访问的部分数据(精确访问,而硬盘却需要将所有访问积累到较大的块中),这样访问也将延迟降到了极低的水平。 -
如此,相当于在三四层间拥有了更多的一层可以存放数据的空间。PMEM提供了比内存更大的空间,性能却远高于硬盘,不仅如此,甚至还支持精确访问,解决了传统方式因积累访问而需把数据存到页表里,在运存和硬盘之间来回读写而造成的高延迟问题。
数据如何应用到存储介质
- 如图所示
-
无论是哪个层级,缓存都是极其重要的,合理的缓存设计可以提高程序性能。在极其苛刻的情况下(如硬件厂商只提供了每次只读写
1byte的数据接口),软件设计自然不能在每次访问时,都遵循1byte的读写原则(太慢了哥哥),哪怕我们设计成每次读写的缓存有512byte,相较于原来的设计,也是极大的突破。 -
尽量减少数据的
拷贝(copy)过程。拷贝操作十分消耗CPU资源。需要操作的数据量越大,CPU消耗的资源越多,对软件性能的影响也就越大。 -
即使硬件设备五花八门,厂商也要提供抽象统一的接入层,否则软硬件的设备适配将极其复杂。
RAID技术(Redundant Array of Inexpensive Disks)
概述
1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等首次在论文 “A Case of Redundant Array of Inexpensive Disks” 中提出了 RAID 概念 [1] ,即廉价冗余磁盘阵列( Redundant Array of Inexpensive Disks )。由于当时大容量磁盘比较昂贵, RAID 的基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能、可靠性。随着磁盘成本和价格的不断降低, RAID 可以使用大部分的磁盘, “廉价” 已经毫无意义。因此, RAID 咨询委员会( RAID Advisory Board, RAB )决定用 “ 独立 ” 替代 “ 廉价 ” ,于时 RAID 变成了独立磁盘冗余阵列( Redundant Array of Independent Disks )。但这仅仅是名称的变化,实质内容没有改变。
RAID 这种设计思想很快被业界接纳, RAID 技术作为高性能、高可靠的存储技术,已经得到了非常广泛的应用。 RAID 主要利用数据条带、镜像和数据校验技术来获取高性能、可靠性、容错能力和扩展性,根据运用或组合运用这三种技术的策略和架构,可以把 RAID 分为不同的等级,以满足不同数据应用的需求。 D. A. Patterson 等的论文中定义了 RAID1 ~ RAID5 原始 RAID 等级, 1988 年以来又扩展了 RAID0 和 RAID6 。近年来,存储厂商不断推出诸如 RAID7 、 RAID10/01 、 RAID50 、 RAID53 、 RAID100 等 RAID 等级,但这些并无统一的标准。目前业界公认的标准是 RAID0 ~ RAID5 ,除 RAID2 外的四个等级被定为工业标准,而在实际应用领域中使用最多的 RAID 等级是 RAID0 、 RAID1 、 RAID3 、 RAID5 、 RAID6 和 RAID10。
从实现角度看, RAID 主要分为软 RAID、硬 RAID 以及软硬混合 RAID 三种。软 RAID 所有功能均有操作系统和CPU来完成,没有独立的 RAID 控制 / 处理芯片和 I/O 处理芯片,效率自然最低。硬 RAID 配备了专门的 RAID 控制 / 处理芯片和 I/O 处理芯片以及阵列缓冲,不占用 CPU 资源,但成本很高。软硬混合 RAID 具备 RAID 控制 / 处理芯片,但缺乏 I/O 处理芯片,需要 CPU 和驱动程序来完成,性能和成本 在软 RAID 和硬 RAID 之间。
RAID 每一个等级代表一种实现方法和技术,等级之间并无高低之分。在实际应用中,应当根据用户的数据应用特点,综合考虑可用性、性能和成本来选择合适的 RAID 等级,以及具体的实现方式。
出现背景
-
单块大容量
磁盘价格> 多块小容量磁盘 -
单块磁盘写入性能 < 多块磁盘并发写入性能
-
单块磁盘的
容错能力有限,不够安全
RAID 0
- 在N块磁盘上选择合理的带区来创建带区集。原理类似于显示器的隔行扫描,将数据分割成不同条带分散写入到所有的硬盘中同时进行读写,多块磁盘的
并行读写使得同一时间内磁盘读写的速度提升了N倍
-
实际上只是多块硬盘的
简单组合,通过将数据条带化存储,提高了单次读写的磁盘带宽,但这样简单的设计并没有考虑容错 -
优点
-
高性能:数据条带化和并行读写极大提高了性能,提高了数据的传输速度。 -
成本低廉:多个硬盘的简单组合不需要额外的磁盘空间进行冗余备份,相同成本下可以存放更多的数据
-
-
缺点
可靠性不高/没有容错性:不提供冗余备份使得数据的可靠性降低。一旦阵列中任何一个磁盘发生故障,所有的磁盘都无法正常存取数据,造成数据丢失,阵列的可用性也将受到影响。
RAID 1
- 也被称为
磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上。当数据在写入一个磁盘时,也会在另一块闲置磁盘上生成相应的镜像文件,在不影响性能的情况下极大限度地保证了系统的可靠性和可修复性。
-
镜像磁盘的设计,使得真实空间使用率仅为
50%,但极大地提高了容错性 -
优点
-
可靠性强:通过镜像将数据完全复制到多个磁盘上,保护数据免受磁盘故障带来的影响,提高了数据可靠性 -
可用性强:即使其中一个磁盘发生故障,系统仍可以从其它磁盘上读取相同的数据,保证数据的可用性和连续性 -
读取性能高:RAID 1仍然支持并行读取,数据访问速度加快
-
-
缺点
-
成本增加:额外的磁盘存储相同的数据,意味着需要考虑额外的硬件成本 -
写入性能降低:数据需要同时写入多个磁盘,即使并行进行,相较于单个磁盘的写入性能也会下降
-
RAID 0+1
- 望文生义,两种技术的结合体。通过在磁盘镜像中建立带区集,将数据分布在多个盘上,允许数据的快速读写,同时兼具数据的可靠性和可用性。建立一个最简陋的带区集至少应有
4个磁盘
-
优点:
-
高性能:与RAID 0相同的数据条带化和并行读取,提供了较高的数据传输速度 -
数据可靠性高:数据的冗余备份使得数据免受磁盘故障的影响 -
快速的数据恢复:故障的磁盘可以直接从备份磁盘中恢复数据,无需进行复杂计算
-
-
缺点:
-
成本较高:过多的硬件带来了更高的成本 -
空间利用率低:需要进行数据镜像,有效的存储容量仅为所有磁盘的50%
-
其它RAID
- 此处不作讨论