NCCloud:多云存储设备下存储修复的网络编码

Yuchong Hu, Henry C. H. Chen, Patrick P. C. Lee, Yang Tang 

摘要:近年来的研究提出通过条带化地将数据存放在多个云存储设备上使云存储拥有容错能力。如果一个云存储设备发生永久性故障并且丢失了其存储的全部数据,我们需要利用剩余存活的云存储设备来修复失效的数据来保证存储数据的完备性。针对多云存储设备存储,我们提出一个称为NCCloud的基于代理的系统,旨在完成存储系统中单节点永久故障的高效恢复过程。NCCloud系统是基于一种被称为再生码的网络编码存储机制实现的。特别的是,我们设计实现了一种F-MSR再生码,它在维护和保证相同水平的数据冗余和传统擦除码存储要求的前提下,可以使用更少的资源。我们搭建了用于概念验证的NCCloud原型系统,并将其部署在本地和商业云上。通过实验证明F-MSR纠删码的存储效率要优于传统的RAID-6纠删码,且两种纠删码在完成一般云存储操作时有相近的响应时间表现。

1    介绍

云存储系统提供了一个基于需求的远程备份解决方案。然而,由于使用单一的云存储平台容易出现单点故障等问题,一个合理的解决方案是将数据分段地存放在不同的云存储设备上。虽然常用纠删码系统中的分段数据在一些云存储节点出现短期或可预见的永久性故障时仍可以保持良好的数据可用性,但实际中的使用情况表明,存储设备永久性故障的发生并不总是可预见的。

本文主要针对云存储设备中不可预见的故障进行研究。当一个云存储设备发生永久故障时,系统需要启动存储修复流程以维持数据冗余的水平。修复操作将会从剩余存活的云存储设备上读取数据,然后在一个新的云存储设备上重构恢复出丢失的数据。考虑到成本因素,在恢复数据和迁移数据时,需要尽可能地减少使用的数据量。

目前相关的研究基于分布式存储系统提出了再生码技术。再生码是建立在网络编码概念上一种编码技术。它们的主要原理是通过智能地混合现有存储节点上所存放的数据块,然后在一个新的存储节点再生恢复数据。有研究表明,在保证同样的容错能力下再生码相比于传统的纠删码会占用更少的数据修复流量。尽管有良好的性能,再生码在目前仍处于理论背景研究阶段。关于再生码的在真实应用环境中的众多实用性能仍存在不确定性,尤其是再生码编码产生的开销。

在本文中,我们为多云存储环境设计了一个基于代理的存储系统,即NCCloud存储系统。我们针对最小存储再生码(F-MSR)提出了第一个可实施的设计方案,尤为重要的是,我们解决了在现有的理论研究中关于存储节点编码操作过程的需要。我们的F-MSR编码在保证双容错能力的前提下,具有与传统RAID-6纠删码编码方案相同的存储代价,但在恢复单点故障时F-MSR编码会使用更少的修复开销。另一方面,不同于大多数纠删码编码是系统性的(原数据块会被保留),F-MSR编码是非系统的,它只线性地存储联合编码块。虽然如此,F-MSR仍然适合于读操作较少而且数据长期保存的归档系统。

实际部署测试中,F-MSR码在四云节点存储的环境下相较于RAID-6码节省了25%的数据修复开销,并且随着云节点数量的增加可上升到50%。另外,我们在本地云和商业云的设置上进行了大量的实验评估。实验结果表明我们的F-MSR实现过程只增加了一个较小的编码开销,这个开销与互联网中文件传输时间相比几乎可以忽略。因此,我们的工作验证了通过NCCloud实现的F-MSR编码的实际可用性,也会促进再生码在大规模部署中的更加深入的研究。

2    F-MSR的意义

当我们从客户端的角度来分析分布式多云的存储配置时,可以把它看作是我们条带化地将数据分段存放在多个云存储设备上。我们提出了一个基于代理的设计来内部互连多个云存储库,如图1(a)所示。代理服务器充当客户端应用程序和云存储设备之间的接口。如果云存储设备出现永久性故障,代理服务器将会启动恢复操作,如图(b)所示。在数据修复过程中,代理服务器从存活云存储设备上读取必要的数据块重构出新的数据块,并将新的数据块写到一个新的云存储设备上。值得注意的是,这个修复操作不会涉及到云存储设备之间的正常直接互动。


图 1:多云存储中基于代理的设计:(a)正常操作,(b)云节点1出错时的修复操作。

我们分析了基于最大距离可分(MDS)码的容错存储系统。在一个没有实现纠删码的系统中给定一个文件对象后,我们将其分成大小相等的原始块,将被存储在k个云存储设备上。这些原始块在编码过程中通过线性组合形成编码块。原始块和编码块被分布在n>k个云存储设备上。当使用MDS编码时,原始文件对象可以重建包含在n个云中任意k的块。因此,它容忍任何n-k的云存储设备出错。我们称之为纠删码的MDS性质。F-MSR的特性则是重建一个原始块或代码块只需要从存活云存储设备中读取少于50%的数据来实现,传输的数据量要少于重构整个文件。
本文考虑了一种多云存储的配置环境,支持双节点的容错(例如,RAID-6),在至多两个云故障(例如,一段时间的断电)时仍然可以保证全部数据的可用性。也就是说,我们设置k=n-2。我们假设在实践中达到这样的容错级别就足够了。在云存储数据迁移时,考虑到永久性故障是不频繁但又有可能出现的,我们设计的主要目标是减少存储系统中修复单节点故障时消耗的代价。
现在我们通过一个例子来展示F-MSR是如何保存修复流量的。假设我们在四个云上存储大小为M的文件,每一个被视为逻辑存储节点。我们首先考虑双容错RAID-6纠删码。我们认为RAID-6的实施基于Reed-Solomon码,如图2所示。我们把文件分成大小为M/2的两个原始块(即A和B)。我们增加了通过原始块的线性组合形成的两个代码块。现在假设节点1停机,则代理必须下载相同数目的块从其他两个节点作为原始文件(如B何A+B的节点2和3)。然后,在新的节点上重建和存储丢失的块。当修复流量是M时,总的存储容量是2M。
现在我们考虑在基于代理的设置中实现双容错的F-MSR,如图2 所示。F-MSR将文件划分为四个原始块,并且通过原始块不同的线性组合形成P1到P8的八个不同编码块。作为原始块的每一个代码块具有相同的大小,即M/4。任意两个节点可以用来恢复初始的四个原始块。假设节点1故障。代理从每个幸存节点收集一个代码块,每次下载大小为M/4的三个代码块。则代理由三个代码块的不同线性组合重新生成两个代码块P1和P2。注意,P1和P2仍是原始块的线性组合。然后代理将P1和P2写到新节点。在F-MSR中,存储大小是2M,但是修复流量是0.75M,节省了25%的开销。
对F-MSR的n个存储节点进行概括,我们把大小为M的文件分配到2(n-2)个原生块中,并生成4(n-2)个代码块。然后每个节点将存储两个大小为M/[2(n-2)]代码块。所以,总的存储大小为Mn/(n-2)。要修复出现故障的节点,我们从n-1个结点中的每一个下载一个块,所以修复流量是M(n-1)/[2(n-2)]。相比之下,对于RAID-6来说,总的存储大小也是Mn/(n-2),然而他的修复流量是M。当n足够大时,F-MSR可以节省的修复流量接近50%。
需要注意的是F-MSR只保留代码块,而不是原始块。要访问某文件的单个块,我们需要为特定块下载和解码整个文件。然而,F-MSR是可接受的长期存档应用,其读频率通常较低。另外,为了恢复备份,是很自然检索整个文件,而不是一个特定块。
本文考虑实现使用Reed-Solomon码的基线RAID-6编码。它的修复方法是重建整个文件,并普遍适用于所有纠删码。最近的研究表明数据读取开销可以通过使用异或纠删码来被最小化。例如,在RAID-6中,相比重建整个文件,数据读取被减少了25%。虽然这种方法不是很理想(在RAID-6中,F-MSR可以节省的50%的修复流量),但对异或纠删码的有效使用仍然具有重要的意义。


图 2:在RAID-6(n=4)和F-MSR(k=2)中数据修复实例

主要参考了 少年颜子 的译文:http://blog.csdn.net/guotianlaile/article/details/51397582

这里只进行了部分内容的翻译,少年颜子 的翻译博文相较来说更加完整。膜拜大神!!!

【译】NCCloud: Applying Network Coding for the Storage Repair in a Cloud-of-Clouds的更多相关文章

  1. Method and Apparatus for Providing Highly-Scalable Network Storage for Well-Gridded Objects

    An apparatus comprising a plurality of storage nodes comprising a plurality of corresponding storage ...

  2. Exam E05-001 Information Storage and Management Version 3 Exam

    Emc 考试 e05-001信息存储和管理版本3考试 [总问题:171] 哪种 emc 产品提供软件定义的存储基础架构的自动监视和报告? A. viprSrmB. 斯纳普内C. 阿瓦马尔D. 快速副总 ...

  3. Coding the Matrix (0):映射、复数和域

    1. 非常好的 Python 教程 <深入 Python 3.0> 以及 IBM 开发社区的博客探索 Python. 2. 子集: s 是 S 的子集 >>>S = {2 ...

  4. AngularJS Front-End App with Cloud Storage Tutorial Part 1: Building a Minimal App in Seven Steps

    原文 : http://www.codeproject.com/Articles/1027709/AngularJS-Front-End-App-with-Cloud-Storage-Tutoria ...

  5. Low-overhead enhancement of reliability of journaled file system using solid state storage and de-duplication

    A mechanism is provided in a data processing system for reliable asynchronous solid-state device bas ...

  6. End-to end provisioning of storage clouds

    Embodiments discussed in this disclosure provide an integrated provisioning framework that automates ...

  7. Virtualization of iSCSI storage

    This invention describes methods, apparatus and systems for virtualization of iSCSI storage. Virtual ...

  8. Java Client for Google Cloud Storage

    关于Google Cloud Storage Google Cloud Storage有益于大文件的存储与服务(serve).此外,Cloud Storage提供了对访问控制列表(ACLs)的使用,提 ...

  9. [Windows Azure] Create a Virtual Network in Windows Azure

    Create a Virtual Network in Windows Azure This tutorial walks you through the steps to create a basi ...

随机推荐

  1. POJ Washing Clothes 洗衣服 (01背包,微变型)

    题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...

  2. 开源项目: circular-progress-button

    带进度条显示的按钮, 其效果如下所示: 其由三部分动画组成: 初始状态->圆环状态->完成状态. 0. 实现从初始到圆环的简单实现: 继承自button 类, 设置其背景 public c ...

  3. [洛谷P4556][BZOJ3307]雨天的尾巴-T3订正

    线段树合并+树上差分 题目链接(···) 「简单」「一般」——其实「一般」也只多一个离散化 考试时想法看>这里< 总思路:先存所有的操作,离散化,然后用树上差分解决修改,用权值线段树维护每 ...

  4. vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

    vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

  5. python matplotlib.pyplot对图像进行绘制

    imshow()是对图像进行绘制 imshow()函数格式为: matplotlib.pyplot.imshow(X, cmap=None) X: 要绘制的图像或数组. cmap: 颜色图谱(colo ...

  6. MySQL插入SQL语句后在phpmyadmin中注释显示乱码

    自己写一个建一个简单的数据表,中间加了个注释,但是用PHPmyadmin打开后发现注释不对. 就先查询了一下sql 语句 发现SQL 语句并没有问题,感觉像是显示编码的问题,就先用set names ...

  7. Java中的日期(Calendar、Date)

    (1)获取当前日期: java.util.Calendar calendar = java.util.Calendar.getInstance(); 或  = new java.util.Gregor ...

  8. ios 登录功能学习研究

    登录功能是我在湖畔做的第一个需求. 当时PD给我的草图和下图类似: (图片来自知乎iOS客户端登录界面) 不过需求中要求用户名或者密码错误时,输入框要抖动(类似Mac登录密码错误的抖动效果). 如果实 ...

  9. virtualenvwrapper.sh报错: There was a problem running the initialization hooks.解决

    由于在ubuntu环境下,将python做与python3.6做了软链接(ln -s python python3.6),并且pip也被我做了软链接,所以导致用pip安装virtualenvwrapp ...

  10. 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程

    前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...