这两天总能遇到一些数据完整性问题。例如系统的暴力关机导致元数据信息的损坏,硬件问题导致元数据和数据的损坏。这些问题的发生很难定位和避免,为此有人提出是否采用端到端的技术方案就能解决数据完整性问题呢?在此,我对这种技术解决方案进行了一些思考,认为端到端的解决方案不能从根本上解决data corruption问题,但是可以很好的避免错误数据写入磁盘或者读出交给应用。

首先,什么是端到端的数据校验解决方案?其实从这个名称我们也可以很容易的推断出这种解决方案的技术思路:
 

 

在应用层发送数据的时候,为每个sector计算CRC校验和信息,然后将带有校验信息的数据包发送至disk。Disk 在接受到数据包之后,磁盘重新计算校验和信息,并且和接受到的校验和信息做比较,如果发现错误,那么磁盘认在整个IO path上存在错误,返回IO操作失败。通过这种方法,应用层可以很明确的知道一次IO请求是否存在问题,如果操作成功,那么磁盘上的数据必然是正确的。目前,主要有两种端到端校验方案:一种是DIF,主要是从HBA至磁盘之间进行数据校验;另一种是DIX,从应用层至磁盘进行整个IO Path链路的数据校验,上图描述的就是DIX。
 
从技术思路上来看,这种解决方案实际上就是前馈校验。在通信系统中,这种技术被大量应用,并且接收端在发现错误的时候能够从纠错码中恢复出数据。在没有这种技术支撑的情况下,存储应用中为了保证数据写入的可靠性,在数据写完成之后还需要通过读操作来验证数据的正确性。后者是反馈校验方法。从这点上来看,SCSI端到端校验有一定的优势,采用前馈的方式,在不太影响IO性能的情况下,可以提高数据读写的完整性。
 
但仔细分析,这种解决方案有一定的弊端:
 
1,为了提高IO的吞吐量,写操作往往采用异步方式。在这种情况下,即使磁盘发现数据错误,但是应用以及失去错误处理的机会。所以,异步写操作会对这种技术产生一定影响。端到端的解决方案一开始是Oracle提出来的,我就在想是不是Oracle只是采用这种技术保护数据的元数据操作呢?因为元数据的更新往往是同步的。
 
2,端到端的校验只能保护应用数据的完整性,但是,无法解决目的地址错误导致的data corruption的问题。例如,由于HBA Firmware等问题导致数据包路由目的地址发生错误,本该写到LBA0位置的数据包被写到了LBA1的位置,在这种情况下,端到端的校验根本没有办法发现这个问题,从而同样导致数据完整性问题。在这种情况下,反馈系统比前馈系统更有优势,通过反馈读操作可能会发现上述问题。
 
3,端到端的解决方案初看比较简单,但是,实际上涉及的模块非常多。应用层首先需要支持这样的功能,HBA同样需要支持,并且在硬件上需要支持更加复杂的Scatter Gather DMA功能,而且需要将磁盘提供的520字节扇区映射到512字节和8字节校验。磁盘厂商需要支持这样的功能,需要进行数据的CRC计算。如果硬件RAID厂商想要用这种解决方案,那么RAID同样需要支持这种标准。因此,一个端到端数据校验的解决方案将会涉及到很多层面上的问题,并不是很容易进行推广的技术。
 
个人认为端到端校验起码可以解决应用数据在传输过程中的数据完整性问题,比目前开环系统而言是一大进步。因此,这种技术值得关注和采用。