NVMe固态盘已经开始逐渐普及,但是,有个严峻的问题摆在眼前,那就是如何对NVMe盘做Raid,NVMe固态盘虽好,但是如果缺乏了Raid的冗余性保护,那么不少人其实是有顾虑的,从而阻碍NVMe固态盘的普及。我们知道,做Raid目前最广泛的方式,是采用硬Raid卡,先将硬盘接入到Raid控制器上,Raid控制器再接入到系统PCIE总线上,这是SAS/SATA盘的标准做法。
得益于数据块条带化以及Raid卡上的数据缓存以及超级电容的备电,读写IO速度被进一步加快,同时还能够防止单盘或者双盘同时故障导致的数据丢失。Raid卡在服务器上被广泛应用。
那么,对于PCIE接口的、NVMe访问协议的固态盘,目前的Raid卡是无能为力的,因为目前的Raid卡只提供了SAS/SATA接口接入硬盘,要想把NVMe固态盘接入,就得对现有Raid控制器进行改造,在芯片中加入PCIE主控制器和PCIe Switch,NVMe固态盘接入集成在Raid主控里的Switch(或者两个独立的die芯片,封装在一起),依然采用Raid主控来做Raid。这种做法会增加成本,因为为了同时支持SAS/SATA和PCIE,多引入了PCIE Switch部分,而SAS兼容SATA,却不兼容NVMe。
既然ATA和SCSI都可以over SAS,那么为什么不能把NVMe协议也Over到SAS呢?其实理论上是完全可以的。SAS Expander中每个端口都有个叫做STP bridge的桥接电路,就是这个电路负责生成SATA链路对应的信号,从而才可以与SATA盘通信,而如果在SAS Expander中增加一个PCIe的主控端,负责生成PCIe信号,由SAS Expander固件负责对PCIe固态盘进行初始化配置。但是冬瓜哥认为这样做理论上可以,但是复杂度并不亚于前一种方案。
SAS和SATA盘可以通过SAS Expander汇总接入到SAS控制器上,PCIe接口的NVMe SSD也可以通过PICeSwitch芯片汇总接入到CPU上的PCIe主控制器上。那么是否可以在PCIe Switch上做Raid呢?理论上没有什么不可以。但是利用芯片做Raid需要满足几个条件:性能不用很强但也不能太孱弱的嵌入式通用CPU,专用XOR硬加速电路,起码2GB的数据缓存,用于掉电保护的超级电容和Flash。如果把一片PCIe Switch芯片中嵌入这几样东西,那么还不如说其已经变成了将后端接口从原来的SAS换为PCIe 主控+PCIeSwitch的传统Raid控制器了,也就是接下来的选项之三。
该选项应该说是比较正统的想法,之前的两个选项稍显奇葩。但是这种方法带来的一个问题则是Raid控制器的成本会非常高,同时其性能还不见得好。NVMe协议+PCIe为何能够发挥出固态盘的性能?主要是两个方面:协议栈的精简加上CPU到PCIe设备链路层一跳直达充分降低了时延,再就是加大的队列数量和队列深度,充分提升了并发度从而极大提升了吞吐量。而如果采用外部硬Raid控制器来做Raid,结果将是:由于Raid控制器属于带内虚拟化设备,其会终结掉前端的协议和IO请求,将数据拷贝到内部缓冲,然后进行Raid处理,再重新向后端SSD发起IO请求,这便让NVMe协议对IO时延的降低荡然无存。
其次,由于硬件电路资源的限制,硬Raid控制器内部不会有太高的并发度,因为无法做太多的硬寄存器队列进去。
第三点,如果硬Raid控制器同时支持SAS/SATA/NMe硬件接入的话,那么势必会产生快慢盘效应,也就是NVMe固态盘的性能会进一步被SAS/SATA接口的盘拖慢,因为后者响应慢,其对芯片内部资源迟迟得不到释放,从而导致快盘性能受牵连。
第四点,在运维方面,会带来不便,比如,无法利用一些工具直接在主机端查看NVMe SSD内部的状态,因为Raid控制器完全屏蔽了NVMe盘,主机端OS根本看不到它,无法对其直接操作,想要细化的功能,就必须在Raid控制器固件中开发对应的工具,取回对应的信息,然后利用Raid控制器提供的工具来查看,这个非常不方便,完全将NVMe固态盘的运维排除在外。
第五点,硬Raid控制器固件里很难实现对固态盘的特殊优化,比如全局磨损均衡,动态负载优化等等专门针对固态介质而考虑的特性,Raid控制器厂商对固态盘的管理是不在行的,而且受限于内部运行资源的限制,不可能在短小精悍的固件中做很复杂的功能。
冬瓜哥看来,利用传统硬Raid控制器做Raid的最大一个优点是能够维持传统的使用习惯,而其他则全是缺点。
噗~~。有人会不以为然了,软raid?别搞笑了。软的怎么会比硬的更强呢?在十几年前,这么说似乎没什么问题,但是放到现在,事情变了。十几年前是CPU不够用的,再让他计算软Raid,当然力不从心;而现在是CPU核心数量暴增,频率不能说是暴增但也上去了,已经性能过剩了,尤其是核心数量方面。再加上Linux自带的软Raid模块是没有经过优化的。经过优化的软Raid,在性能上完爆硬Raid。这一点可以看看目前的传统SAN存储系统,其利用单路CPU就可以达到远高于Raid卡的性能,其内部都是软Raid的方式。
硬Raid控制器内的嵌入式CPU的频率一般在1GHz左右,核心数量一般在2~3核,不管是频率、核心数量,还是其内部的执行性能,都远远比不上Xeon服务器CPU。若不是为了维持传统的使用习惯,硬Raid控制器的地位恐怕早已今非昔比了。对于机械盘Raid,硬Raid绰绰有余,但是对于NVMe固态盘做Raid,我们必然首选利用服务器本地的CPU加上经过优化的软Raid模块来做Raid,这样可以保证:IO数据依然一跳直达,从host主存直接拷贝到SSD保证时延降低不是太多、有充足的RAM资源可以容纳更多的队列保证吞吐量、host可以直接控制NVMe固态盘获取对应的信息方便运维、基于开放平台Linux开发方便容易增加更多功能比如针对固态盘的特殊优化、host端资源充足且固态盘与机械盘走不同的协议栈所以不会有快慢盘效应。
这样一说,软Raid全是优点了?只要经过充分的优化,全是优点。唯有一点需要注意,突然故障宕机时如何保证数据一致性的问题,软Raid不能采用write back模式的缓存,否则将丢数据,但是可以用一些手段规避这个问题,比如就用write through,或者利用NVDIMM/NVRAM来承载数据缓存。
有人针对实际测试,使用Linux内核自带的mdraid模块,将4块Intel 750的NVMe SSD做Raid5,写性能只能到70K IOPS左右,可见其效率之低下。当前Linux自带的软Raid是无论如何也无法满足固态存储场景下的基本需求的。
另外,目前的内核自带软Raid也并没有在其他方面对固态盘场景做感知和优化,比如寿命问题,SSD的寿命是可预知的,很有可能同一个Raid组中的多块固态盘短时间内同时达到寿命终点从而引起多盘失效而丢失数据;再比如Raid组的初始化过程,是个完全浪费时间和没有必要的过程,只会白白浪费固态盘寿命;无法感知逻辑数据对象(比如逻辑盘),只能整盘重构,白白浪费寿命。
Memblaze(忆恒创源)作为国内知名固态存储提供商,曾经推出过国内第一块NVMe SSDPblaze4,能够达到将近800K的IOPS。
为了持续建设NVMe生态,开发一款能够发挥出NVMe固态盘性能的软Raid模块的这个设想,很早就引起了公司内部的重视。终于,在2016年的6月份,Memblaze将隆重正式发布这款产品——FlashRaid TM 。先来看看其是否强劲:
FlashRaid性能如此强悍的关键原因在于无锁队列技术。FlashRaid模块在达到百万IOPS时对CPU耗费也就是30%左右,Xeon 2640双路,30核心。FlashRaid的开发负责人吴忠杰表示,mdraid模块内部对多线程的优化太差,存在大量锁,效率非常低,尤其是处理写IO的时候。而FlashRaid团队的专家们经过反复思考,最终找到了能够实现基于无锁队列的生产者消费者模型的办法,并申请了专利。无锁队列的好处就是总体性能能够能够随着线程数的增多而呈现更好的线性增长特性。IO根据目标LBA地址范围被Hash然后均衡的下发到多个队列中。
除了性能方面的优化,FlashRaid在架构、固态存储感知优化等方面大量采用及创造业界前沿技术,可以说是一场技术盛宴!
整体架构上,FlashRaid采用Raid2.0思想实现。一组物理盘首先被逻辑分割为chunk,多个chunk形成storagepool(可创建多个池),池内的chunk与chunk之间做成各种类型的Raid组从而组成一个条带,也就是container,然后多个container再组成逻辑卷。Chunk的大小是可调节的。Container的chunk该如何在众多chunk中分配,由Resource Allocator根据多方面因素优化决定。
Raid2.0架构的好处就在于能够极大加快重构速度,以及智能重构,只重构被数据块占用的区域。
假设某个存储池内有两块硬盘损坏,某个Raid6类型的container中恰好有两个chunk分别属于这两块硬盘;同时,另一个Raid6类型的container中只有一个chunk落入了这两块硬盘中的任意一块中,此时,前者这个chunk的处境更加危险,因为其已经没有冗余性了,而后者这个chunk依然能允许一块盘故障,此时FlashRaid会智能判断该场景并且优先重构第一个container。该技术的确为业界创新技术,冬瓜哥之前没有看到过任何其他产品实现该技术。同理,在一块盘故障之后,受影响的Raid5类型的container总是优先于受影响的Raid6类型的container得到重构。
如果遇到某个数据块发生不可恢复错误,那么系统会动态实时的对该块进行重构,而无需等到整个盘故障后才重构。
初始时,用户选择使用4D+1P方式的条带/container,但是可能池中的某个SSD容量不够了,系统此时会在后台动态的将4D+1P条带改变为3D+1P,该过程为透明后台执行,不会影响前端应用的IO访问。
当某块SSD的寿命剩余较多时,会拥有最高的被分配权重,这样可以均衡寿命,而当池中的所有SSD的寿命均耗费殆尽的时候,为了方式寿命过于均衡可能导致的同时多盘失效,此时系统启动逆均衡措施,强行选择寿命即将耗尽的SSD,增加其数据写入权重,这样,其就会有更大几率先于其他盘坏掉,然后系统发起重构恢复冗余性。
除了上述特色之外,FlashRaid还专门对运维方面做了一些增强,比如对链路闪断进行处理,对磁盘热插拔进行处理等等。另外,FlashRaid具备良好的可移植性,并且对SPDK做了适配,可以迁移到用户态空间运行。
FlashRaid绝非仅仅是一款普通的Raid管理模块,FlashRaid的最终形态会是一款具备强大功能的存储系统平台了,得益于其对固态存储优秀的优化,其被广泛用于分布式块存储系统底层的那一天,很快就会到来!