这一段时间一直在考虑一个基于存储虚拟化的系统,从数据可靠性的角度遇到了一个很棘手的问题。

存储虚拟化技术已经在很多领域得到了应用,例如,如下图所示,在Vmware虚拟机环境中为了提高IO的效率,需要采用虚拟虚拟化技术,将多个虚拟机发送的IO请求更好的顺序化,从而提高IO性能。在SSD存储领域,采用虚拟化技术解决Nand Flash的性能损耗问题,平衡Nand Flash块的寿命。在磁盘阵列领域,目前有一些厂商采用虚拟化技术发掘磁盘的寿命潜能,将磁盘的数据块进行重定位,从而可以最高效的利用磁盘,并且将磁盘重构时间缩短到最小。

 

存储虚拟化技术的一个核心思想是将物理磁盘资源进行细粒度管理,并且动态的将物理块资源按需分配给逻辑设备。上层应用使用的是逻辑设备,通过虚拟化层可以很容易的知道存储设备使用了多少物理资源,一旦物理资源出现问题的时候,可以通过数据迁移等办法将数据进行重新分布。由于对物理资源和逻辑资源进行了细粒度管理,因此,可以很灵活的对数据安全性进行预测,然后进行数据重映射。当然,在存储虚拟化技术中,数据块的按需分配策略非常重要,针对不同的应用需求,可以采用不同的块分配策略。逻辑块和物理块之间的简单分配示意图如下所示:

 

在存储虚拟化技术应用的过程中,数据安全性问题需要特别考虑。当物理块出现问题的时候,虚拟化层往往需要做的事情是对数据的重映射和数据迁移,如下图所示:

 

数据重映射问题不是很大,因为此时数据还在内存中,除非内存存在问题。但是,data migration存在很大风险,虚拟层将数据从源块中获取数据,然后写入新块。如果,源块中的数据已经遭到破坏,那么虚拟化层根本无法检测到这种错误,还会将数据写入新块中。由于虚拟化技术通常减少了上层应用的出错情况,无效数据迁移方法会将错误累积,从而最终面临数据无法恢复的问题,在没有虚拟化技术的情况下,上层应用会做更多的出错处理,从而能够检测、恢复silent坏块。当然,如果上层应用做周期性的verify,这个问题还是会减缓的。
 
虚拟化技术引入了可靠数据迁移的新话题,那么如何实现可靠的数据迁移呢?这是存储虚拟化需要考虑的问题。在做实验系统的时候我们不会考虑这些问题,但是,对于实际系统,这才是设计的关键。为了解决这个问题,我想SCSI层的端到端数据校验标准是一个非常不错的选择,在硬件的支持下,在提高数据可靠性的前提下,还不会对性能造成太大的影响。但是,目前该标准只支持SAS盘,因此,在没有该标准支持的情况下,我们可以通过加入额外校验信息来提高数据可靠性,但是,显然性能就会存在很大的问题。对于backup系统而言,这样的性能损失是可以接受的,但是,对于primary storage而言,这是无法接受的。
 
因此,在存储虚拟化技术被大量应用时,我们需要在IO路径考虑更多的数据完整性问题,个人觉得应该加快端到端数据完整性标准的推广和应用。