http://www.ibm.com/developerworks/cn/cloud/library/1402_chenhy_openstackstorage/
OpenStack 其实有三个与存储相关的组件,这三个组件被人熟知的程度和组件本身出现时间的早晚是相符的,按熟悉程度排列如下:
三个组件中,Glance 主要是虚机镜像的管理,所以相对简单;Swift 作为对象存储已经很成熟,连 CloudStack 也支持它。Cinder 是比较新出现的块存储,设计理念不错,并且和商业存储有结合的机会,所以厂商比较积极。
存储项目和组件对应关系如下面表格:
项目 | 组件 | 描述 | 对应 Amazon 产品 |
---|---|---|---|
Swift | Object Storage as a service | 对象存储 | Amazon S3 |
Glance | Image as a service | VM 磁盘镜像存储和管理 | Amazon AMI catalog |
Cinder | Block Storage as a service | 块存储 | Amazon EBS |
回页首
OpenStack Object Storage(Swift)是 OpenStack 开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、冗余和持久性。 Swift 并不是文件系统或者实时的数据存储系统,它称为对象存储,用于永久类型的静态数据的长期存储,这些数据可以检索、调整,必要时进行更新。Swift 前身是 Rackspace Cloud Files 项目,随着 Rackspace 加入到 OpenStack 社区,于 2010 年 7 月贡献给 OpenStack,作为该开源项目的一部分。Swift 目前的最新版本是OpenStack Havana。Havana 版本中 Swift 新增特性如下:
在 OpenStack 官网中,列举了很多 Swift 特性,其中最引人关注的是以下几点。
一些朋友经常将数据持久性(Durability)与系统可用性(Availability)两个概念混淆,前者也理解为数据的可靠性,是指数据存储到系统中后,到某一天数据丢失的可能性。例如 Amazon S3 的数据持久性是 11 个 9,即如果存储 1 万(4 个 0)个文件到 S3 中,1 千万(7 个 0)年之后,可能会丢失其中 1 个文件。那么 Swift 能提供多少个 9 的 SLA 呢?下文会给出答案。针对 Swift 在新浪测试环境中的部署,他们从理论上测算过,Swift 在 5 个 Zone、5×10 个存储节点的环境下,数据复制份是为 3,数据持久性的 SLA 能达到 10 个 9。
“对称”意味着 Swift 中各节点可以完全对等,能极大地降低系统维护成本。
这里的扩展性分两方面,一是数据存储容量无限可扩展;二是 Swift 性能(如 QPS、吞吐量等)可线性提升。因为 Swift 是完全对称的架构,扩容只需简单地新增机器,系统会自动完成数据迁移等工作,使各存储节点重新达到平衡状态。
在互联网业务大规模应用的场景中,存储的单点一直是个难题。例如数据库,一般的 HA 方法只能做主从,并且“主”一般只有一个;还有一些其他开源存储系统的实现中,元数据信息的存储一直以来是个头痛的地方,一般只能单点存储,而这个单点很容易成为瓶颈,并且一旦这个点出现差异,往往能影响到整个集群,典型的如 HDFS。而 Swift 的元数据存储是完全均匀随机分布的,并且与对象文件存储一样,元数据也会存储多份。整个 Swift 集群中,也没有一个角色是单点的,并且在架构和设计上保证无单点业务是有效的。
简单体现在架构优美、代码整洁、实现易懂,没有用到一些高深的分布式存储理论,而是很简单的原则。可依赖是指 Swift 经测试、分析之后,可以放心大胆地将 Swift 用于最核心的存储业务上,而不用担心 Swift 捅篓子,因为不管出现任何问题,都能通过日志、阅读代码迅速解决。
Swift Architectural主要有三个组成部分:Proxy Server、Storage Server 和 Consistency Server。其架构如图 1 所示,其中 Storage 和 Consistency 服务均允许在 Storage Node 上。Auth 认证服务目前已从 Swift 中剥离出来,使用 OpenStack 的认证服务 Keystone,目的在于实现统一 OpenStack 各个项目间的认证管理。
Proxy Server 是提供 Swift API 的服务器进程,负责 Swift 其余组件间的相互通信。对于每个客户端的请求,它将在 Ring 中查询 Account、Container 或 Object 的位置,并且相应地转发请求。Proxy 提供了 REST API,并且符合标准的 HTTP 协议规范,这使得开发者可以快捷构建定制的 Client 与 Swift 交互。
Storage Server 提供了磁盘设备上的存储服务。在 Swift 中有三类存储服务器:Account、Container 和 Object。其中 Container 服务器负责处理 Object 的列表,Container 服务器并不知道对象存放位置,只知道指定 Container 里存的哪些 Object。这些 Object 信息以 sqlite 数据库文件的形式存储。Container 服务器也做一些跟踪统计,例如 Object 的总数、Container 的使用情况。
在磁盘上存储数据并向外提供 REST API 并不是难以解决的问题,最主要的问题在于故障处理。Swift 的 Consistency Servers 的目的是查找并解决由数据损坏和硬件故障引起的错误。主要存在三个 Server:Auditor、Updater 和 Replicator。 Auditor 在每个 Swift 服务器的后台持续地扫描磁盘来检测对象、Container 和账号的完整性。如果发现数据损坏,Auditor 就会将该文件移动到隔离区域,然后由 Replicator 负责用一个完好的拷贝来替代该数据。图 2 给出了隔离对象的处理流图。 在系统高负荷或者发生故障的情况下,Container 或账号中的数据不会被立即更新。如果更新失败,该次更新在本地文件系统上会被加入队列,然后 Updaters 会继续处理这些失败了的更新工作,其中由 Account Updater 和 Container Updater 分别负责 Account 和 Object 列表的更新。 Replicator 的功能是处理数据的存放位置是否正确并且保持数据的合理拷贝数,它的设计目的是 Swift 服务器在面临如网络中断或者驱动器故障等临时性故障情况时可以保持系统的一致性。
Ring 是 Swift 最重要的组件,用于记录存储对象与物理位置间的映射关系。在涉及查询 Account、Container、Object 信息时,就需要查询集群的 Ring 信息。 Ring 使用 Zone、Device、Partition 和 Replica 来维护这些映射信息。Ring 中每个 Partition 在集群中都(默认)有 3 个 Replica。每个 Partition 的位置由 Ring 来维护,并存储在映射中。Ring 文件在系统初始化时创建,之后每次增减存储节点时,需要重新平衡一下 Ring 文件中的项目,以保证增减节点时,系统因此而发生迁移的文件数量最少。
Swift 提供的服务与Amazon S3相同,适用于许多应用场景。
Swift 的对称分布式架构和多 proxy 多节点的设计导致它从基因里就适合于多用户大并发的应用模式,最典型的应用莫过于类似 Dropbox 的网盘应用,Dropbox 去年底已经突破一亿用户数,对于这种规模的访问,良好的架构设计是能够支撑的根本原因。
Swift 的对称架构使得数据节点从逻辑上看处于同级别,每台节点上同时都具有数据和相关的元数据。并且元数据的核心数据结构使用的是哈希环,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。另外数据是无状态的,每个数据在磁盘上都是完整的存储。这几点综合起来保证了存储的本身的良好的扩展性。
另外和应用的结合上,Swift 是遵循 HTTP 协议的,这使得应用和存储的交互变得简单,不需要考虑底层基础构架的细节,应用软件不需要进行任何的修改就可以让系统整体扩展到非常大的程度。
Swift 在设计中的线性扩展,高并发和多租户支持等特性,使得它也非常适合做为 IaaS 的选择,公有云规模较大,更多的遇到大量虚机并发启动这种情况,所以对于虚机镜像的后台存储具体来说,实际上的挑战在于大数据(超过 G)的并发读性能,Swift 在 OpenStack 中一开始就是作为镜像库的后台存储,经过 Rackspace 上千台机器的部署规模下的数年实践,Swift 已经被证明是一个成熟的选择。
(我的理解:我们不使用swift而使用ceph的对象存储和块设备存储:(1)块设备存储作为cinder的后端,ceph为cinder提供rbd块设备(2)glance可以直接接ceph的radosgw,ceph为glance提供对象存储服务。其实ceph文件存储服务也可以提供给cinder来用,自己写一个类似于glusterfs的cinder-volume驱动)
另外如果基于 IaaS 要提供上层的 SaaS 服务,多租户是一个不可避免的问题,Swift 的架构设计本身就是支持多租户的,这样对接起来更方便。
Rackspace 的主营业务就是数据的备份归档,所以 Swift 在这个领域也是久经考验,同时他们还延展出一种新业务--“热归档”。由于长尾效应,数据可能被调用的时间窗越来越长,热归档能够保证应用归档数据能够在分钟级别重新获取,和传统磁带机归档方案中的数小时而言,是一个很大的进步。
移动互联网和手机游戏等产生大量的用户数据,数据量不是很大但是用户数很多,这也是 Swift 能够处理的领域。
至于加上 CDN,如果使用 Swift,云存储就可以直接响应移动设备,不需要专门的服务器去响应这个 HTTP 的请求,也不需要在数据传输中再经过移动设备上的文件系统,直接是用 HTTP 协议上传云端。如果把经常被平台访问的数据缓存起来,利用一定的优化机制,数据可以从不同的地点分发到您的用户那里,这样就能提高访问的速度,Swift 的开发社区有人在讨论视频网站应用和 Swift 的结合,窃以为是值得关注的方向。
回页首
Glance 项目提供虚拟机镜像的发现、注册、取得服务。Glance 提供 REST API 可以查询虚拟机镜像的 metadata,并且可以获得镜像。
通过 Glance,虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储(比如 OpenStack 中 swift 项目),Havana 版本中 Glance 新增特性如下:
Glance 的几个重要概念:
1.Image identifiers:Image 使用 URI 作为唯一标识,URL 符合以下格式:
<Glance Server Location>/images/<ID>
Glance Server Location 是镜像的所在位置,ID 是镜像在 Glance 的唯一标识。
2.Image Statuses 共四种状态。
queued 标识该镜像 ID 已经被保留,但是镜像还未上传。 saving 标识镜像正在被上传。 active 标识镜像在 Glance 中完全可用。 killed 标识镜像上传过程中出错,镜像完全不可用。
3.Disk and Container format
Disk Format:raw vhd vmdk vdi iso qcow2 aki ari ami
Container Format: ovf bare aki ari ami
当 disk format 为 aki ari ami 时,disk format 和 container format 一致。
4.Image Registries
使用 Glance,镜像 metadata 可以注册至 image registries。
只要为 image metadata 提供了 rest like API,任何 web 程序可以作为 image registries 与 Glance 对接。
当然,Glance 也提供了参考实现。
更多信息可以参考on Controlling Servers,来自于 Glance 提供的 Glance registry server。
Glance 被设计为可以使用多种后端存储。前端通过 API Server 向多个 Client 提供服务。
Glance 目前提供的参考实现中 Registry Server 仅是使用 Sql 数据库存储 metadata,Glance 支持 S3、Swift,简单的文件存储及只读的 HTTPS 存储。也支持其他后端,如分布式存储系统(SheepDog 或 Ceph)。
回页首
OpenStack 到 Folsom 版本有比较大的改变,其中之一就是将之前在 Nova 中的部分持久性块存储功能(Nova-Volume)分离了出来,独立为新的组件 Cinder。主要核心是对卷的管理,允许对卷、卷的类型、卷的快照进行处理。它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实现其驱动支持以与 OpenStack 进行整合。在CinderSupportMatrix中可以看到众多存储厂商如 NetAPP、IBM、SolidFire、EMC 和众多开源块存储系统对 Cinder 的支持。Havana 版本中 Cinder 新增特性如下:
Cinder 架构图
点击查看大图
API service:负责接受和处理 Rest 请求,并将请求放入 RabbitMQ队列。
Scheduler service: 处理任务队列的任务,并根据预定策略选择合适的 Volume Service 节点来执行任务。目前版本的 cinder 仅仅提供了一个 Simple Scheduler, 该调度器选择卷数量最少的一个活跃节点来创建卷。
Volume service: 该服务运行在存储节点上,管理存储空间。每个存储节点都有一个 Volume Service,若干个这样的存储节点联合起来可以构成一个存储资源池。为了支持不同类型和型号的存储,当前版本的 Cinder 为 Volume Service 添加如下 drivers。当然在 Cinder 的 blueprints 当中还有一些其它的 drivers,以后的版本可能会添加进来。
本地存储:LVM(iSCSI
), Sheepdog(sheepdog)
▫网络存储: NFS, RBD(Ceph)
IBM: Storwize family/SVC (iSCSI/FC)
,
XIV (iSCSI),GPFS,zVM
▫Netapp: NetApp
(iSCSI/NFS)
▫EMC: VMAX/VNX
(iSCSI)
,Isilon(
iSCSI
)
▫Solidfire: Solidfire cluster(iSCSI)
▫HP:3PAR (iSCSI/FC),LeftHand (iSCSI)
回页首
从目前的实现来看,Cinder 对本地存储和 NAS 的支持比较不错,可以提供完整的 Cinder API V2 支持,而对于其它类型的存储设备,Cinder 的支持会或多或少的受到限制,下面是 Rackspace 对于 Private Cloud 存储给出的典型配置:
1.本地存储
对于本地存储,cinder-volume 可以使用 LVM 驱动,该驱动当前的实现需要在主机上事先用 LVM 命令创建一个 cinder-volumes 的卷组 , 当该主机接受到创建卷请求的时候,cinder-volume 在该卷组 上创建一个逻辑卷, 并且用 openiscsi 将这个卷当作一个 iscsi tgt 给输出.当然还可以将若干主机的本地存储用 sheepdog 虚拟成一个共享存储,然后使用 sheepdog 驱动。
2.EMC
3.Netapp
点击查看大图
回页首
传统存储架构 |
openstack 云存储架构 | |
---|---|---|
海量数据承载能力 |
扩展方式是通过增加硬件配置实现,属于 Scaleup 方式
|
存储系统可以达到 PB 级别的扩展空间更适合海量数据的存储、ScaleOut |
高可用 |
昂贵的硬件保证系统的高可用
|
通过系统自身的机制,即软件完成的自动化、智能机制来保证系统可用性 |
存储资源动态调配的能力 |
存储资源分配给应用后,难以回收再分配
|
计算和存储资源虚拟化,可以按照需求分配,动态调整 |
存储资源动态调配的能力 |
低资源利用率,高能耗 |
35%-75%的 TCO 节省,30%以上的软硬件成本节省,CPU 利用率提升到 60%-80%,70%-80%运营成本节约
|
运维效率和成本 |
运维效率低,维护成本高,硬件准备周期长
|
部署时间缩短到分钟级,减少硬件准备周期
|
管理复杂度 |
高 |
低 |
回页首
OpenStack 是设计用来管理共有云和私有云的。很多公司认为 OpenStack 有希望让他们能拥有一些单一专有云的功能,一些如谷歌、亚马逊及微软经营的云那样的功能。同时 OpenStack 是基于友好的 Apache 2 开源协议,任何人都能参与设计和开发,甚至提出创立自己的项目。只要经过社区讨论,并达成一致,就可以按照您的标准。开源的力量是强大的,随着社区半年一次的发布,Swift﹑ Glance 和 Cinder 将会越来越好。本文只是 OpenStack 存储初级性的一次调查报告,进一步深入探索可以查看参考资料了解有关 OpenStack 存储的更多相关信息。