FlashRAID是面向NVMe SSD设计的一套软件定义存储系统,在设计之初考虑了新型存储介质的特性以及存在的问题。在系统设计过程中,充分利用了新型介质的特性,并且通过技术革新解决了高性能存储介质的数据保护、性能聚合、资源管理、性能导出以及易于维护管理等方面的问题。FlashRAID在物理资源管理、逻辑资源管理、增强数据保护、性能聚合、数据导出以及存储管理平台方面进行了技术创新,相关技术申请了发明专利。本技术白皮书对这些创新技术进行一一说明。
传统存储系统通常采用RAID技术对物理资源进行管理,在RAID技术之上再采用存储虚拟化技术将资源重组构成逻辑卷。这种存储虚拟化的方式通常被称之为卷级虚拟化技术。由于传统RAID在物理盘上的数据分布固定,导致数据恢复时间过长,存储管理复杂等问题。为了解决单盘容量急剧增加,异构存储管理,NVMe SSD新型存储介质等引入的新问题,FlashRAID采用了底层虚拟化技术,该技术也被称之为“底层资源池化技术”。通过该技术直接将物理资源进行池化管理,不同特性的介质采用不同的池化策略构成独立的资源池。FlashRAID所采用的底层资源虚拟化技术架构如下图所示:
物理盘资源通过一定的方式被池化处理,每个可被管理的最小物理资源粒度被称之为CHUNK,CHUNK资源通过分配器以动态或者静态的方式分配给Storage Objects。每个Storage Object被称之为Container。多个Container可以动态组成逻辑卷LUN。在存储虚拟化过程中,资源分配器算法决定了数据在物理资源中的分布,针对不同的存储介质可以采用不同的资源分配算法,并且池化粒度CHUNK的大小也由介质的类型来决定。
与传统的卷级虚拟化技术相比,底层虚拟化技术去除了传统RAID层,通过虚拟化的方式直接对物理资源进行管理,可以更加灵活的实现数据保护等功能,但与此同时也会引入很多新的问题,例如分配器在资源分配时需要考虑数据保护等问题。
传统RAID数据保护架构比较简单,若干磁盘构成磁盘组,在磁盘组内部通过条带的方式进行数据保护。这种结构最大的好处是规则化数据分布,通过访问逻辑地址可以计算定位数据所在位置。传统RAID最大问题在于灵活性差,无法解决快速数据恢复等问题。NVMe SSD的故障模型和HDD相比存在较大差异,如果采用传统RAID架构实现数据保护,无法很好解决SSD的新问题,并且很难适应大容量存储盘的发展趋势。
为此,FlashRAID提出了数据保护域与物理资源管理域相分离的概念与方法,打破盘组所引入的问题,通过资源池化的方式更加高效的实现数据保护功能。传统存储软件架构与FlashRAID软件架构对比如下图所示:
在FlashRAID中,通过资源池化的手段对物理资源进行管理。存储资源池本身不具备数据保护的能力,该资源池被称之为“物理资源管理域”。在存储池之上是存储对象层,每个存储对象被称之为Container。Container由CHUNK构成,每个Container是一个数据保护单位。因此,存储对象层也被称之为“数据保护域”。由于Container是一个逻辑对象,与具体存储盘无关,因此,FlashRAID可以很灵活的在存储池之上实现多种不同方式的数据保护。与传统RAID相比,FlashRAID数据保护不再依赖于物理盘,通过虚拟化的方式将物理资源与数据保护进行了彻底的分离。
存储对象Container是FlashRAID数据保护的基本单元,也是构成逻辑卷的基本单元。一个逻辑卷由若干个Container动态或者静态构成。Container内部结构如下图所示:
一个Container由若干CHUNK构成,这些CHUNK位于不同的存储盘。具体分布规则由存储池的资源分配器来决定。Container中的每个CHUNK被格式化成两个区域,一个被称之为Container Header;另一个被称之为Data Region。Container Header用于存储Container的元数据信息。元数据信息在所有CHUNK中进行冗余存储,以此来提高Container元数据的健壮性。在最坏情况下,只要一个CHUNK中的元数据残留,就可以恢复整个Container。
为了实现数据在所有SSD中均衡分布,并且为了达到全局磨损均衡的目的,资源分配器采用带权重的伪随机分配算法。该算法将物理域与分配域分离,每个SSD根据当前的属性参数生成一个权重,该权重在分配域中生成分配单元。不同权重会生成不同数量的分配单元。从而不同SSD会得到不同概率的分配机会。带权重伪随机分配算法示意如下:
例如当一个新盘加入到资源池之后,由于新盘具有较多的存储空间,并且寿命更为年轻,因此需要对该盘进行惩罚式分配。该新盘会在分配域中生成较多的分配单元,以很高的概率进行分配使用。
为了减少数据迁移所引入的SSD写放大问题,在Container资源无法完全分配成功时,FlashRAID采用了可变条带技术对资源进行分配。如下图所示,当一个Container预期需要分配5个CHUNK时,由于某种原因无法分配成功,因此可以从(4+1)模式退化成(3+1)模式。
可变条带技术的使用使得资源分配更加灵活,在资源紧张的时候或者存储盘发生故障时,同样可以保证资源分配成功。从而在减小写放大的同时,可以进一步保证数据可靠性。
元数据管理直接影响到FlashRAID的数据可靠性。在FlashRAID中元数据分成两大部分,一部分为系统元数据;另一部分为映射元数据。系统元数据用于保存存储池信息以及逻辑卷信息;映射元数据用于存储Container中的CHUNK信息。所有元数据都会采用备份冗余的方式进行持久化存储。一个存储盘中的元数据与数据的分布如下图所示:
元数据信息在多盘之间进行冗余备份,从而保证存储盘发生故障的情况下,元数据信息还可以从残留信息中完整恢复。另外,在一个存储盘中,系统元数据信息采用多副本的方式进行持久化保存,从而存储介质在局部发生故障的情况下,元数据信息可以无损恢复。
在SSD内部通过FTL固件实现NAND Flash级别的全局磨损均衡,从而可以使得整个SSD使用寿命最大化。在系统级别,多个SSD同时使用的情况下,同样可以采用全局磨损均衡算法,使得在系统级别SSD使用寿命的最大化。FlashRAID会根据SSD单盘的使用寿命进行全局磨损均衡化,从而可以尽最大可能的保证一个存储池中所有盘使用均衡。
全局磨损均衡分为动态磨损均衡与静态磨损均衡。动态磨损均衡在分配器进行资源分配过程中进行均衡决策;静态磨损均衡对长期不使用盘中的数据进行迁移,从而达到全局磨损均衡的目的。
SSD构建RAID的一个潜在风险是盘同时发生故障。每个SSD盘的使用寿命是固定明确的,当所有SSD被均衡的写入数据时,很有可能会出现在极短的一个时间窗口内,多块SSD盘同时发生故障,从而导致数据丢失。这也是传统RAID存在的一个弊端,在FlashRAID中通过逆磨损均衡的方式解决该问题。
当一个存储池中的SSD具备相同使用寿命,并且都处于老年状态时,逆磨损均衡算法会对其中的一块存储盘进行分配惩罚,破坏磨损均衡的状态,从而使得被惩罚的盘首先无效掉。避免出现多盘同时故障的情况,尽最大可能保证数据可靠性。
资源精简配置技术可以简化存储资源的管理。当应用需要较大存储容量时,通过精简配置技术可以分配大容量卷,不需要考虑实际物理资源是否满足应用需求。当物理资源不够时,通过存储池扩容的方式增加资源,而不需要改变应用。精简资源配置的逻辑示意图如下所示:
精简资源配置技术简化了存储管理,为了防止物理存储池被写爆,在FlashRAID中对存储池资源使用情况进行了监测,一旦物理资源使用超过了设定阈值,系统会采用多种报警方式提示系统管理员添加物理资源。
NVMe SSD具有高速存储性能的特征,HDD具有价格低廉的特征,不同存储介质具有不同的优势。FlashRAID通过冷热数据分层的方式充分利用不同介质的优势,将热数据存储在高速测试上;将冷数据存储到价格相对低廉的介质上。从而可以很好的平衡存储系统的性能与价格。
FlashRAID通过冷热数据预测的方式影响数据在不同介质中分布。不同介质构成不同存储池,一个具备冷热数据分层功能的卷会跨越多个存储池,热数据存储在性能池中;冷数据存储在容量池中。与数据缓存系统有所不同,分层系统中的性能池具备数据持久化存储的能力,即数据一旦存储到性能池之后,可以保证数据不丢失。因此,分层存储采用写回策略,大大提升了数据写入的性能。
FlashRAID支持RAID5、RAID6等经典条带化数据冗余算法,并且采用Anvin算法实现软件快速编解码。对于RAID6算法,一个条带内两个校验块分别称之为P和Q,P采用异或方式生成;Q采用Reed-Solomon编码生成,采用有限域运算实现:
Intel处理器提供了SSE、AVX等运算加速指令,因此条带编解码通过Intel的加速指令集来实现。FlashRAID中的条带编解码以Container为单位。在Container内部,校验数据块按照一定规则分布,因此,可以通过LBA计算的方式定位每个条带中的校验数据块位置。
传统RAID架构决定了数据恢复性能不会超过单盘性能。当单盘容量变得越来越大,存储规模越来越大时,采用传统RAID架构将会导致数据恢复性能无法线性扩展,从而会影响数据存储可靠性。FlashRAID具备数据快速恢复的能力,无论是对于磁盘还是SSD,数据恢复性能与盘数量相关,并且可以随着盘的数量线性增加。
快速数据恢复得益于底层虚拟化技术的应用。假设一个存储池中的SSD被移除之后,存储池中的部分Container会受到影响,然后启动数据恢复操作。新恢复的数据会被重构写入存储池中的所有SSD中,不存在传统RAID中的写入瓶颈问题。因此,存储池中盘越多,参与数据恢复的盘就越多,数据恢复性能就越高。快速数据恢复技术的使用,可以保证在极短的时间内恢复由于硬件故障等原因导致的丢失数据,从而可以将数据风险窗口降到最低,保证数据存储的可靠性。
传统RAID采用整盘数据重构的方式恢复丢失数据,这种方式没有考虑存储数据的风险度。在FlashRAID中,会根据Container中数据所面临的丢失风险度来进行动态调度,从而保证风险度最高的数据以最高优先级完成数据恢复操作。这种方法被称之为“优先级调度数据重构”,示意图如下所示:
当一个存储池中两个存储盘发生局部故障时,会影响到对象层中Container数据的完整性。由于资源分配的离散性,导致有些Container会出现两个数据块同时发生故障的情况;有些Container只存在一个故障数据块。显然,对于两个故障数据块的Container,其数据丢失风险度更高,因此,需要优先恢复该Container中的数据。优先级调度充分利用了SSD介质高随机访问的性能,对数据风险度进行了区分,尽最大可能的保证了数据可靠性。
传统RAID对故障磁盘进行整盘重构,无法感知盘上的数据。即使一个磁盘组中不存在任何有效数据,传统RAID也会对故障盘进行整盘重构,这种操作引入了大量无效IO操作。FlashRAID将物理资源管理域与数据保护域分离,因此可以采用数据感知的方式对丢失数据进行恢复。
当存储池中数据盘发生故障时,会对若干存储对象层中的Container造成影响,数据重构操作只针对被影响的Container进行。如果一个存储盘的故障不对任何Container造成影响,那么将不会启动数据恢复操作。采用这种数据感知重构技术,可以在写入数据量较少情况下,快速恢复数据,同时也避免很多无效IO的操作,减少SSD写放大。
NVMe SSD具有极高的IO性能,当存储盘不再是IO性能瓶颈时,CPU逐渐成为影响IO性能的关键因素。多核化是处理器技术发展方向,如何借助多核处理器的能力,分布式处理IO是高性能介质在系统级应用的一个关键。FlashRAID从软件架构设计开始考虑了多核并发IO处理问题,通过任务的合理划分,多核并发、协同的处理IO请求,达到性能的最大化。FlashRAID多核并发处理模型如下图所示:
应用处理软件在访问逻辑卷时,将LBA通过HASH算法规则定位到具体的IO处理线程,IO处理线程以一定的规则独立处理IO请求。由于多核处理器的协同工作,当处理器数量增多时,IO处理性能会线性增加。
在传统软件设计中,通常会采用锁机制来处理多个线程之间的同步。在多核处理器平台上,大量采用锁机制将会极大的影响系统整体性能。一方面锁之间的竞争会影响CPU本身的性能,使得处理器本身的执行效率降低,缓存被不断刷新;另一方面大量的锁竞争会导致处理器之间无法并发运行。因此,传统存储软件设计方法会导致系统整体性能降低,同时CPU利用率极高,无法充分利用CPU多核化带来的价值。
FlashRAID采用了无锁设计方法,创造了无锁生产者消费者算法,在整个数据链路上不存在任何竞争锁,线程之间请求的传递通过无锁生产者、消费者机制来实现。采用这种技术之后,在多核处理器平台上,可以使得系统性能随处理器数量线性变化。当处理器越多,系统性能越高。
这种性能可扩展的特性可以充分的迎合处理器技术的发展方向。借助Intel处理器技术的发展,FlashRAID的性能将会线性扩展。
传统流控技术通过信号量等机制来实现,这种流控机制在高性能存储系统存在性能问题。信号量机制本质上是锁同步机制,在数据通路上大量的锁访问会导致处理器运行效率的降低,很多指令周期都浪费在锁同步处理上。为了能够解决该问题,FlashRAID引入了无锁流控机制,在去除同步锁的基础上实现了线程之间的IO流控。
在没有流控机制支持的系统中,会存在IO延迟过高问题。例如在文件系统应用中,大量的IO首先聚合在Page Cache中,当聚合到一定程度时,文件系统会将缓存的数据一次性写入底层存储系统中,如果此时没有流控机制的支持,一方面,系统将会耗尽大量内存处理IO;另一方面单个IO的延迟将会变得极高。FlashRAID的无锁流控技术可以保证IO的延迟,同时也可以保证系统中处理IO的数量,不至于耗尽过多的内存资源。
传统存储系统很难保证业务IO带宽,当系统发生磁盘故障时,业务IO性能将会急剧降低。其主要原因在于数据重构操作占用了业务IO带宽。在FlashRAID中采用带宽自动均衡控制技术,保证业务的性能质量。带宽自动均衡控制技术会根据业务当前的流量来决定数据重构所占用的带宽。如果业务流量很高,那么数据重构带宽将会自动降低;反之,数据重构操作会占用带宽,全速恢复数据。
带宽QoS技术引入之后,可以保证FlashRAID业务性能平稳,在系统发生故障的情况下,业务性能也不会降低很多,并且可以尽最大可能在极短的时间内完成数据恢复。
SCSI导出协议是存储系统常用的导出接口协议,常用协议有Iscsi、FC等。FlashRAID采用企业级SCSI导出协议栈SCST实现逻辑卷高效导出。SCST的软件结构如下所示:
针对高性能存储介质,FlashRAID采用优化之后的iSER导出协议直接将逻辑卷对外导出。传统SCST的实现中存在大量锁竞争等问题,FlashRAID对SCST进行了改造,并且进行了有效集成,使得FlashRAID逻辑卷可以采用iSCSI、iSER、FC的方式高效导出。
NVMe over Fabric导出协议是针对高性能存储介质的导出协议。该协议直接采用NVMe接口命令,通过RDMA的方式将逻辑卷高效导出。与SCSI导出方式相比,NVMe over Fabric导出方式去除了SCSI协议转换开销,软件层的开销将进一步降低。
FlashRAID导出协议栈支持NVMe overFabric,通过该协议访问后端存储,IO延迟可以保证在200us以内,网络及协议本身的开销很小。
FlashCLI为FlashRAID提供了命令行管理接口,通过该工具可以实现对FlashRAID的所有操作,包括:用户权限管理、SSD资源管理、存储池管理、逻辑卷管理、性能监测、故障信息管理以及日志收集功能。
FlashCLI提供了完善的帮助信息以及命令使用案例,操作规则符合Linux常用命令工具规范。通过该工具可以查看系统当前的所有状态,并且可以监测系统的故障信息。FlashCLI是一套基于存储管理服务平台的命令行工具,所采用的API接口函数可以提供给第三方厂商,便于集成至第三方命令行管理平台中。
WebGUI是一套FlashRAID图形化管理平台,通过该图形化管理平台可以实现系统状态的监测、性能的监测、存储的基本管理操作以及系统级别的管理。WebGUI的访问页面如下图所示:
WebGUI是一套与FlashCLI相互独立的存储管理平台软件,通过浏览器的方式直接对FlashRAID进行操作,并且可以实时查看逻辑卷的性能表现以及系统的故障信息。
(存储之道)
本文出自 “存储之道” 博客,转载请与作者联系!
原文地址:http://alanwu.blog.51cto.com/3652632/1920668