来自存储老吴的博客——存储之道

概述

存储虚拟化技术其实不是一个特别新的东西,在很早以前就有了存储虚拟化技术。存储技术发展到今天,虚拟化技术在SSDRAIDVolumeScaleout等各个方面都发挥了巨大的作用。记得在2006年的时候,我们实验室做了一个非常宏大的项目叫VSDS,这个项目就是一个典型的存储虚拟化项目。

 

在这个项目中,采用了大量的存储虚拟化技术。首先将磁盘进行虚拟化,通过池化的方式对所有磁盘存储资源进行管理,然后再将磁盘存储池中的资源分配给系统中的逻辑卷。这样就实现了逻辑卷资源的动态分配。这个概念在当时是非常前卫的,和LVM卷管理系统有着截然不同的存储资源管理效果。在一个存储节点中会创建很多逻辑卷,多个存储节点中的逻辑卷资源在系统层级别再次形成一个分布式的存储池,该分布式存储池中的资源再动态分配给用户可见的存储卷。所以,VSDS本质上是一个分布式的集群SAN系统,在节点内部的卷级以及节点之间都采用了存储虚拟化技术。在当年这套系统所采用的技术是非常前沿的,即使在今天看来也是非常有价值的一套分布式SAN存储系统。

 

存储虚拟化技术是大家经常提及的东西,那到底在存储系统中,该技术会出现在哪些层面,并且会封装成什么用户特性?用户又是从该类技术中如何受益的呢?存储老吴给大家剖析一下磁盘存储系统中的存储虚拟化技术,不到之处敬请指出。

 

从整个存储系统的层次结构来看(如下图所示),存储虚拟化技术通常分成如下三大类:

 1, 系统级虚拟化技术。这种技术我们也可以称之为节点间的虚拟化技术或称之为SAN级虚拟化技术,通过该类技术可以实现分布式存储。

2, 卷级虚拟化技术。这类技术主要在卷管理层面上使用虚拟化技术,解决卷管理方面的问题。

3, 底层虚拟化技术。主要在RAID数据保护层使用虚拟化技术,解决传统RAID数据可靠性、数据重构等方面的问题


wKiom1W7briiZ_hcAADAEQ64nag788.jpg

底层虚拟化技术

我们首先谈谈底层虚拟化技术。底层虚拟化技术使用时间并不是很长,也就在2012前后,很多存储厂商开始发布采用这种技术做成的数据保护系统,用来替代传统RAID,解决传统RAID在数据重构过程中时间过长的问题。采用这种技术的厂商有NetAppDDP系统、华为的RAID2.0等。将存储虚拟化技术引入到RAID系统中,最核心的一个想法是打破传统RAID数据布局上整齐划一的特性,从而可以破解数据重构过程中读写性能的瓶颈点问题。

 

底层虚拟化技术在应用的过程中,解决了RAID所面临的一些问题,但同时也引入了其他很多问题,例如,虚拟化过程中资源分配是存在局限的,在同一个数据保护域内的数据不能被分配到相同的磁盘上。由于这个局限性,就会导致在存储资源不平衡前提下,即使存在存储资源都无法实现分配的情况。所以,当资源不平衡的时候,需要通过数据迁移的方式实现资源平衡。所以,底层虚拟化技术引入的数据迁移会导致应用性能下降。

 

另一个比较重要的问题是虚拟化技术导致磁盘抖动,从而当磁盘数量较少情况下,数据重构性能反而低于传统RAID的数据重构性能。传统RAID在数据重构的过程中,如果没有应用IO的情况下,读写IO是完全分离的,因此,所有盘都能运行在最高带宽模式下。引入底层虚拟化技术之后,在数据重构过程中,所有盘上都存在读写操作,并且读写之间地址都是离散的,因此每块盘都运行在随机访问模式下,每块盘的性能都会变成原来的一半,甚至更低。所以,当磁盘数量不够多时,这种虚拟化技术所引入的损耗起了主导作用,总体性能低于传统RAID。下图引入底层虚拟化技术之后磁盘数据重构性能表现:


wKioL1W7cMjzAoiVAADLwlwWG4w306.jpg


从上面的数据我们可以看出,当磁盘数量达到一定时,采用底层虚拟化技术之后的数据重构性能会随着磁盘数量的增加而线性增加(DiskPool曲线)。而采用传统RAID,其数据重构性能和磁盘的数量是无关的。

 

总体而言,底层存储虚拟化技术改造了存储数据的分布,提升系统数据保护的能力。但同时该技术的应用也是有条件的,不是在任何情况下都可以使用的。在华为的存储系统中,该类技术被称之为RAID2.0,在OceanStore9000集群NAS系统、OceanStore18000系统中得到了应用。在国外厂商中,和该类技术类似有IBM GPFS中的Declustered RAIDHP 3PAR存储系统中的VRAIDNetApp盘阵中所采用的DDP技术都具有类似的结构。由于底层虚拟化技术核心点是资源分配器,所以虽然这些系统都具备相同的结构,都具有资源池化的能力和思想,但是,资源池中的资源分配器算法各家肯定是不相同的,而这种资源分配器算法影响了数据在存储资源中的分布,影响到数据重构、应用性能和数据可靠性,是整个系统的核心所在。所以,当看到一个产品中提到采用存储池技术,就认为是RAID2.0,那是错误的想法。底层虚拟化技术在RAID中应用,已经将RAID技术向卷管理、文件系统方向发展了,RAID技术复杂度提升了。存储池不是该类技术的本质特征,只是外在表现,重要的是内部的资源分配器算法及策略。

 

卷级虚拟化技术

底层虚拟化技术解决了传统RAID所遇到的问题。在底层虚拟化技术的上面就是存储虚拟化技术广泛应用的卷级虚拟化。卷级虚拟化技术会将底层存储资源进行虚拟化,池化。即将RAID中导出的LUN进行分块池化。池化之后的资源通过分配策略分配到对应的逻辑卷中。初看起来底层虚拟化技术和卷级虚拟化技术是相同的,都是首先将资源进行池化,形成一个资源块池,然后再通过分配器的方式将资源进行重组,形成一个逻辑设备。的确,从外在形式上看,他们都属于存储虚拟化技术,所以所采用的方式都是相同的。所不同的是解决不同的问题,资源分配的方法是不同的。对于卷级虚拟化,主要解决存储的异构管理、资源的精简配置、快照系统的资源高效使用等问题。而不像底层虚拟化技术是为了解决数据重构等问题。

 

卷级虚拟化的内部实现机制如下图所示:

wKiom1W7bv7wLzdNAAFdZq_VaSM431.jpg


其主要由三大部分组成:

1, 资源池。所有的存储资源都进行分块操作,以资源块的形式在storage pool中进行管理。在池化的过程中,一个重要的问题是资源块粒度有多大,不同粒度的资源对性能会造成不同程度的影响。通常底层虚拟化技术所采用的资源粒度会大于卷级粒度。过大的卷级资源粒度会导致精简配置效果不佳,并且对性能造成影响。

2, 每个逻辑卷都会维护一个映射树,每个映射树中的资源块是从资源池中采用写时分配的策略动态分配出来的。在一个逻辑卷被创建的时候,映射树是空的,因此,所有的写操作都会返回数据零。随着写数据量的增加,映射树增大。当读请求访问逻辑卷时,需要查询映射树,通过映射树将请求转换成实际的物理访问地址;当写请求访问逻辑卷时,同样需要访问映射树,如果映射单元为空,那么从资源池中动态分配一个资源块,然后将数据写入该资源块。当数据被写入资源块之后,需要更新逻辑卷中的映射树信息。

3, 为了便于查找物理资源和逻辑资源块的信息,通常需要在内存中维护一个资源信息的反向映射表。通过该表将物理资源映射成逻辑资源,避免了当一个物理存储设备从资源池中移除时的全局扫描操作。

 

卷级虚拟化在产品中给用户带来的一个著名特性是thin provisioning(存储资源精简配置)。通过这个特性,用户可以采购少量的存储设备,在一个较小容量的存储系统上创建若干大容量的逻辑卷。当用户写入的数据量达到一定阈值时,及时通知用户添加存储资源。这种技术为用户带来的价值是节省了存储投资,简化了存储的管理。当用户追加存储资源时,应用层可见的逻辑卷空间可以不变,不需要做对应的扩容操作,业务不受影响。这是卷级虚拟化非常大的一个价值。

 

凡事都是有两面性的,卷级虚拟化简化了存储资源的管理,可以将异构平台融合在一起,可以为用户提供精简配置,可以为快照应用节省大量空间。所有这些好处的获取是需要付出其它代价的。卷级虚拟化最大的一个问题就是二次写问题,该问题会影响到业务的性能。

 

什么是二次写问题呢?根据卷级虚拟化的原理,在一个逻辑卷全部为空的时候,应用写入数据。此时写入的数据都会按需分配一个资源块,考虑到磁盘介质的随机访问抖动性问题,新分配资源块在磁盘上的分布都是顺序的,从而使得整体性能达到最佳。所以,无论应用端的业务是什么样的IO模式,通过卷级虚拟化技术都可以将这种任意IO Pattern在磁盘端形成顺序的数据流。这种通过首次写将存储资源进行分配的方式,导致了数据二次更新操作的低性能。当通过首次随机写将存储资源都分配完成之后,应用再以顺序IO的方式二次向逻辑卷写入数据时,由于映射关系在首次写中已经确定,所以,第二次虽然是顺序IO的输入方式,但是在磁盘端表现出随机IO的特征,因此,二次写的性能变差。二次写性能影响如下图所示:

wKiom1W7b1LyZ-OaAADtVPItcWA628.jpg


二次写的问题是不容易解决的。对于用户而言,通过引入卷级虚拟化技术之后,二次顺序写性能下降。为了解决这个问题,通常可以通过增大资源块粒度来减小二次写过程中的磁盘抖动。

 

在虚拟化环境下,卷级虚拟化同样会带来一定的价值。在虚拟化环境下,随着虚拟机个数的增加,IO性能会急剧下降。虽然每个虚拟机中都运行顺序IO操作,但是,后端存储的性能还是非常的低效。究其本质是在于多台虚拟机的顺序IO在后端存储系统中交织在一起,形成一种伪随机的IO,会导致磁盘抖动,因此IO性能下降。如果采用了卷级虚拟化技术之后,可以将这种伪随机的IO进行顺序化处理,从而提升磁盘存储的性能。VmwareVirsto就采用了这种思路。


wKioL1W7cWKyKLhuAAC541fYPB8453.jpg


系统级虚拟化技术

卷级虚拟化技术使得存储节点内部的逻辑卷管理变得更加灵活,并且可以支持上层的更多应用,例如高效存储空间快照等。再往上走,在系统级层面也存在存储虚拟化技术。该类虚拟化技术是在存储节点(storage node)基础上完成的,其起到的作用是聚合各节点之间的存储资源,使其构成一个分布式的存储系统。一个典型的系统级虚拟化技术如下图所示:

wKiom1W7b43D_9lCAAC7z5pkL3E484.jpg


这是一个典型的拥有元数据服务器的分布式SAN。该分布式SAN的一个技术就是存储虚拟化技术。如果我们把一个存储节点看成是一个磁盘,那么可以采用存储虚拟化技术将磁盘中的存储资源都进行池化管理,池化之后的所有信息都保存在MS(元数据服务器)中。当位于客户端的应用软件访问一个虚拟逻辑卷时,首先需要访问MS,获取逻辑卷中一个逻辑地址所对应的存储节点以及存储节点中的具体位置。获取这些信息之后,应用软件可以直接向存储节点发送数据读写请求。当访问的数据在MS中还不存在映射时,客户端的应用软件会要求MS为其分配一个资源块。

 

采用这种分布式架构的虚拟化技术,最大的特点就是控制和数据链路的分离,属于带外模式。资源映射、逻辑卷的管理由MS服务器完成,具体的数据访问操作直接发生在存储节点和客户端之间,而不需要MS服务器的数据转发。采用这种分布式架构,一定程度上具有较好的数据并发行和可扩展性。但是,由于所有的客户端都需要访问MS来获取元数据信息,因此,元数据服务器是整个系统的性能瓶颈点,同时也是影响到系统可扩展性的一个重要因素。

 

和卷级虚拟化相比,系统级虚拟化在资源块粒度方面会选择的比较大,否则会导致客户端频繁的访问元数据服务器,引起整体系统性能的下降。

 

总结

存储虚拟化技术有很多种,各种虚拟化技术的思路都是相同的,通过将资源池化,然后再通过分配器将资源进行重组利用。虽然思想差不多,但是在不同层次部署的虚拟化技术起到的效果是截然不同的。底层虚拟化技术的应用可以增强数据可靠性,加速数据重构操作;卷级虚拟化技术的应用可以更加灵活的管理异构设备、提供精简配置功能、优化快照空间等;系统级虚拟化技术部署可以构建大型分布式存储系统。可以这么说,存储虚拟化技术是存储的核心,随着闪存技术的应用与发展,存储虚拟化技术正在发挥着更大的作用和价值。