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。
NVMe固态盘做Raid的几个方式分析
选项之一:NVMe Over SAS
既然ATA和SCSI都可以over SAS,那么为什么不能把NVMe协议也Over到SAS呢?其实理论上是完全可以的。SAS Expander中每个端口都有个叫做STP bridge的桥接电路,就是这个电路负责生成SATA链路对应的信号,从而才可以与SATA盘通信,而如果在SAS Expander中增加一个PCIe的主控端,负责生成PCIe信号,由SAS Expander固件负责对PCIe固态盘进行初始化配置。但是冬瓜哥认为这样做理论上可以,但是复杂度并不亚于前一种方案。
选项之二:在PCIe Switch上做Raid
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控制器了,也就是接下来的选项之三。
选项之三:在现有SAS/SATA Raid控制芯片中增加PCIe Switch
该选项应该说是比较正统的想法,之前的两个选项稍显奇葩。但是这种方法带来的一个问题则是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的最大一个优点是能够维持传统的使用习惯,而其他则全是缺点。