辗转反侧,一个IO终于从应用层达到了IO Scheduler层,并且经过scheduler调度处理之后准备前往SCSI层,向目的地Disk方向前进。一个IO历尽千辛万苦从应用层来到IO调度器,正准备调度走,回眸往事,不禁潸然泪下,路漫漫,一路走来真是不易!从应用层走到文件系统;在文件系统的Cache中停留许久之后,又被Writeback线程写入到块设备层;经过块设备层的调度处理之后,终于来到IO调度层;经过IO层严格调度之后,最终得到机会往SCSI协议层奔去。不就是一个IO操作吗?居然要经过这么多层的调度处理,想到这里,IO难免会觉得委屈,但不管怎样,从IO调度器出来之后,IO还是可以春风得意地奔向SCSI协议层的怀抱,在那里准备打包,并梦想着乘坐高速列车驶向心仪已久的目的地——Disk Drive

wKioL1NSeFbgL98AAAF33HrQ0hA584.jpg

春风得意的IO那里知道,他其实是一个幸运儿,他才走了很短的路程,未来的路还很漫长。更为幸运的是,他前面走过的路非常的平顺,其实没有太多的波折,是每个IO都会经历的过程。通常来讲,在很多高端的存储系统中,一个IO在块设备层会经历更多的软件层,这些软件层可以被称之为块设备层的IO堆栈。

块设备的IO堆栈包括SSD缓存系统、卷管理器、Snapshot快照系统、CDP持续数据保护系统、RAID磁盘阵列系统。这些软件层可以堆叠在一起,也可以单独存在。在一个后端存储系统中,SSD缓存系统、Snapshot、卷管理、RAID磁盘阵列往往会被堆叠在一起,从而构成一套高性能、高可用、易管理的存储系统。一个具有完整IO堆栈的系统层次结构如下图所示:

wKioL1NSeHKxnINoAAErxRJT37U495.jpg

近几年SSD的发展的确飞速迅猛,其最大表现在于大容量的Nand Flash存储芯片的研发和SSD Firmware的推进发展。Nand Flash技术在电子技术领域其实不是一个新东西,很早就采用了。但是,那时候的Nand Flash性能和容量远远不如现在,那时Nand Flash仅仅作为电子系统设计中的一个持久化数据保存地,我在10多年前就西门子合作采用Nand Flash来设计存储高速公路收费信息的系统,将Nand Flash作为一个裸磁盘使用。另外,在航天航空领域也会采用Nand Flash来替代机械硬盘,但是性能很一般,诸如DOM卡、USB存储之类的东西。随着Nand Flash制造工艺的不断突破,存储容量不断增大。基于Nand FlashSSD终于诞生了,并且曾经一度想替代存储领域的主角——机械硬盘。SSD的最大优点在于随机读写性能强,不存在机械寻道时间,因此具有很高的IOPS和带宽。当然,节能、可靠性也是SSD一大优点。SSD的最大缺点在于使用寿命,每个Flash块都存在擦写次数的限制,会影响数据存储的安全性。另外,Nand Flash在写操作时会存在写放大等问题,这个问题会影响到SSD的小写性能以及使用寿命。因此,如何解决SSD本身存在的这些问题是SSD研发的重点,各个SSD公司都会设计自己的Firmware来应对这些问题。正是因为这个原因,SSD Firmware是一个SSD公司的核心技术机密。从外部使用者的角度来看,SSD比机械磁盘具有更好的随机/顺序读写性能,但是容量远远小于磁盘,所以在短时间内无法采用SSD整体替换磁盘系统,除非是一些规模不是很大的存储应用系统。为了更好的结合SSD和磁盘,可以将SSD作为一种缓存系统应用于磁盘存储系统之上。大家知道,在现有的存储架构下,内存作为磁盘存储系统的Cache,那么引入SSD之后,可以将SSD作为磁盘存储的二级Cache。正是这个原因,在目前的很多存储系统中都会加入SSD缓存系统作为读Cache,或者作为数据自动分层的高效存储资源。SSD缓存层加入之后,对于很多应用可以极大提高系统的IOPSIO带宽。

wKiom1NSeLei0TbMAAB_Wu4KzJ4102.jpg

大家知道snapshot是一种快照系统,为了达到数据在时间轴上可回滚的目的,可以采用snapshot的技术对数据在时间轴上做切片。如果用户想要回滚到历史上某个时间点的数据集,那么可以采用这个时间点的快照。快照可以在文件系统层实现,也可以在块层达到相同的目的。由于文件系统本身采用inode tree之类的树维护了数据块的映射信息,因此,实现起来相对容易。在块层如果需要实现快照,那么需要数据块映射机制作为支撑。块层快照往往在卷管理器之上实现快照语义,卷管理器可以作为资源块分配机制为快照进行资源动态分配。快照算法通常有写时拷贝COW和写时映射ROW两种,对于不同的应用需求,这两种算法有各自的优缺点。从结构上分,快照有草型快照和链式快照之分,不同的结构有不同的效率和性能。

卷管理器是一个老生常谈的话题,Linux中的逻辑卷管理LVM名声在外,很多系统都会采用LVM作为卷管理器。LVM可以整合不同厂商的存储资源,然后根据用户的需求形成逻辑卷供应用层使用,在LVM中物理卷池和逻辑卷都可以动态扩容,从而简化了存储资源的管理。在现代存储系统中,为了提高IO性能、存储资源的使用率,在卷管理层引入了Thin provisioning的功能。Thin Provisioning的最大特点在于可以对存储资源进行按需动态分配,即对存储进行了虚拟化管理。从用户的角度来看,一个逻辑卷有100TB的空间,但是,实际的资源可能只有10TB,这就是Thin Provisioning的核心思想。存储虚拟化的另外一大好处在于可以优化IO性能。在多用户的一个系统中,从单个用户的角度来看,可能都是顺序写操作,但是,到了存储后端,由于多用户并发的效果,导致这些顺序IO会混合在一起,从而对后端存储系统而言形成了随机IO。多用户并发操作使得存储系统的性能极为降低,从而导致诸如VMware虚拟化环境下出现的多用户并发操作导致每个用户的性能体验都很差。为了解决这个问题,可以在卷管理层引入虚拟化机制,将这种随机IO顺序化,从而提高整体存储性能。

磁盘阵列RAID技术是大家非常熟悉的技术,其主要目的是用来保护用户数据和提高读写性能。由于RAID技术可以在多个磁盘之间并发IO,因此使得应用IO性能大为提高。另外,在RAID技术中可以采用XORRS编码以及擦除码等编解码技术进行数据信息冗余,因此,可以提高数据可靠性。RAID技术从诞生之初到现在已经发展的极为成熟,几乎所有的存储系统都会采用RAID作为系统的数据保护层和性能优化层。下图是1988Patterson, GibsonKatz联合发表的RAID学术论文:

wKiom1NSeczxuZeNAAHfUOpml7k491.jpg

通常来讲,一个系统可以采用硬件RAID卡或者纯软件的技术手段来实现RAID功能,在中低端系统中通常都会采用硬件RAID方案来实现RAID功能,但是在高端系统中,都会考虑采用软件的方式来实现RAID功能。软件方式实现RAID功能的优点在于可以根据应用特征实现复杂的数据保护方式。例如,在备份系统中对数据保护的要求比较高,实现的RAID需要比其它RAID具有更强的数据保护能力,因此,软件RAID的方案是一个比较好的选择。伴随着磁盘容量的不断增大,RAID本身存在的问题也越来越突出:一个问题是RAID的数据重构时间变的越来越长;另一个问题是RAID数据重构IO对应用IO性能造成严重影响。为了解决上述RAID问题,传统RAID正面临着架构转型。

由此可见在存储系统中,块设备层具有很多的软件层,这些软件层用于解决性能、灵活性、数据可靠性等问题。前面讲到春风得意的IO准备离开IO Scheduler层,通过磁盘驱动程序前往SCSI协议层。回过头来,我们还是有必要细细探讨SSD缓存、快照系统、卷管理器以及RAID系统,从中体验IO旅程的不易。后面我们将对块设备层的这些主要功能层的设计实现进行详细剖析。