首页 理论教育 基于云计算的大数据处理:分布式对象存储及访问

基于云计算的大数据处理:分布式对象存储及访问

时间:2023-10-17 理论教育 版权反馈
【摘要】:对象存储结构组成部分有对象、对象存储设备、元数据服务器、对象存储系统的客户端。目前国际上通常采用刀片式结构实现对象存储设备。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作交由OSD来完成,降低了Client的开销。1)对象存储访问:MDS构造、管理描述每个文件分布的视图,允许Client直接访问对象。

基于云计算的大数据处理:分布式对象存储及访问

(一)对象存储的概念

1.对象存储的定义

存储局域网(SAN)和网络附加存储(NAS)是目前两种主流网络存储架构,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device),简称OSD。1999年成立的全球网络存储工业协会(SNIA)的对象存储设备(Object Storage Device)工作组发布了ANSI的X3T10标准。总体上来讲,对象存储(Object-Based Storage,OBS)综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的分布式数据共享等优势,提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构。

2.对象存储的架构

对象存储的核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统,每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。

对象存储结构组成部分有对象、对象存储设备、元数据服务器、对象存储系统的客户端。

(1)对象

对象是系统中数据存储的基本单位,一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合,这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等,而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。

(2)对象存储设备

对象存储设备具有一定的智能,它有自己的CPU、内存、网络和磁盘系统,OSD同块设备的不同不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问。目前国际上通常采用刀片式结构实现对象存储设备。OSD提供3个主要功能。

1)数据存储

OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写。

2)智能分布

OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能地支持对象的预取,从而可以优化磁盘的性能。

3)每个对象元数据的管理

OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作交由OSD来完成,降低了Client的开销。

(3)元数据服务器(Metadata Server,MDS)

MDS控制Client与OSD对象的交互,主要提供以下几个功能。

1)对象存储访问:MDS构造、管理描述每个文件分布的视图,允许Client直接访问对象。MDS为Client提供访问该文件所含对象的能力,OSD在接收到每个请求时将先验证该能力,然后才可以访问。

2)文件和目录访问管理:MDS在存储系统上构建一个文件结构,包括限额控制、目录和文件的创建和删除、访问控制等。

3)Client Cache—致性:为了提高Client性能,在对象存储系统设计时通常支持Client方的Cache。由于引入Client方的Cache,带来了Cache—致性问题,MDS支持基于Client的文件Cache,当Cache的文件发生改变时,将通知Client刷新Cache,从而防止Cache不一致引发的问题。

(4)对象存储系统的客户端

为了有效支持Client访问OSD上的对象,需要在计算节点实现对象存储系统的Client,通常提供POSIX文件系统接口。

(二)分布式对象存储实例

分布式对象存储的代表性实例是云计算巨头AWS的S3(Simple Storage Service),在开源界对应着OpenStack的Swift,我们将对这两个系统做详细的分析。

1.AWS S3

Amazon Simple Storage Service是亚马逊AWS服务在2006年第一个正式对外推出的云计算服务。下面结合实际使用体验,从S3的数据结构和特点进行介绍。

(1)S3的背景与概览

S3为开发人员提供了一个高度扩展(Scalability)、高持久性(Durability)和高可用(Availability)的分布式数据存储服务。它是一个完全针对互联网的数据存储服务,应用程序可以通过一个简单的Web服务接口就可以通过互联网在任何时候访问S3上的数据。当然用户存放在S3上的数据可以进行访问控制以保障数据安全性。这里所说的访问S3包括读、写、删除等多种操作,在刚开始接触S3时要把S3与我们日常所说的网盘区分开来,虽然都属于云存储范畴,但是S3是针对开发人员、主要通过API编程使用的一个服务,而网盘这样的云存储服务则提供了一个给最终用户使用的服务界面。虽然S3也可以通过AWS的Web管理控制台命令行使用,但是S3主要针对开发人员,在理解上可以看成云存储的后台服务。比如,Dropbox是很多人都喜欢使用的云存储服务,它就是一个典型的AWS客户,其所有的用户文件保存在S3中。

S3云存储解决了大规模数据持久化存储的问题。前面提到EBS虽然是持久化的,但有容量限制,最大容量为1TB。在这个信息爆炸的时代,如何保存海量数据成为-大难题。有了S3云存储后,用户可以把注意力集中到其他地方,更专注于业务而不用关心运维和容量规划。

(2)S3的数据结构

S3的数据存储结构非常简单,就是一个扁平化的两层结构:一层是存储桶(Bucket,又称存储段),另一层是存储对象(Object,又称数据元)。

存储桶是S3中用来归类数据的一个方式,它是存储数据的容器。每一个存储对象都需要存储在某一个存储桶中。存储桶是S3命名空间的最高层,它会成为用户访问数据的域名的一部分,因此存储桶的名字必须是唯一的,而且需要保持DNS兼容,比如采用小写、不能用特殊字符等。例如,我们创建了一个名为cloud-uestc的存储桶,那么对应的域名就是cloud-uestc.s3.amazonaws.com,以后我们可以通过http://cloud-uestc.s3.amazonaws.com/来访问其中存储的数据。由于数据存储的地理位置有时对用户来说很重要,因此在创建存储桶的时候S3会提示选择区域(Region)信息。

存储对象就是用户实际要存储的内容,其构成就是对象数据内容再加上一些元数据信息。这里的对象数据通常是一个文件,而元数据就是描述对象数据的信息,比如数据修改的时间等。如果我们在cloud-uestc的存储桶中存放了一个文件picture.jpg,那么我们可以通过http://cloud-uestc.s3.amazonaws.com/picture.jpg这个URL来访问这个文件。从这个URL访问我们可以看到,存储桶名称需要全球唯一,而存储对象的命名则需要在存储桶中唯一。只有这样我们才能通过一个全球唯一的URL访问到指定的数据。

S3存储对象中的数据大小可以从1字节到5TB。在默认情况下每个AWS账号最多能创建100个存储桶。不过用户可以在一个存储桶中存放任意多存储对象。理论上存储桶中的对象数是没有限制的,因为S3完全按照分布式存储方式设计。除了在容量上S3具有很高的扩展性,S3的性能上也具有高度扩展性,允许多个客户端和应用线程并发访问数据。

S3的存储结构与我们常见的文件系统还是有一定区别的,在对两者进行比较的时候,需要注意的是S3在架构上只有两层结构,并不支持多层次的树形目录结构。不过我们可以通过设计带“/”的存储对象名称来模拟出一个树形结构。例如有些S3工具就提供了一个操作选项是“创建文件夹”,其实际上就是通过控制存储对象的名称来实现的。

(3)S3的特点

作为云存储的典型代表,Amazon S3在扩展性、持久性和性能等几个方面有自己明显的特点。S3云存储最大的特点是无限容量、高持久化、高可用,但它是一个key-value结构的存储。与EBS相比,它缺少目录结构,所以在用户的业务里,一般都会使用数据库保存S3云存储上数据的元信息。

1)耐久性和可用性

为了保证数据的耐久性和可用性,用户保存在S3上的数据会自动地在选定地理区域中多个设施(数据中心)和多个设备中进行同步存储。S3存储提供了AWS平台中最高级别的数据持久性和可用性。除了分布式的数据存储方式之外,S3还内置了数据一致性检查机制来提供错误更正功能。S3的设计不存在单点故障,可以承受两个设施同时出现数据丢失,因此非常适合用于任务关键型数据的主要数据存储。实际上,Amazon S3旨在为每个存储对象提供99.999999999%(11个9)的年持久性和99.99%的年可用性。除了内置冗余外,S3还可通过使用S3版本控制功能使数据免遭应用程序故障和意外删除造成的损坏。对于可以根据需要轻松复制的非关键数据(如转码生成的媒体文件、镜像缩略图等),可以使用Amazon S3中的降低冗余存储(ReducedRedundancy Storage,RRS)选项。RRS的持久性为99.99%,当然它存储费用也更低。尽管RRS的持久性稍逊于标准S3,但仍高出一般磁盘驱动器约400倍。

2)弹性可扩展性

Amazon S3的设计能够自动提供高水平的弹性和扩展性。一般的文件系统可能会在一个目录中存储大量文件时遇到问题,但是S3能够支持在任何存储桶中无限量地存储文件。另外,与磁盘不同的是,磁盘大小会限制可存储的数据总量,而Amazon S3存储桶可以存储无限量的数据。在数据大小方面目前S3的唯一限制是单个存储对象的大小不能超过5TB,但是可以存储任意数量的存储对象,S3会自动将数据的冗余副本扩展和分发到同一地区内其他位置的服务器中,这一切完全通过AWS的高性能基础设施来实现。(www.xing528.com)

3)良好的性能

S3是针对互联网的一种存储服务,因此它的数据访问速度不能与本地硬盘的文件访问相比。但是,从同一区域内的Amazon EC2可以快速访问Amazon S3。如果同时使用多个线程、多个应用程序或多个客户端访问S3,那S3累计总吞吐量往往远远超出单个服务器可以生成或消耗的吞吐量。S3在设计上能够保证服务端的访问延时与互联网的延时相比要小很多。

为了加快相关数据的访问速度,许多开发人员将Amazon S3与Amazon DynamoDB或Amazon RDS配合使用。由S3存储实际信息,而DynamoDB或RDS则充当关联元数据(如存储对象名称、大小、关键字等)的存储。数据库提供索引搜索的功能,而通过元数据搜索高效地找出存储对象的引用信息。然后,用户可以借助该结果准确定位存储对象本身并从S3中获取它。当然,为提高最终用户访问S3中数据的性能,还可以使用Amazon CloudFront这样的CDN服务。

4)接口简单

Amazon S3提供基于SOAP和REST两种形式的Web服务API来用于数据的管理操作。这些API所提供的管理和操作既针对存储桶也针对存储对象。虽然直接使用基于SOAP或REST的API非常灵活,但是由于这些API相对比较底层,因此实际使用起来相当烦琐。因此,为方便开发人员使用AWS,专门基于RESP API为常见的开发语言提供了高级工具包或软件开发包(SDK)。这些SDK支持的语言包括Java、.NET、PHP、Ruby和Python等。另外,如果需要在操作系统中直接管理和操作S3,那么AWS也为Windows和Linux环境提供了一个集成的AWS命令行接口(CLI)。在这个命令行环境中你可以使用类似Linux的命令来实现常用的操作,如Is、cp、mv、sync等。最后,还可以通过AWS的Web管理控制台来简单地使用S3服务,包括创建存储桶、上传和下载数据对象等操作。当然现在也有很多第三方的工作能够帮助用户通过图形化的界面使用S3服务,比如S3 Organizer(Firefox的一个免费插件)、CloudBerry Explorer for Amazon S3等。

2.OpenStack Swift

作为AWS S3的开源实现,OpenStack Swift的出现逐渐打破了S3的垄断地位,它提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。我们从Swift的背景、数据模型和系统架构入手进行介绍。

(1)OpenStack Swift背景与概览

Swift最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一,为其Nova子项目提供虚拟镜像存储服务。Swift构筑在比较便宜的标准硬件存储基础设施之上,无须采用RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。

Swift项目是基于Python开发的,采用Apache2.0许可协议,可用来开发商用系统。

(2)数据模型

Swift采用层次数据模型,共设三层逻辑结构:Account/Container/Object(即账户/容器/对象),每层节点数均没有限制,可以任意扩展。这里的账户和个人账户不是一个概念,可理解为租户,用来做顶层的隔离机制,可以被多个个人账户所共同使用:容器代表封装一组对象,类似文件夹或目录;叶子节点代表对象,由元数据和内容两部分组成,如图7-10所示。

图7-10 Swift数据模型

(3)Swift系统架构

Swift采用完全对称、面向资源的分布式系统架构设计,所有组件都可扩展,避免因单点失效而扩散并影响整个系统运转;通信方式采用非阻塞式I/O模式,提高了系统吞吐和响应能力。

Swift的系统架构如图7-11所示。

图7-11 Swift系统架构图

1)代理服务(Proxy Server)

对外提供对象服务API,会根据信息来查找服务地址并转发用户请求至相应的账户、容器或者对象服务;由于采用无状态的REST请求协议,可以进行横向扩展来均衡负载。

2)认证服务(Authentication Server)

验证访问用户的身份信息,并获得一个对象访问令牌(Token),在一定的时间内会一直有效,验证访问令牌的有效性并缓存下来直至过期。

3)缓存服务(Cache Server)

缓存的内容包括对象服务令牌、账户和容器的存在信息,但不会缓存对象本身的数据;缓存服务可采用Memcached集群,Swift会使用一致性散列算法来分配缓存地址。

4)账户服务(Account Server)

提供账户元数据和统计信息,并维护所含容器列表的服务,每个账户的信息被存储在一个SQLite数据库中。

5)容器服务(Container Server)

提供容器元数据和统计信息,并维护所含对象列表的服务,每个容器的信息也存储在一个SQLite数据库中。

6)对象服务(Object Server)

提供对象元数据和内容服务,每个对象的内容会以文件的形式存储在文件系统中,元数据会作为文件属性来存储,建议采用支持扩展属性的XFS文件系统。

7)复制服务(Replicator)

会检测本地分区副本和远程副本是否一致,具体通过对比散列文件和高级水印来完成,发现不一致时会采用推式(Push)更新远程副本,例如对象复制服务会使用远程文件复制工具rsync来同步;另外一个任务是确保被标记删除的对象从文件系统中移除。

8)更新服务(Updater)

当对象由于高负载的原因而无法立即更新时,任务将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新;例如成功创建对象后容器服务器没有及时更新对象列表,这个时候容器的更新操作就会进入排队中,更新服务会在系统恢复正常后扫描队列并进行相应的更新处理。

9)审计服务(Auditor)

检查对象、容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误会被记录到日志中。

10)账户清理服务(AccountReaper)

移除被标记为删除的账户,删除其所包含的所有容器和对象。

OpenStack Swift作为稳定和高可用的开源对象存储被很多企业作为商业化部署,如新浪的App Engine已经上线并提供了基于Swift的对象存储服务,韩国电信的Ucloud Storage服务。有理由相信,因为其完全的开放性、广泛的用户群和社区贡献者,Swift可能会成为云存储的开放标准,从而打破Amazon S3在市场上的垄断地位,推动云计算朝着更加幵放和可互操作的方向前进。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈