简介在工程架构领域里,存储是一个非常重要的方向,这个方向从底至上,我分成了如下几个层次来介绍:
主板结构在进入对硬件层的分析前,让我们来看看电脑主板上各个原件之间的关系。 上图展示了主板上主要元件的结构图,以及他们之间的总线连接情况。核心连接点是北桥和南桥两块芯片。 其中北桥比较吊,连接的都是些高速设备。一般来说只连接CPU,内存和显卡几种设备。不过近些年也出现了PCIE2.0的高速接口接入北桥,使得一些符合标准的设备就可以接入北桥。 而南桥就相对搓了,他负责接入所有低速设备。什么USB,鼠标,磁盘,声卡等等都是接在南桥上的。而不同的设备用途和协议都有很大不同,所以设计了不同的交互协议。由于历史原因,不同设备传输介质可能都不一样,导致总线上布线十分复杂。所以到目前为止,主流设备都已经统一成为了PCI总线,大家一起用这条总线。 读写过程我们来模拟一下CPU要从磁盘读入一份数据的过程:
写操作的过程是类似的,就不累述了。 上面我们只是讲解了在主板上数据流转的过程,但是还有一个黑盒,就是磁盘控制器。这哥们到底是怎么管理的各个磁盘呢?在下一节我们将为你描述。 存储介质原理上面讲了计算机读取数据的过程。这一章我们来大概说一下常见的存储介质的存储原理。 磁带 磁带就跟小时候听歌的时候的磁带类似。一条黑色带子上面有很多小的磁性粒子,根据粒子的南北级来判定0/1。 软盘 软盘比磁带要先进一点,记录数据的原理是一样的,只是可以随机读取,而磁带只能顺序读取。 硬盘 硬件原理 如果说前两个都是古老的东西,技术含量一般的话。硬盘就是一个很有技术含量的存储设备了,主要包含三大设备:
基本概念 硬盘组成原理图如下: 如上图, 硬盘主要有如下几个概念(概念比较简单,就不解释了):
读写过程 读写过程得分成两头来说,一头说将数据从各个盘面中读取出来;一头说如何将数据送给计算机。
ssd 硬件原理 ssd是近些年才火起来的存储介质。ssd一般有两种,一种利用flash闪存为芯片,另一种直接用内存(DRAM)作为存储介质,只是在里面加了个电池,在断电以后还能继续用电池来维持数据。 我们本文中讲的ssd全部是都指代前者,即用flash闪存做存储介质。先来看一下ssd的存储原理。 在磁盘中0/1的表示是用的磁粉的南北极的信息,在闪存中则用的是电子信号。他利用的是一种叫浮动门场效应晶体管作为基本存储介质。在该晶体管里面,主要是由两个门电路构成:控制门和浮动门。在两个门之间有一堆电子。当控制门加上一个电势的时候,电子就往浮动门那边跑,然后控制门断开电势,电子会储存在浮动门那边(靠中间的二氧化硅绝缘层),则代表二进制中的0;控制门加一个反向电势的时候,电子跑回到控制门这边,浮动门那边没电子,代表二进制中的1。这样就通过检测浮动门那边的电势就能得到0或者1。而且现在有的ssd制造商,根据不同的电势,将一个晶体管表示的值从0/1拓展到0/1/2/3。这样就使得存储容量翻倍。这种类型的晶体管叫MLC(Multi Level Cell),相对,只表示0/1的叫SLC(Single Level Cell)。不过一般而言,MLC的出错率也高很多,所以目前市面上主流产品还是SLC的。 了解了ssd的基本原理之后,我们来看看ssd是怎么组织这些晶体管的。看如下几个概念:
Block的组织,见下图: 如图,可以看到block中的晶体管是按照井字型组织的。一横排就代表一个Page,所以一个Block一般就有128行,4K*8列。当然,由于还需要针对每个Page加一些纠错数据,所以一般还会多一些列。 横排是控制线,负责给电压,来做充电放电的作用;竖排是读取线,负责读浮动门里的电势之用。 读写过程 读取的过程是这样的: 假设要读取第三行数据,那么会给第三行控制线的电势置位0,其他127行控制线都会给一个电势,这样就能保证再竖排的读取线上只读到第三行的数据,而读不到其他数据。可以看到ssd再读取数据的时候不再需要寻道这些复杂的事情,速度会比传统的磁盘块很多。 而ssd写入就比较麻烦了,因为ssd无法再一个block内对部分cell充电,对部分cell放电,这样信号会相互干扰从而造成不可预期的情况发生。那ssd怎么处理这个问题呢,那就暴力了,把一个block的数据全部读到ssd自带的内存当中,并做好修改,接下来把整个block全部放电,即擦除所有数据,最后再将内存中整个block写回。可以看到,即使是只修改一个bit的数据,也需要大动干戈,倒腾4K*128这么多数据,所以ssd写数据的代价是很大的。但是瘦死的骆驼比马大,比起机械硬盘,还是要快好几个数量级的。 而且,ssd还有一个很头疼的问题,就是随着充放电次数的增加,中间的二氧化硅绝缘层绝缘效果会逐步降低,当降低到一定程度之后浮动门保存不住电子了的话,这个晶体管就算废了。所以单个晶体管还有擦写次数寿命,目前主流的晶体管这个上限大概是10万的数量级。而MLC的更差,只有1万次左右。 那么针对如上两个问题,ssd目前一般都有哪些解决方案来应对呢?
常见存储介质性能数字 最后我们来对比一下目前主流的硬盘和ssd的参数,这是笔者在工作中测试得到的数据,测试数据为各种存储介质在4K大小下的随机/顺序 读/写数据,数字做了模糊化处理,保留了数量级信息,大家看个大概,心里有数即可: | 测试项\磁盘类型 | SATA | SAS | SSD | | 顺序读(MB/s) | 400 | 350 | 500 | | 顺序写(MB/s) | 200 | 300 | 400 | | 随机读(IOPS) | 700 | 1300 | 7w | | 随机写(IOPS) | 400 | 800 | 3w | 硬盘组合 上面一节中,我们了解了单个磁盘的存储原理和读写过程。在实际生产环境中,单个磁盘能提供的容量和性能还是有限,我们就需要利用一些组合技术将多个磁盘组合起来提供更好的服务。 这一节,我们主要介绍各种磁盘组合技术。首先,我们会看一下最基本的组合技术RAID系列技术;然后,我们在看一下更大规模的集成技术SAN和NAS。 RAID RAID技术是上个世纪80年代提出来的。
目前用得比较多的就是Raid5和Raid1。 Raid的实现方式一般有两种:软Raid和硬Raid。软Raid是指操作系统通过软件的方式,对下封装SCSI/SATA接口的硬盘操作,对上提供虚拟硬盘的接口,中间实现Raid对应逻辑;硬Raid就是一个再普通的SCSI/SATA卡上加了一块芯片,里面执行可以执行Raid对应的逻辑。 现在一般的Raid实现方案都是硬Raid,因为软Raid有如下两个确定:
现在Raid卡一般都比较高级,可以针对插在上面的多块磁盘做多重Raid。比如这三块磁盘做Raid5,另外两块做Raid1。然后对操作系统提供两块『逻辑盘』。这里的逻辑盘对操作系统而言就是一块磁盘,但实际底层可能是多块磁盘。 逻辑盘不一定要占据整块独立的磁盘,同样RAID的几块盘也可以做成多块逻辑盘。假设有三块磁盘做成了Raid5,假设一共有200G空间,也可以从中在划分成两块,每块100G,相当于用户就看到了两块100G的磁盘。不过一般逻辑盘不会跨Raid实现。倒不是不能做,而是没需求,而且对上层造成不一致的印象:这磁盘怎么忽快忽慢的呀。 这个逻辑盘还有一个英语名字:LUN(Logic Unit Number),现在存储系统一般把硬件虚拟出来的盘叫『LUN』,软件虚拟出来的盘叫『卷』。LUN这个名词原本是SCSI协议专属的,SCSI协议规定一条总线最多只能接16个设备(主机或者磁盘),在大型存储系统中,可能有成千上万个设备,肯定是不够的,所以发明了一个新的地址标注方法,叫LUN,通过SCSI_ID+LUN_ID来寻址磁盘。后来这个概念逐步发展成为所有硬件虚拟磁盘了。 操作系统看到逻辑盘之后,一般还要再做一次封装。逻辑盘始终都还是硬件层在做的事情,硬件层实现的特点就是效率高,但是不灵活,比如逻辑盘定好了100G就是100G,空间用光了想要调整为150G就只有干瞪眼了,实现成本很高。为了达到灵活性的目的,所以操作系统还要再做一层封装『卷管理』。这层卷管理就是把逻辑盘在软件层再拆分合并一下,组成新的操作系统真正看到的'磁盘'。 最后操作系统再在这些卷上面去做一些分区,并在分区上安装操作系统等工作。 磁盘独立闹革命 上面都是讲的单台机器内部的磁盘组织方式,而单台机器所提供的存储空间是有限的,毕竟机器大小空间是有限的,只能放得下那么几块盘。在一般的2U的机器里面能放得下20块盘就算是很不错的了。在实际工业需求中,对于一些大型应用来说,肯定是远远不够的。而工业界采用的方案就是:堆磁盘,单台机器装不下这么多磁盘就单独拿一个大箱子来装磁盘,再通过专线接到电脑接口上。 当然,在近些年又发展起来了一块新的技术领域大数据存储的市场——分布式存储。分布式存储价格便宜,但是性能较低,占据了不少不需要太高性能和查询语义不复杂的市场。分布式存储我们后面再谈,现在先看看堆磁盘这条路。 当磁盘多了之后,人们发现,磁盘容量是上去了,但是传输速度还是上不去。默认SCSI的导线传输机制有如下几个限制:
于是SCSI在一些企业级应用市场开始遭到嫌弃,于是人们就寻求别的硬件解决方案,人们找到了:FC网络。 FC网络是上个世纪80年代研究网络的一帮人搞出来的网络交互方式,跟以太网是同类产品,有自己完整的一套OSI协议体系(从物理链路层到传输层以及应用层)。他就是以太网的高富帅版本,价格更贵,性能更高。而当时FC网络也主要是为了高速骨干网设计的,人家都没想到这东西还在存储系统领域里面大放异彩。 这里提一下,FC中的F是Fibre,而不是Fiber。前者是网络的意思,而不是光线。虽然一般FC网络都采用光纤作为传输介质,但是其主要定义并不只是光纤,而是一整套网络协议。 但是不管怎么样,FC网络的引入,完美解决了SCSI导线的问题:
并且只是替换了硬件层的东西,指令集仍然是SCSI,所以对于上层来说迁移成本很低,所以在企业级应用里得到了广泛使用。 就目前主流的存储协议:短距离(机内为主)使用SAS,长距离使用FC。 经过如上的系列技术发展,大规模存储系统的技术方案也就逐渐成熟了,于是市面上就逐步出现了商业化的产品,其实就是一个带得有一堆磁盘的盒子,这个盒子我们把它叫做SAN(Storage Area Network)。 说到SAN,就必须要提另外一个概念:NAS(Network Attach Storage)。因为字母都一样只是换了个顺序,所以比较容易混淆。NAS其实就是SAN+文件系统。SAN提供的还是磁盘管理协议级的接口(ATA/SCSI);NAS直接提供一个文件系统接口(ext/NTFS)。但是一般来说,SAN都是以FC网络(光纤高速网状网络)提供给主机的,所以性能高;而NAS一般都是通过以太网接入存储系统的,所以性能低。 另外,经常跟SAN和NAS一起的还有另外一个概念,DAS(Direct Attached Storage)。这个跟SAN类似,只是DAS只能被一台机器使用,而SAN提供了多个接口可以供多个用户使用。 修改自:https://www.cnblogs.com/xuanku/p/io_hardware.html |
|