论文部分内容阅读
大规模分布式存储为现代的商业计算、科学计算等应用提供底层的数据存取服务,已经成为现代社会的信息基础设施。随着数据规模的急剧膨胀,现代分布式存储系统中节点的规模往往达到百万级以上,数据的规模也达到PB级甚至EB级。数据失效已经成为大规模存储系统常态化的行为,因此如何提高容错能力已经成为分布式存储系统所面临的严峻挑战。分布式存储主要通过数据冗余提高数据的容错能力。常用的容错技术包括基于复制的容错技术和基于纠删码的容错技术。基于复制的容错技术通过为每个数据对象创建多个副本来提高容错性,存储开销巨大,难以适应大数据时代的数据规模。基于纠删码的容错技术能够在保持相同容错能力的基础上,极大地降低存储开销,成为当前分布式存储领域研究的热点。基于纠删码的容错技术面临的主要挑战在于:(1)现有的串行编解码方法效率较低,极大的阻碍了纠删码在分布式存储中的应用;(2)在有数据块失效的情况下,数据的读取效率急剧下降,难以满足用户的数据访问请求;(3)修复失效数据块时需要传输大量的数据,修复成本高。本文围绕上述挑战,针对基于纠删码的容错技术进行了深入研究。目前已有的纠删码串行编解码方法在单个CPU核上因伽罗瓦域上的计算开销较大导致其编解码效率较低,并行化技术是提高编解码效率的一种重要方法。但是目前已有的并行编解码方法则存在如下问题:(1)局限于特定的硬件平台或者某种特殊的纠删码方法导致其适用范围有限、通用性较差;(2)并行化时没有深入分析纠删码的编解码特点以及数据读写的I/O特性导致并行化的效率不高;(3)采用系统默认的线程调度策略导致线程切换开销较大。针对上述问题,提出了一种面向多核平台的通用并行编解码方法ParaErasure。在ParaErasure方法中,首先对并行编解码过程进行分析建模,提出了一种能够适用于所有纠删码的通用多线程并行编解码模型MTPErasure;其次在MTPErasure的基础上针对不同的I/O环境分别提出了两种不同的并行编解码算法。针对高速I/O环境下数据吞吐量大导致不同线程之间的数据同步开销相对较大的特点,提出了一种基于静态数据划分的并行编解码算法sdaParallel。该算法采用静态数据划分的方法,将需要编解码的数据对象静态地划分成若干更小的数据对象,再为每个小数据对象分配一个单独的线程实现数据的读取、编解码以及写入过程,以降低高速I/O环境下线程之间的数据同步开销并提高编解码效率;针对低速I/O环境下数据吞吐量小导致线程切换的开销相对较大的特点,提出了一种基于动态数据划分的并行编解码算法ddaParallel。该算法采用动态数据划分的方法,将需要编解码的数据对象按照编解码的基本单位划分成条,由两个单独的I/O线程分别执行数据条的读取和写入,由多个编解码线程动态地对读写就绪的数据条执行编解码过程,以降低线程切换开销并提高编解码效率。在paraerasure方法中,提出了一个独占式的线程调度算法使得编解码线程可以在一个cpu核上运行尽可能多的时间从而降低线程切换开销。实验结果表明,与目前已有的串行编解码方法相比,paraerasure方法在低速i/o环境下的加速比达到1.3倍以上,在高速i/o环境下的加速比达到5倍以上,显著提升了纠删码的编解码效率。目前已有的数据分块方法把原始数据对象简单地分割成若干个大小相等的数据块,因此地址连续的数据条被分配到同一个数据块,导致在数据块失效情况下执行数据读取操作时,需要从多个节点读取大量的数据以解码修复得到用户请求的数据,带来较大的网络传输开销和解码计算开销,影响数据读取效率。针对已有分块方法存在的上述开销较大且效率较低的问题,提出了一种基于条映射的离散数据分块方法d-dividing。d-dividing方法按照编解码的基本单位将数据对象分割成大量的数据条,然后依据映射的方式对数据条进行分组,以完成数据的分块过程。d-dividing方法在对数据条进行映射时,为了最小化分块以后数据读取操作的网络开销和计算开销,以降低数据块失效情况下数据读取时的数据传输总量和解码计算量为目标,把在原始数据对象中位置连续的数据条离散地映射给不同的数据块。在数据块失效的情况下,d-dividing方法使得数据读取过程中每一次解码计算均能够获得用户请求的若干个地址连续的数据条,而在传统分块方法中每次解码计算往往只能得到一个用户请求的数据条。因此,d-dividing方法能够降低数据读取时的网络传输开销,同时减少解码计算的次数,提高数据读取的效率。实验结果表明,与目前已有的数据分块方法相比,当有超过2个数据块失效时,d-dividing方法降低了50%的数据传输总量,减少了40%的解码计算次数,提升了约1倍的数据读取效率。针对目前已有的多节点并行修复方法因链路竞争导致成功修复概率和数据可用性均较低的问题,提出了一种基于分组迭代的多节点并行修复方法gimpr。gimpr方法把对多个失效节点的修复转化成一个可以迭代执行的循环过程,每一次迭代循环被分成三个步骤:(1)从所有失效节点中选择部分失效节点组成一个可以并行修复的分组。为了提高分组内失效节点的数量以增加修复的并行度,提出了一种基于贪心策略的分组构建算法gsgc,该算法按照属于不同数据对象的失效节点优先的方式,不断地把提供节点集合互不相交的失效节点加入到分组中,直到分组中节点的数量达到最大;(2)为分组中的每个节点构建修复拓扑。为了降低分组中每个失效节点的修复开销,提出了一种基于生成树的自适应修复拓扑构建算法artc。artc算法把尽可能多的提供节点包含到修复拓扑中以减小数据传输总量;(3)对分组中的所有失效节点并行地执行修复。修复时采用再生码技术,让修复需要的数据沿着树型结构的修复拓扑从叶节点向根节点传输,并在中间节点进行编码合并以减小网络开销。一个分组中的所有节点完成修复以后,进入下一次迭代循环,此时已经完成修复的分组中的提供节点和替代节点均可以作为尚未完成修复的分组中的失效节点的提供节点以减小数据传输量。实验结果表明,与目前已有的并行修复方法相比,GIMPR方法能够提高成功修复概率30%以上,提升数据可用性30%以上,提升修复效率达到50%以上。