分布式文件系统里的EC和RS编解码的效率问题

来源:互联网 发布:心动网络官网电脑版 编辑:程序博客网 时间:2024/06/05 04:34

      erasure code(纠删码)是通信、计算机领域常用技术。对于存储技术而言,纠删码是提高数据冗余和降低成本之间的一种折中。

传统盘阵上用的raid4、raid 5也是一种简单的ec,数据冗余度较低,编解码只是简单的异或操作。

      分布式文件系统领域副本技术是最常见的提高数据冗余度的方法。但是副本的方式空间利用率太低,双副本也就50%。采用ec对于分布式文件系统而言,可以提高空间利用率,但是也带来的一定的性能损耗和管理复杂度。支持ec的分布式文件系统并不太多。isilon的oneFS是支持ec的,但是其编码比例比较固定的,最多不能超过n:4。HDFS最初也不支持ec,后面有社区做了ec的补丁。facebook对于社区的最新贡献是对传统的rs编码方式的ec做了改进,提出了一种LRC编码(locally reparable code)。

http://storagemojo.com/2013/06/21/facebooks-advanced-erasure-codes/


      想谈下RS(Reed Solomon)编码的效率问题。RS编解码矩阵的计算的损耗可以不考虑,因为编解码矩阵肯定是提前算好的。那这里需要考虑的就是编码时复杂的矩阵乘法。RS编码是基于有限伽罗华域上的运算。rs码的矩阵乘法而言,涉及两个操作“乘法”、“加法”。伽罗华域的加法比较简单,对计算机而言就是异或。乘法比较复杂。传统的RS码采用GF(2^8)域上的乘法。GF(2^8)域总共有2^8(256)个不同的数字,如果每次编码时都需要计算这些乘法,效率非常低。如果提前算好存下来,编码时只是去内存里面取以下,这样就不需要复杂的乘法计算,这也是空间换时间的一种trade off。对于8位的rs码而言,需要(1+2^8)*2^8,大约2^(8*2-1) byte=32k byte来存储这些结果,对于现代计算机而言32k根本不算什么。如果是16位的编码,需要2^(16*2-1)*2 byte=4G byte来存储这些结果。4G的内存消耗有些大,但也并非无法承受。但是到了32位的rs吗而言,这种方法已经完全无法实现了,因为内存消耗达到了惊人的2^(32*2-1)*4 byte = 32 e byte。

      对于通用处理器而言,伽罗华域的乘法过于复杂。当然128位的rs码也并非完全不可能。如果用空间换时间不行,那就只好时间换空间。伽罗华域的乘法结果只能每次临时算出来,这就需要专门的ASIC芯片或者用LPGA之类的方法直接用硬件算出来。