Openstack系列-自动化部署完成之后,此篇文章讲解企业级私有云后端云盘存储选型;OpenStack 存储组件cinder,swift,glance的区别和应用场景?

Swift——提供对象存储 (Object Storage),在概念上类似于Amazon S3服务,不过swift具有很强的扩展性、冗余和持久性,也兼容S3 API

Glance——提供虚机镜像(Image)存储和管理,包括了很多与Amazon AMI catalog相似的功能。(Glance的后台数据从最初的实践来看是存放在Swift的)。

Cinder——提供块存储(Block Storage),类似于Amazon的EBS块存储服务,目前仅给虚机挂载使用。
(Amazon一直是OpenStack设计之初的假象对手和挑战对象,所以基本上关键的功能模块都有对应项目。除了上面提到的三个组件,对于AWS中的重要的EC2服务,OpenStack中是Nova来对应,并且保持和EC2 API的兼容性,有不同的方法可以实现)

三个组件中,Glance主要是虚机镜像的管理,所以相对简单;Swift作为对象存储已经很成熟,连CloudStack也支持它。Cinder是比较新出现的块存储,设计理念不错,并且和商业存储有结合的机会,所以厂商比较积极。

Swift应用

1.网盘。

Swift的对称分布式架构和多proxy多节点的设计导致它从基因里就适合于多用户大并发的应用模式,最典型的应用莫过于类似Dropbox的网盘应用,Dropbox去年底已经突破一亿用户数,对于这种规模的访问,良好的架构设计是能够支撑的根本原因。
Swift的对称架构使得数据节点从逻辑上看处于同级别,每台节点上同时都具有数据和相关的元数据。并且元数据的核心数据结构使用的是哈希环,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。另外数据是无状态的,每个数据在磁盘上都是完整的存储。这几点综合起来保证了存储的本身的良好的扩展性。
另外和应用的结合上,Swift是说HTTP协议这种语言的,这使得应用和存储的交互变得简单,不需要考虑底层基础构架的细节,应用软件不需要进行任何的修改就可以让系统整体扩展到非常大的程度。

2.IaaS公有云

Swift在设计中的线性扩展,高并发和多租户支持等特性,使得它也非常适合做为IaaS的选择,公有云规模较大,更多的遇到大量虚机并发启动这种情况,所以对于虚机镜像的后台存储具体来说,实际上的挑战在于大数据(超过G)的并发读性能,Swift在OpenStack中一开始就是作为镜像库的后台存储,经过RACKSpace上千台机器的部署规模下的数年实践,Swift已经被证明是一个成熟的选择。
另外如果基于IaaS要提供上层的SaaS 服务,多租户是一个不可避免的问题,Swift的架构设计本身就是支持多租户的,这样对接起来更方便。

3.备份归档

RackSpace的主营业务就是数据的备份归档,所以Swift在这个领域也是久经考验,同时他们还延展出一种新业务–“热归档”。由于长尾效应,数据可能被调用的时间窗越来越长,热归档能够保证应用归档数据能够在分钟级别重新获取,和传统磁带机归档方案中的数小时而言,是一个很大的进步。

4. 移动互联网和CDN

移动互联网和手机游戏等产生大量的用户数据,数据量不是很大但是用户数很多,这也是Swift能够处理的领域。

至于加上CDN,如果使用Swift,云存储就可以直接响应移动设备,不需要专门的服务器去响应这个HTTP的请求,也不需要在数据传输中再经过移动设备上的文件系统,直接是用HTTP 协议上传云端。如果把经常被平台访问的数据缓存起来,利用一定的优化机制,数据可以从不同的地点分发到你的用户那里,这样就能提高访问的速度,我最近看到Swift的开发社区有人在讨论视频网站应用和Swift的结合,窃以为是值得关注的方向。

Glance应用

Glance比较简单,是一个虚机镜像的存储。向前端nova(或者是安装了Glance-client的其他虚拟管理平台)提供镜像服务,包括存储,查询和检索。这个模块本身不存储大量的数据,需要挂载后台存储(Swift,S3。。。)来存放实际的镜像数据。

Glance主要包括下面几个部分:
1.API service: glance-api 主要是用来接受Nova的各种api调用请求,将请求放入RBMQ交由后台处理,。

2.Glacne-registry 用来和MySQL数据库进行交互,存储或者获取镜像的元数据,注意,刚才在Swift中提到,Swift在自己的Storage Server中是不保存元数据的,这儿的元数据是指保存在MySQL数据库中的关于镜像的一些信息,这个元数据是属于Glance的。

3.Image store: 后台存储接口,通过它获取镜像,后台挂载的默认存储是Swift,但同时也支持Amazon S3等其他的镜像。

Glance从某种角度上看起来有点像虚拟存储,也提供API,可以实现比较完整的镜像管理功能。所以理论上其他云平台也可以使用它。

Glance比较简单,又限于云内部,所以没啥可以多展开讨论的,不如看看新出来的块存储组件Cinder,目前我对Cinder基本的看法是总体的设计不错,细节和功能还有很多需要完善的地方,离一个成熟的产品还有点距离。

Cinder
OpenStack到F版本有比较大的改变,其中之一就是将之前在Nova中的部分持久性块存储功能(Nova-Volume)分离了出来,独立为新的组件Cinder。它通过整合后端多种存储,用API接口为外界提供块存储服务,主要核心是对卷的管理,允许对卷,卷的类型,卷的快照进行处理。

cinder 应用

Cinder包含以下三个主要组成部分

API service:Cinder-api 是主要服务接口, 负责接受和处理外界的API请求,并将请求放入RabbitMQ队列,交由后端执行。 Cinder目前提供Volume API V2

Scheduler service: 处理任务队列的任务,并根据预定策略选择合适的Volume Service节点来执行任务。目前版本的cinder仅仅提供了一个Simple Scheduler, 该调度器选择卷数量最少的一个活跃节点来创建卷。

Volume service: 该服务运行在存储节点上,管理存储空间,塔处理cinder数据库的维护状态的读写请求,通过消息队列和直接在块存储设备或软件上与其他进程交互。每个存储节点都有一个Volume Service,若干个这样的存储节点联合起来可以构成一个存储资源池。

Cinder通过添加不同厂商的指定drivers来为了支持不同类型和型号的存储。目前能支持的商业存储设备有EMC 和IBM的几款,也能通过LVM支持本地存储和NFS协议支持NAS存储,所以Netapp的NAS应该也没问题,新的glusterfs,ceph多种后端存储支持。Cinder主要和Openstack的Nova内部交互,为之提供虚机实例所需要的卷Attach上去,但是理论上也可以单独向外界提供块存储。

部署上,可以把三个服务部署在一台服务器,也可以独立部署到不同物理节点
现在Cinder还是不够成熟,有几个明显的问题还没很好解决,一是支持的商业存储还不够多,而且还不支持FC SAN,另外单点故障隐患没解决,内部的schedule调度算法也太简单。另外由于它把各种存储整合进来又加了一层,管理倒是有办法了,但是效率肯定是有影响,性能肯定有损耗,但这也是没办法的事了。

Openstack通过两年多发展,变得越来越庞大。目前光存储就出现了三种:对象存储、镜像存储和块存储。这也是为了满足更多不同的需求,体现出开源项目灵活快速的特性。总的说来,当选择一套存储系统的时候,如果考虑到将来会被多个应用所共同使用,应该视为长期的决策。Openstack作为一个开放的系统,最主要是解决软硬件供应商锁定的问题,可以随时选择新的硬件供应商,将新的硬件和已有的硬件组成混合的集群,统一管理,当然也可以替换软件技术服务的提供商,不用动应用。这是开源本身的优势!

以上内容,摘自网络。
下一篇 - 我重点来介绍cinder/glusterfs组件的安装使用。

  • OpenStack Swift 是一个对象存储示例,它在概念上与 Amazon Simple Storage Service 类似。
  • 与之相反,OpenStack Cinder 表示块存储,类似于 Amazon Elastic Block Store。

块存储 (Cinder)

Cinder 是 OpenStack Block Storage 的项目名称;它为来宾虚拟机 (VM) 提供了持久块存储。对于可扩展的文件系统、最大性能、与企业存储服务的集成以及需要访问原生块级存储的应用程序而言,块存储通常是必需的。
系统可以暴露并连接设备,随后管理服务器的创建、附加到服务器和从服务器分离。应用程序编程接口 (API) 也有助于加强快照管理,这种管理可以备份大量块存储。

对象存储 (Swift)

Swift 是两种产品中较为成熟的一个:自 OpenStack 成立以来一直是一个核心项目。Swift 的功能类似于一个分布式、可访问 API 的存储平台,可直接将它集成到应用程序中,或者用于存储 VM 镜像、备份和归档以及较小的文件,例如照片和电子邮件消息。
Object Store 有两个主要的概念:对象和容器。
对象就是主要存储实体。对象中包括与 OpenStack Object Storage 系统中存储的文件相关的内容和所有可选元数据。数据保存为未压缩、未加密的格式,包含对象名称、对象的容器以及键值对形式的所有元数据。对象分布在整个数据中心的多个磁盘中,Swift 可以借此确保数据的复制和完整性。分布式操作可以利用低成本的商用硬件,同时增强可扩展性、冗余性和持久性。
容器类似于 Windows® 文件夹,容器是用于存储一组文件的一个存储室。容器无法被嵌套,但一个租户可以供创建无限数量的容器。对象必须存储在容器中,所以您必须至少拥有一个容器来使用对象存储。
与传统的文件服务器不同,Swift 是横跨多个系统进行分布的。它会自动存储每个对象的冗余副本,从而最大程度地提高可用性和可扩展性。对象版本控制提供了防止数据意外丢失或覆盖的额外保护。

Swift 架构

Swift 架构包含三个组件:服务器、流程和环。

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

此项目是基于 Python 开发的,采用 Apache 2.0 许可协议,可用来开发商用系统。

图 Swift 系统架构

Swift 组件包括:

  • 代理服务(Proxy Server):对外提供对象服务 API,会根据环的信息来查找服务地址并转发用户请求至相应的账户、容器或者对象服务;由于采用无状态的 REST 请求协议,可以进行横向扩展来均衡负载。
  • 认证服务(Authentication Server):验证访问用户的身份信息,并获得一个对象访问令牌(Token),在一定的时间内会一直有效;验证访问令牌的有效性并缓存下来直至过期时间。
  • 缓存服务(Cache Server):缓存的内容包括对象服务令牌,账户和容器的存在信息,但不会缓存对象本身的数据;缓存服务可采用 Memcached 集群,Swift 会使用一致性散列算法来分配缓存地址。
  • 账户服务(Account Server):提供账户元数据和统计信息,并维护所含容器列表的服务,每个账户的信息被存储在一个 SQLite 数据库中。
  • 容器服务(Container Server):提供容器元数据和统计信息,并维护所含对象列表的服务,每个容器的信息也存储在一个 SQLite 数据库中。
  • 对象服务(Object Server):提供对象元数据和内容服务,每个对象的内容会以文件的形式存储在文件系统中,元数据会作为文件属性来存储,建议采用支持扩展属性的 XFS 文件系统。
  • 复制服务(Replicator):会检测本地分区副本和远程副本是否一致,具体是通过对比散列文件和高级水印来完成,发现不一致时会采用推式(Push)更新远程副本,例如对象复制服务会使用远程文件拷贝工具 rsync 来同步;另外一个任务是确保被标记删除的对象从文件系统中移除。
  • 更新服务(Updater):当对象由于高负载的原因而无法立即更新时,任务将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新;例如成功创建对象后容器服务器没有及时更新对象列表,这个时候容器的更新操作就会进入排队中,更新服务会在系统恢复正常后扫描队列并进行相应的更新处理。
  • 审计服务(Auditor):检查对象,容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误会被记录到日志中。
  • 账户清理服务(Account Reaper):移除被标记为删除的账户,删除其所包含的所有容器和对象。

Cinder 架构

Cinder 比 Swift 简单得多,因为它不提供自动对象分布和复制。图 1 显示了 Cinder 架构。

图 1. Cinder architecture

与其他 OpenStack 项目类似,Cinder 的功能通过 API 暴露给仪表板和命令行。它能够通过具有具象状态传输 (Representational State Transfer, REST) 的 HTTP API 来访问对象存储,并使用一个名为 Auth Manager 的 Python 类将身份验证纳入 OpenStack Keystone。
API 解析所有传入的请求并将它们转发给消息队列,调度程序和卷服务器在该队列中执行实际的工作。在创建新的卷时,调度程序将会决定哪台主机应对该卷负责。默认情况下,它会选择拥有最多可用空间的节点。
卷管理程序管理着可动态附加的块存储设备,这些设备也被称为卷。它们可用作虚拟实例的启动设备,或作为辅助存储进行添加。Cinder 还为快照(卷的只读副本)提供了一种设备。然后可以使用这些快照来创建新的卷,以供读写使用。
卷通常通过 iSCSI 附加到计算节点。块存储也需要某种形式的后端存储,在默认情况下,该后端存储是本地卷组上的逻辑卷管理,但可以通过驱动程序将它扩展到外部存储阵列或设备。

总结

Cinder模块是openstack比较核心的模块之一,他决定了openstack中云主机的数据存取性能,是非常关键的,OpenStack 提供了一个直观的界面来设置私有云存储,并使其可用于工作负载。这些只是所有可能情况的冰山一角。例如,许多客户使用 Ceph 或 GlusterFS 作为后端存储机制,但即使在这些情况下,最终用户也只需与用户界面进行交互。如您在本系列的前几篇文章中已经了解到的,OpenStack 仅仅是集成一组可插拔组件的抽象层。