原文:《Erasure Coding in Windows Azure Storage.pdf》,地址:https://www.usenix.org/system/files/conference/atc12/atc12-final181_0.pdf

WAS: (LRC, Local Reconstruction Codes)

1       概述

(1)       Extent

当extent的大小达到一定值,extent就被sealed. Sealed的extent不能再被修改,作为编码的候选。WAS 在后台lazily地编码这个extent,一旦extent被编码成功,extent原始的3备份要被删除。

(2)       LRU

A (k, l, r), k个数据段(data fragments),分成l个组,每个组生成一个本地编码块(local parity fragments),所有数据段,生成r个全局编码块。(6, 2, 2)

(3)       Checking Decodability

swap local parity and data fragment , 然后检查删除的数据段和全局编码段的个数是不是小于全局编码段的个数,如果是,表明可解码。

(4)       RS (10, 4) is used in HDFS-RAID in Facebook and RS (6, 3) in GFS II in Google.

(5)       其它编码技术:Weaver codes, Hover codes and Stepped Combination codes

(6)       LRC和其他编码方案在重建读成本和存储复制两个维度的比较

(7)       LRC为了提供客户端读过程的重建需求,优化数据段重建,而非编码段。在编码段重建,modern codes更有效。在(12,6)的情况下,Stepped Combination code只需要3个数据段就可以重建编码段,LRC则需要12个数据段。

(8)       WAS为了避免关联错误,将同一个编码组的数据段放在不同的fault domain

(9)       WAS从架构上分为三层:前端层、分区对象层、流复制(replication)层

编码存储放在流复制层

2       实现

(1)       流层的架构:基于paxos的流管理器(Stream Managers, SM), Extent Nodes(EN)

(2)       Extent, block, EN

每一个extent含有一系列的block(最大5M),每个block是CRC校验的,block是分区对象层读写数据的最小粒度。

每个extent在多个EN上复制。每个写操作在回复消息给客户端时,以菊花链的方式提交到一个复制集合的多个EN上

(3)       Sealed

对应一个流的写操作持续追加到一个extent上,除非extent达到最大的大小(1G-3G),或者在复制集合中出现错误。无论哪种情况,一个新的extent会被创建,之前的extent被sealed。当extent被sealed(标记),数据就不能改变(immutable),并且成为编码存储的备选。

2.1     编码过程

编码存储是完全的异步和脱离客户端的写路径的。SM周期性扫描标记的extent,根据流策略和系统负载,安排一个子集用于编码。

We configure the system to automatically erasure code extents storing Blob data, but also have the option to erasure code Table extents too

过程:

(1)       SM根据编码的参数(12,2,2),在一个集合的EN上创建fragment。SM从EN中选择一个协调者(coordinator),并且向它发生复制集合的元数据,从这开始,协调者负责编码的完成。

(2)        coordinator EN选择编码的extent: 所有fragments的边界都在extent上。EN根据追加block的界限划分extent到fragment,而不是随意的划分。这确认读一个block不会跨越多个fragments

(3)       coordinator EN开始编码过程,持续发送编码fragment给指定的EN。所有EN跟踪进度,并存储相应信息到新的fragment。当有错误发生,另外一个EN根据fragment中的进度信息,接手剩余工作

(4)       当整个extent都被编码了,协调者EN通知SM用fragment的界限和完成标记更新extent元数据。然后SM安排全备份的EN删除不需要的extent.

2.2     重建

(1)           读过程的重建

客户端进行读的时候,如果对应的EN不存活,或是一个热点,可以联系任何一个拥有extent的fragment的EN,开始一个重建读,EN完成重建读后会缓存相应的fragment.

(2)           EN或磁盘丢失重建

由SM启动在另外一个EN进行重建,过程同上

2.3     Fragment存放

存放位置考虑的因素:

(1)负载,倾向于更空闲、更小负载的EN;

(2)可靠性,避免将同一个编码组的两个fragments放在相关联的域中。Fault domain(rack)、upgrade domain.

示例:

一个典型的WAS有20个机架,10个升级域(每次升级,有10%的存储资源不在线)。

LRU(10,2,2),分成2个本地组,然后每组选一个,一起放入一个升级域,一共要6个升级域。2个本地编码块,放入一个升级域,然后2个全局编码块放入2个升级域。一共需要9个升级域。这样在任何一个域的升级,每个数据fragment都可以获取到,或直接读取,或通过重建。

2.4     IO安排

每一个EN监控网络、每个独立磁盘的负载,决定接受、拒绝、delay IO

类似的,SM监控EN上的复制负载,来决定启动复制、编码、删除extent和其它系统维护操作,为了对其它IO操作的公平的性能。同时,也是为了确保编码的速度能赶上从用户进来的数据速率。

重建预读和cache:

重建fragment时以unit大小(大于block的大小)进行,减少磁盘和网络的IO数。预读的数据缓存在内存中(最大256M)。

2.5     数据一致性

Checksum和parity。每个block的同步都有一个crc,读写的时候检查。

在每一个编码操作后,很多解码的集合都在coordinator EN的内存中被尝试,以检查是否能成功的恢复。这样做的目的是为了确保编码的算法本身没有引入数据不一致。

LRC(12,2,2)在允许编码完成前,将尝试下列的解码验证:

(1)随机选择一个数据fragment,local group内重建;

(2)随机选择一个数据fragment,用其中一个全局parity重建;

(3)随机选择一个数据fragment,用另外一个全局parity重建;

(4)随机选择两个数据fragment,重建;

(5)随机选择3个数据fragment,重建;

(6)随机选择4个数据段(只是一个本地组要有一个),重建。

对于每种情况解码出来的数据,和实际的数据比较CRC

最后coordinator EN执行一个所有数据段的CRC,和extent的原始的CRC进行比较。如果这些检查都通过了,编码段才会被持久化到存储磁盘中。如果在这个过程,任何一个错误发生了,编码操作会被终止,保留extent的数据不变。SM过段时间在另一EN再开始调度编码。

2.6     编码算法优化

Galois Field arithmetic。使用预计算、加法、乘法表,根据编解码矩阵的形式来排序XOR操作,这样可以减少冗余的操作和限制实际编码过程中对编码矩阵的重复检查

3       Performance

4       Related Work

Erasure Coding in WAS简单译文的更多相关文章

  1. Hadoop hdfs副本存储和纠删码(Erasure Coding)存储优缺点

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  2. Erasure Coding(纠删码)深入分析

    http://blog.sina.com.cn/s/blog_57f61b490102viq9.html 1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是 ...

  3. Erasure Coding(纠删码)深入分析 转

    1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是能够在一定程度上解决3副本空间浪费太多的问题.因为3副本这一点是swift推广的最大障碍之一,成本的增加吓 ...

  4. Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流

    本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...

  5. [转载] HDFS and Erasure Codes (HDFS-RAID)

    The Hadoop Distributed File System has been great in providing a cloud-type file system. It is robus ...

  6. 前端神器之Sublime Text2/3简单明了使用总结

    为什么叫神器呢? 我总结如下: 第一:也是最重要的,它占内存很小(就如同notepad++那般迅速打开,所以那款其实也不错~).一般IDE比如WebStorm(它也是一款神器来着),Aptana(也比 ...

  7. python - 实现文本分类[简单使用第三方库完成]

    第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...

  8. python入门:模拟简单用户登录(自写)

    #!/usr/bin/env python # -*- coding: utf-8 -*- #模拟简单用户登录(自写) import getpass a = raw_input("Pleas ...

  9. Hadoop集群简单入门

    Hadoop集群搭建 自己配置Hadoop的话太过复杂了,因为自己着急学习,就使用了黑马的快照.如果小伙伴们也想的话可以直接看黑马的课程,快照的话关注黑马程序员公众号,输入Hadoop就能获取资料,到 ...

随机推荐

  1. 速度 Github

    首先需要了解.git 是版本号的管理工具,为了能够把任意代码托管执照:github 其中一个是. 应用 github 什么不该说的帐户. 那么,申请后,在需求 github 并建立了独特的本地机器上的 ...

  2. 【转】Appium 服务器端从启动到case完成的活动分析

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39474151 此文的目的主要是通过分析Appium Server打印出来的log,加深对A ...

  3. Java数据结构与算法(2) - ch03排序(冒泡、插入和选择排序)

    排序需要掌握的有冒泡排序,插入排序和选择排序.时间为O(N*N). 冒泡排序: 外层循环从后往前,内存循环从前往后到外层循环,相邻数组项两两比较,将较大的值后移. 插入排序: 从排序过程的中间开始(程 ...

  4. Java初认识--Java语言的书写规范及基本的运算符

    一.Java中名称的规范和书写程序的规范. 1.Java中的名称规范: (1)包名全是小写:xxyyzz: (2)类名接口名:首字母大写:XxxYyy: (3)变量名和函数名:变量名不能是关键字:多单 ...

  5. JS读写Cookie(设置、读取、删除)

    JS读写Cookie(设置.读取.删除) Cookie是客户端存放数据的一种方式,可用来做状态保持. 1.设置Cookie: a.无过期时间:(若不设置过期时间,默认为会话级Cookie,浏览器关闭就 ...

  6. MyEclipse 设置全部jsp的编码为UFT-8 的方法

  7. Asp.Net MVC路由调试好帮手RouteDebugger

    Asp.Net MVC路由调试好帮手RouteDebugger 1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功 ...

  8. DELL iDRAC 远程虚拟机报错:虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用

    原因很简单,那就是虚拟介质的映射功能,只能被使用一次. 推荐做法: 1.由于通过远程,在Lifecycle Controller里DeployOS安装系统,需要在虚拟介质里映射ISO,因此映射功能要留 ...

  9. 快速构建Windows 8风格应用9-竖直视图

    原文:快速构建Windows 8风格应用9-竖直视图 本篇博文主要介绍竖直视图概览.关于竖直视图设计.如何构建竖直视图 竖直视图概览 Windows 8为了支持旋转的设备提供了竖屏视图,我们开发的应用 ...

  10. CRT

    G - 中国剩余定理 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit S ...