来自存储老吴的博客——存储之道node
存储虚拟化技术其实不是一个特别新的东西,在很早之前就有了存储虚拟化技术。存储技术发展到今天,虚拟化技术在SSD、RAID、Volume、Scaleout等各个方面都发挥了巨大的做用。记得在2006年的时候,咱们实验室作了一个很是宏大的项目叫VSDS,这个项目就是一个典型的存储虚拟化项目。算法
在这个项目中,采用了大量的存储虚拟化技术。首先将磁盘进行虚拟化,经过池化的方式对全部磁盘存储资源进行管理,而后再将磁盘存储池中的资源分配给系统中的逻辑卷。这样就实现了逻辑卷资源的动态分配。这个概念在当时是很是前卫的,和LVM卷管理系统有着大相径庭的存储资源管理效果。在一个存储节点中会建立不少逻辑卷,多个存储节点中的逻辑卷资源在系统层级别再次造成一个分布式的存储池,该分布式存储池中的资源再动态分配给用户可见的存储卷。因此,VSDS本质上是一个分布式的集群SAN系统,在节点内部的卷级以及节点之间都采用了存储虚拟化技术。在当年这套系统所采用的技术是很是前沿的,即便在今天看来也是很是有价值的一套分布式SAN存储系统。后端
存储虚拟化技术是你们常常说起的东西,那到底在存储系统中,该技术会出如今哪些层面,而且会封装成什么用户特性?用户又是从该类技术中如何受益的呢?存储老吴给你们剖析一下磁盘存储系统中的存储虚拟化技术,不到之处敬请指出。服务器
从整个存储系统的层次结构来看(以下图所示),存储虚拟化技术一般分红以下三大类:架构
1, 系统级虚拟化技术。这种技术咱们也能够称之为节点间的虚拟化技术或称之为SAN级虚拟化技术,经过该类技术能够实现分布式存储。并发
2, 卷级虚拟化技术。这类技术主要在卷管理层面上使用虚拟化技术,解决卷管理方面的问题。分布式
3, 底层虚拟化技术。主要在RAID数据保护层使用虚拟化技术,解决传统RAID数据可靠性、数据重构等方面的问题ide
咱们首先谈谈底层虚拟化技术。底层虚拟化技术使用时间并非很长,也就在2012先后,不少存储厂商开始发布采用这种技术作成的数据保护系统,用来替代传统RAID,解决传统RAID在数据重构过程当中时间过长的问题。采用这种技术的厂商有NetApp的DDP系统、华为的RAID2.0等。将存储虚拟化技术引入到RAID系统中,最核心的一个想法是打破传统RAID数据布局上整齐划一的特性,从而能够破解数据重构过程当中读写性能的瓶颈点问题。布局
底层虚拟化技术在应用的过程当中,解决了RAID所面临的一些问题,但同时也引入了其余不少问题,例如,虚拟化过程当中资源分配是存在局限的,在同一个数据保护域内的数据不能被分配到相同的磁盘上。因为这个局限性,就会致使在存储资源不平衡前提下,即便存在存储资源都没法实现分配的状况。因此,当资源不平衡的时候,须要经过数据迁移的方式实现资源平衡。因此,底层虚拟化技术引入的数据迁移会致使应用性能降低。性能
另外一个比较重要的问题是虚拟化技术致使磁盘抖动,从而当磁盘数量较少状况下,数据重构性能反而低于传统RAID的数据重构性能。传统RAID在数据重构的过程当中,若是没有应用IO的状况下,读写IO是彻底分离的,所以,全部盘都能运行在最高带宽模式下。引入底层虚拟化技术以后,在数据重构过程当中,全部盘上都存在读写操做,而且读写之间地址都是离散的,所以每块盘都运行在随机访问模式下,每块盘的性能都会变成原来的一半,甚至更低。因此,当磁盘数量不够多时,这种虚拟化技术所引入的损耗起了主导做用,整体性能低于传统RAID。下图引入底层虚拟化技术以后磁盘数据重构性能表现:
从上面的数据咱们能够看出,当磁盘数量达到必定时,采用底层虚拟化技术以后的数据重构性能会随着磁盘数量的增长而线性增长(DiskPool曲线)。而采用传统RAID,其数据重构性能和磁盘的数量是无关的。
整体而言,底层存储虚拟化技术改造了存储数据的分布,提高系统数据保护的能力。但同时该技术的应用也是有条件的,不是在任何状况下均可以使用的。在华为的存储系统中,该类技术被称之为RAID2.0,在OceanStore9000集群NAS系统、OceanStore18000系统中获得了应用。在国外厂商中,和该类技术相似有IBM GPFS中的Declustered RAID,HP 3PAR存储系统中的VRAID,NetApp盘阵中所采用的DDP技术都具备相似的结构。因为底层虚拟化技术核心点是资源分配器,因此虽然这些系统都具有相同的结构,都具备资源池化的能力和思想,可是,资源池中的资源分配器算法各家确定是不相同的,而这种资源分配器算法影响了数据在存储资源中的分布,影响到数据重构、应用性能和数据可靠性,是整个系统的核心所在。因此,当看到一个产品中提到采用存储池技术,就认为是RAID2.0,那是错误的想法。底层虚拟化技术在RAID中应用,已经将RAID技术向卷管理、文件系统方向发展了,RAID技术复杂度提高了。存储池不是该类技术的本质特征,只是外在表现,重要的是内部的资源分配器算法及策略。
底层虚拟化技术解决了传统RAID所遇到的问题。在底层虚拟化技术的上面就是存储虚拟化技术普遍应用的卷级虚拟化。卷级虚拟化技术会将底层存储资源进行虚拟化,池化。即将RAID中导出的LUN进行分块池化。池化以后的资源经过分配策略分配到对应的逻辑卷中。初看起来底层虚拟化技术和卷级虚拟化技术是相同的,都是首先将资源进行池化,造成一个资源块池,而后再经过分配器的方式将资源进行重组,造成一个逻辑设备。的确,从外在形式上看,他们都属于存储虚拟化技术,因此所采用的方式都是相同的。所不一样的是解决不一样的问题,资源分配的方法是不一样的。对于卷级虚拟化,主要解决存储的异构管理、资源的精简配置、快照系统的资源高效使用等问题。而不像底层虚拟化技术是为了解决数据重构等问题。
卷级虚拟化的内部实现机制以下图所示:
其主要由三大部分组成:
1, 资源池。全部的存储资源都进行分块操做,以资源块的形式在storage pool中进行管理。在池化的过程当中,一个重要的问题是资源块粒度有多大,不一样粒度的资源对性能会形成不一样程度的影响。一般底层虚拟化技术所采用的资源粒度会大于卷级粒度。过大的卷级资源粒度会致使精简配置效果不佳,而且对性能形成影响。
2, 每一个逻辑卷都会维护一个映射树,每一个映射树中的资源块是从资源池中采用写时分配的策略动态分配出来的。在一个逻辑卷被建立的时候,映射树是空的,所以,全部的写操做都会返回数据零。随着写数据量的增长,映射树增大。当读请求访问逻辑卷时,须要查询映射树,经过映射树将请求转换成实际的物理访问地址;当写请求访问逻辑卷时,一样须要访问映射树,若是映射单元为空,那么从资源池中动态分配一个资源块,而后将数据写入该资源块。当数据被写入资源块以后,须要更新逻辑卷中的映射树信息。
3, 为了便于查找物理资源和逻辑资源块的信息,一般须要在内存中维护一个资源信息的反向映射表。经过该表将物理资源映射成逻辑资源,避免了当一个物理存储设备从资源池中移除时的全局扫描操做。
卷级虚拟化在产品中给用户带来的一个著名特性是thin provisioning(存储资源精简配置)。经过这个特性,用户能够采购少许的存储设备,在一个较小容量的存储系统上建立若干大容量的逻辑卷。当用户写入的数据量达到必定阈值时,及时通知用户添加存储资源。这种技术为用户带来的价值是节省了存储投资,简化了存储的管理。当用户追加存储资源时,应用层可见的逻辑卷空间能够不变,不须要作对应的扩容操做,业务不受影响。这是卷级虚拟化很是大的一个价值。
凡事都是有两面性的,卷级虚拟化简化了存储资源的管理,能够将异构平台融合在一块儿,能够为用户提供精简配置,能够为快照应用节省大量空间。全部这些好处的获取是须要付出其它代价的。卷级虚拟化最大的一个问题就是二次写问题,该问题会影响到业务的性能。
什么是二次写问题呢?根据卷级虚拟化的原理,在一个逻辑卷所有为空的时候,应用写入数据。此时写入的数据都会按需分配一个资源块,考虑到磁盘介质的随机访问抖动性问题,新分配资源块在磁盘上的分布都是顺序的,从而使得总体性能达到最佳。因此,不管应用端的业务是什么样的IO模式,经过卷级虚拟化技术均可以将这种任意IO Pattern在磁盘端造成顺序的数据流。这种经过首次写将存储资源进行分配的方式,致使了数据二次更新操做的低性能。当经过首次随机写将存储资源都分配完成以后,应用再以顺序IO的方式二次向逻辑卷写入数据时,因为映射关系在首次写中已经肯定,因此,第二次虽然是顺序IO的输入方式,可是在磁盘端表现出随机IO的特征,所以,二次写的性能变差。二次写性能影响以下图所示:
二次写的问题是不容易解决的。对于用户而言,经过引入卷级虚拟化技术以后,二次顺序写性能降低。为了解决这个问题,一般能够经过增大资源块粒度来减少二次写过程当中的磁盘抖动。
在虚拟化环境下,卷级虚拟化一样会带来必定的价值。在虚拟化环境下,随着虚拟机个数的增长,IO性能会急剧降低。虽然每一个虚拟机中都运行顺序IO操做,可是,后端存储的性能仍是很是的低效。究其本质是在于多台虚拟机的顺序IO在后端存储系统中交织在一块儿,造成一种伪随机的IO,会致使磁盘抖动,所以IO性能降低。若是采用了卷级虚拟化技术以后,能够将这种伪随机的IO进行顺序化处理,从而提高磁盘存储的性能。Vmware的Virsto就采用了这种思路。
卷级虚拟化技术使得存储节点内部的逻辑卷管理变得更加灵活,而且能够支持上层的更多应用,例如高效存储空间快照等。再往上走,在系统级层面也存在存储虚拟化技术。该类虚拟化技术是在存储节点(storage node)基础上完成的,其起到的做用是聚合各节点之间的存储资源,使其构成一个分布式的存储系统。一个典型的系统级虚拟化技术以下图所示:
这是一个典型的拥有元数据服务器的分布式SAN。该分布式SAN的一个技术就是存储虚拟化技术。若是咱们把一个存储节点当作是一个磁盘,那么能够采用存储虚拟化技术将磁盘中的存储资源都进行池化管理,池化以后的全部信息都保存在MS(元数据服务器)中。当位于客户端的应用软件访问一个虚拟逻辑卷时,首先须要访问MS,获取逻辑卷中一个逻辑地址所对应的存储节点以及存储节点中的具体位置。获取这些信息以后,应用软件能够直接向存储节点发送数据读写请求。当访问的数据在MS中还不存在映射时,客户端的应用软件会要求MS为其分配一个资源块。
采用这种分布式架构的虚拟化技术,最大的特色就是控制和数据链路的分离,属于带外模式。资源映射、逻辑卷的管理由MS服务器完成,具体的数据访问操做直接发生在存储节点和客户端之间,而不须要MS服务器的数据转发。采用这种分布式架构,必定程度上具备较好的数据并发行和可扩展性。可是,因为全部的客户端都须要访问MS来获取元数据信息,所以,元数据服务器是整个系统的性能瓶颈点,同时也是影响到系统可扩展性的一个重要因素。
和卷级虚拟化相比,系统级虚拟化在资源块粒度方面会选择的比较大,不然会致使客户端频繁的访问元数据服务器,引发总体系统性能的降低。
存储虚拟化技术有不少种,各类虚拟化技术的思路都是相同的,经过将资源池化,而后再经过分配器将资源进行重组利用。虽然思想差很少,可是在不一样层次部署的虚拟化技术起到的效果是大相径庭的。底层虚拟化技术的应用能够加强数据可靠性,加速数据重构操做;卷级虚拟化技术的应用能够更加灵活的管理异构设备、提供精简配置功能、优化快照空间等;系统级虚拟化技术部署能够构建大型分布式存储系统。能够这么说,存储虚拟化技术是存储的核心,随着闪存技术的应用与发展,存储虚拟化技术正在发挥着更大的做用和价值。