HDFS RAID实现方案
分布式文件系统主要用于解决海量数据存储的问题,如Goolge、Facebook等大型互联网企业都使用分布式文件系统作为数据存储的基础设施,并在其上构建很多服务,分布式文件系统通常采用三副本的策略来保证数据的可靠性,但随着应用数据量的不断膨胀,三副本策略为可靠性牺牲的存储空间也越来越大,如何在不降低数据可靠性的基础上,进一步降低存储空间成本? Facebook将erasure code应用到内部HDFS集群中,该方案使用erasure code代替传统的三副本策略,在保持集群可用性不变的情况下,节省了数PB的存储空间,Facebook的实现方案(HDFS RAID)目前已贡献给开源社区。
Erasure code
如下图所示,HDFS要想容忍2个block的丢失,则需要为每个block创建3个副本,存储空间成本为数据量大小的3倍。而采用RS编码,只需要1.4倍(10个数据块、4个校验块)的存储开销,能容忍4个block的丢失。(RS的原理请自行google)
HDFS中的文件通常很大,文件有多个固定大小(64M)的block组成,block一旦写满就不会再更改,HDFS RAID以文件为单位计算校验,并将计算出来的校验block存储为一个HDFS文件。HDFS-RAID目前支持Raid5和RS(Raid6可用RS实现)两种编码方式,下图为副本、Raid5、RS三种方案编码的对比,其中副本方式存储空间成本最高、但能获得较高的读写效率(多副本并行服务);RS方案存储成本最低,但数据存储、恢复时计算开销较大。
DRFS总体架构(Distributed Raid File System)
- DRFS: 应用了RAID方案后的HDFS。
- RaidNode:对需要存储在DRFS中的文件,从HDFS DataNode中读取文件(source file)对应的数据块,并计算出校验块文件(parity file,所有的校验块组成一个HDFS文件),并将parity file存储在HDFS中);RaidNode周期性的检查所有文件对应的block数据是否丢失,如果丢失,则需重新计算以恢复丢失的block。
- DRFS client:提供访问DRFS中文件的接口,其在HDFS client接口上进行封装,当读取到已丢失的block时,透明的计算恢复的block数据并返回给应用。
- RaidShell:DRFS管理工具,可人工触发文件block检查、丢失block的恢复等。