南加州大学和Facebook共同完成的Erasure Code演进——LRC,通过增加本地存储容量,提升了平均无故障时间,并减少恢复数据的开销。
作为云计算的核心系统之一,存储系统直接影响了整个系统的成本。七牛云存储CEO许式伟 表示:
我第一个云存储的讲座就已经讲了成本在云存储里面的重要性。实际上我更进一步说到要想在Erasure Code上更进一步只有成本转嫁,用p2p。
金山云CTO杨钢在近期接受CSDN采访时表示:“金山云在创立初就采用了Erasure Code。”
作为OpenStack的对象存储项目Swift,自然要对存储成本进行有效的控制。不过要在成本、数据持久性(durability)和性能之间找到平衡,并非那么容易。
在官方发行版中的Swift是不具备Erasure Code功能的,但SwiftStack已经实现了Swift+Erasure Code。相信支持Erasure Code功能的Swift不久将会出现在官方发行版中。
不过,Swift+Erasure Code并非完美,这种算法会大量增加网络负载。Joe Arnold透露,Swift会提供Erasure Code和传统3副本两种策略,供用户选择。而 LRC通过增加本地存储来降低数据恢复时对网络资源的消耗,也许这是Swift未来更需要的策略。以下为博客摘译:
没有免费的午餐
CAP原理告诉我们,在数据一致性(Consistency )、可用性(Availability )和分区容错性(Partition tolerance)三者中只能同时满足两者。Swift优先考虑可用性和分区容错性。
即当某个分区发生故障,系统将容忍这一故障分区继续响应服务请求。因为Swift可以恢复故障分区的数据,集群的任何部分依然可以提供服务。
可用性是分区带来的巨大的好处。此外,分区还带来许多其它优势:
延迟和重建
Swift的大部分客户都对并发性和延迟时间有着全天候的要求。在数据恢复过程中,读请求由一个存储卷提供支持。这意味着较少的网络流量和CPU负荷,最终用户感知到的等待时间非常短。
失败处理对于数据恢复系统而言也非常简单。当一个磁盘损坏并被替换后,任何其它包含副本的磁盘都能将数据直接拷贝到被替换的磁盘。这种简单的拷贝方式只需很低的CPU处理能力,并且不需要与集群中的许多服务器并发连接。
复制和区域(Regions)
在目前的Swift副本模型中,集群内的所有数据被拷贝多次。在SwiftStack的单集群中,我们推荐采用3副本策略;在双集群和全球规模的分布式系统中,推荐采用n*2策略,即每个集群都使用2副本。这种策略给予集群强壮的持久性和可用性,因为当分区发生故障时,分散在本地的副本会响应访问请求,替代需通过网络重新组装的数据。
在保持已有策略的优势的同时,为什么不使用Erasure Code来即减少数据密集程度呢?
在Swift上使用Erasure Code
我们将在产品中集成Erasure Code策略,并根据实际应用场景权衡并作出选择。
存储架构——Ring
Swift目前使用称之为“Ring”环形数据架构,这种架构在集群内建立分布式的分区空间。分区空间是Swift数据副本策略的核心,它可以让Swift快速、简单的进行同步。当Swift的组件需要进行数据交互时,通过在Ring中进行本地快速查询,为每个副本选择最适合的分区。
图:Swift的哈希Ring
在Swift中使用了3个环形架构存储不同类型的数据。一个用于存储账户信息(各租户的用户信息),第二个环用于容器(所以非常方便任意账户下的对象),第三个环用于对象副本。为了支持Erasure Code,据需要建立第四个环,用于存储Erasure Code校验块。
写入
在Swift集群中,代理服务器不断的选择适当的存储节点发出请求。当请求存储一个对象时,代理层将对这个对象进行Erasure Code编码生成校验块,这些校验块再不断的写入到择适当的分区中。
读取
当请求读取一个Erasure Code的对象时,代理层会同存储服务器间建立适合的连接,并对目标对象进行解码,最后将解码后的数据发送到客户端。当发生某个磁盘故障时,Erasure Code的优势就发挥出来了,只要有足够的校验块就可以重建对象中丢失的部分。
重建
在代理层进行编码是有一些优势的。首先,Swift已经这么做了,我们选择站在了巨人的肩膀上。其次,代理服务器上已经准备了强大的CPU,把编码工作放在这里能更好的发挥CPU的性能。在真实应用场景中,存储容量增速要远远超过并发访问增长需求,因此,编码工作在代理服务器中能够保持低成本运行。
Handoff Locations策略
在Swift中已经使用了handoff locations概念,来应对存储数据时发生的硬件或链接故障。同时,当在本地主存储中找不到校验数据是,节点知道如何从相邻的节点找到到它。
复制
使用Erasure Code时,我们使用重构器来扫描数据块。Erasure Code的“重构器”检查相邻数据块来确保每个数据块是可用的。若出现故障或者缺损,重构器可以重建块并将其复制到缺损处。
使用Erasure Code时,我们依然沿用了这种策略比对数据。Erasure Code的“重构器”等同于原有的三副本的恢复形式,通过以快速检查相邻块,以确保个别块保持可用。若出现故障或者缺损,重构器可以重建块并将其复制到缺损处。
容器的粒度控制
Swift的容器与AWS S3的 Buckert很相似。他们可以很方便的修改某个账户下的对象的属性,如修改访问控制列表(ACL)。容器非常善于管理一套存储策略,如副本数量或Erasure Code。
用不同的设备实现Erasure Code
只要增加数据Ring(详见上文),就能在不同的物理设备上实现Erasure Code。例如,如果分层数据用于归档,就可以使用密度更高的服务器部署,从而降低成本。
如何权衡
非常简单,Erasure Code校验文件比文件副本更广泛的存储在服务器中。这就导致数据在读取过程中必须在节点间创建更多的连接,这会让整个系统更加复杂,出现故障的可能性更高,响应请求的时延增长。编码、解码过程也会增加CPU的负担。所有这一切都是要考虑的。