OpenStack Swift遇到了Erasure Code

云计算 OpenStack
南加州大学和Facebook共同完成的Erasure Code演进——LRC,通过增加本地存储容量,提升了平均无故障时间,并减少恢复数据的开销。

南加州大学和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的负担。所有这一切都是要考虑的。

责任编辑:王程程 来源: CSDN
相关推荐

2013-07-05 10:12:35

2021-10-26 08:22:38

消息堆积扩容RocketMQ

2020-04-24 20:05:16

VueAxios前端

2012-05-17 13:47:37

OpenStack架构

2012-07-12 16:00:32

OpenStackSwift架构

2013-12-10 09:57:35

Openstack S开源云存储Openstack

2014-11-27 13:29:29

OpenStackSwift开源

2015-12-22 10:10:43

2021-10-18 22:29:54

OOMJava Out Of Memo

2013-07-25 09:13:57

SwiftStackOpenStackSwift对象存储

2015-11-19 00:11:12

2011-12-21 15:07:28

开源云计算

2013-07-25 09:12:48

OpenStackSwift对象存储对象存储

2015-08-25 11:17:13

OpenStack对象存储Swift

2016-07-28 12:34:22

天蝎OpenStack中国移动

2020-08-06 15:50:26

微信无法登陆移动应用

2021-05-12 13:38:47

云计算

2017-10-24 12:32:03

小程序APPbug

2016-06-17 13:43:15

OpenStackSwift跨地域存储集群

2014-08-19 10:30:30

Swift源码OpenStack架构
点赞
收藏

51CTO技术栈公众号