本文介绍了 OpenStack Storage,该产品为其他 OpenStack 项目提供了永久存储。

根据文中对 OpenStack Compute 的描述,计算是计算工作量的核心。在某些情况下,一个计算实例可能就是所需的一切,但是,通常需要在实例的整个使用期限内的持久存储,或者说,可能需要在运行的各个服务之间共享大量的数据。

事实上,也可能出现这样的情况:应用程序在 OpenStack 环境以外的地方运行,具体情况取决于可重复、可扩展和可靠的存储,而且 OpenStack Storage 满足了所有这些规范。但是,在评估备选方案之前,重要的是要认识到 OpenStack 和其他许多云服务有两个根本不同的存储服务:

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

块存储 (Cinder)

Cinder 是 OpenStack Block Storage 的项目名称;它为来宾虚拟机 (VM) 提供了持久块存储。对于可扩展的文件系统、最大性能、与企业存储服务的集成以及需要访问原生块级存储的应用程序而言,块存储通常是必需的。

系统可以暴露并连接设备,随后管理服务器的创建、附加到服务器和从服务器分离。应用程序编程接口 (API) 也有助于加强快照管理,这种管理可以备份大量块存储。

对象存储 (Swift)

Swift 还是 Cinder?何时使用以及使用哪一种?

那么,应该使用哪一种对象存储:Swift 还是 Cinder?答案取决于您的应用程序。如果需要运行商用或遗留应用程序,那么很少需要进行这种选择。这些应用程序不可能被编码来利用 Swift API,但您可以轻松挂载一个 Cinder 磁盘,它表现得就像是直接将存储附加到大多数应用程序。

当然,您还可以对新应用程序使用 Cinder,但是不会从 Swift 自动附带的弹性和冗余中获益。如果编程人员面对这样的挑战,那么 Swift 的分布式可扩展架构是一个值得考虑的特性。

Swift 是两种产品中较为成熟的一个:自 OpenStack 成立以来一直是一个核心项目。Swift 的功能类似于一个分布式、可访问 API 的存储平台,可直接将它集成到应用程序中,或者用于存储 VM 镜像、备份和归档以及较小的文件,例如照片和电子邮件消息。

Object Store 有两个主要的概念:对象和容器。

对象就是主要存储实体。对象中包括与 OpenStack Object Storage 系统中存储的文件相关的内容和所有可选元数据。数据保存为未压缩、未加密的格式,包含对象名称、对象的容器以及键值对形式的所有元数据。对象分布在整个数据中心的多个磁盘中,Swift 可以借此确保数据的复制和完整性。分布式操作可以利用低成本的商用硬件,同时增强可扩展性、冗余性和持久性。

容器类似于 Windows® 文件夹,容器是用于存储一组文件的一个存储室。容器无法被嵌套,但一个租户可以供创建无限数量的容器。对象必须存储在容器中,所以您必须至少拥有一个容器来使用对象存储。

与传统的文件服务器不同,Swift 是横跨多个系统进行分布的。它会自动存储每个对象的冗余副本,从而最大程度地提高可用性和可扩展性。对象版本控制提供了防止数据意外丢失或覆盖的额外保护。

Swift 架构

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

服务器

Swift 架构是分布式的,可防止所有单点故障和进行水平扩展。它包括以下四种服务器:

  • 代理服务器
  • 对象服务器
  • 容器服务器
  • 帐户服务器

代理服务器为 OpenStack Object Storage 架构的其余部分提供一个统一的界面。它接收创建容器、上传文件或修改元数据的请求,还可以提供容器清单或展示存储的文件。当收到请求时,代理服务器会确定帐户、容器或对象在环中的位置,并将请求转发至相关的服务器。

对象服务器是一种简单的服务器,可以上传、修改和检索存储在它所管理的设备上的对象(通常为文件)。对象被存储在本地文件系统中,使用了扩展的属性保存所有的元数据。路径基于对象名称的散列和时间戳。

容器服务器实质上是对象的一个目录。它处理特定容器的对象的分配,并根据请求来提供容器清单。可以跨集群复制该清单,以提供冗余。

试一试!

帐户服务器通过使用对象存储服务来管理帐户。它的操作类似于在内部提供了清单的容器服务器,在这种情况下,将会枚举分配到给定帐户的容器。

流程

有几种预定的内部管理流程可以管理数据存储,包括复制服务、审计程序(auditor)和更新程序(updater)。

复制服务是至关重要的流程:确保整个集群的一致性和可用性。由于对象存储的一个主要吸引点是其分布式存储,所以 OpenStack 必须在瞬态错误条件下确保获得一致的状态,例如断电或组件故障。复制服务通过定期对比本地数据与远程副本并确保所有副本都包含最新版本来做到这一点。

为了最大程度地减少进行对比所需的网络流量的数量,该服务创建了每个分区分段的一个散列(hash),并比较这些列表。容器和帐户复制也可以使用散列,但通过高水位标记(high-water mark)对这些散列进行了补充。实际的更新被推送,通常使用 rsync 来复制对象、容器和帐户。

在删除对象、容器或帐户时,复制器(replicator)还会执行垃圾收集来实施一致的数据删除。在删除时,系统会使用一个墓碑图片来标记最新版本,这是一个告诉复制器可以从所有重复的节点中删除对象、容器或帐户的信号。

即使是最好的复制设计,也只在拥有实现该复制的组件时有效,不过,无论是硬件故障还是软件故障,抑或只是因为产品能力不足,生产环境都必须能够重现这些故障。在 Swift 中,该操作是由更新程序和审计程序来完成的。

更新程序负责在系统面临故障时确保系统的完整性。当复制服务遇到一个问题,并且无法更新容器或帐户时,就会出现一段时间的不一致,在此其间,对象虽然存在于存储中,但并未列出在所有容器或帐户服务器上。在这种情况下,系统会在本地文件系统上对更新进行排队,并有一个更新程序会定期重试更新。

审计程序对这种不一致提供额外级别的保护。它们定期扫描本地存储库,验证帐户、容器和对象的完整性。在确认任何损坏时,审计程序会隔离该元素,并使用来自另一个复制物的副本替换它。如果发现了无法协调的不一致性(例如,对象不属于任何容器),审计程序就会将该错误记录在一个日志文件中。

用户和其他 OpenStack 项目会根据逻辑名称来引用存储实体,但最终,所有请求,无论是用于读取还是用于写入,都必须映射到某个物理位置。为了完成这一操作,代理服务器和后台流程(包括复制服务)都必须能够将逻辑名称映射到物理位置。这种映射就称为一个环(ring)。帐户、容器和对象都配有单独的环。环根据设备、分区、副本和专区来描述这一映射。

在此上下文中,术语分区 指的是环中所存储内容的逻辑子集。建议为每个参与设备分配 100 个分区。分区均匀地分布在分配给 OpenStack Object Storage 的所有设备上。如果集群使用了不同规格的驱动,那么有可能会分配权重,以便平衡各个设备上的分区的分布。

默认情况下,每个分区可被复制三次。有可能会使用一个较大的数字来优化可用性,但这显然会增加存储消耗。环还会指定在故障场景中使用哪些设备来接管工作负载,以及在向集群添加设备或从中删除设备时如何重新分配分区。

环映射的最后一个元素是专区,用于启用数据亲和性和反亲和性,一个专区可以表示一个存储设备、一个物理服务器或者一个位置,例如机架、通道或数据中心,专区是用户可用来满足其需求的一个逻辑概念,但通常反映的是物理元素,例如位置、电源和网络连接。

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 附加到计算节点。块存储也需要某种形式的后端存储,在默认情况下,该后端存储是本地卷组上的逻辑卷管理,但可以通过驱动程序将它扩展到外部存储阵列或设备。

设置

实际的安装指令在发行版和 OpenStack 版本之间极为不同。通常,它们可作为发行版的一部分。但是,必须完成相同的基本任务。本节将会介绍其中涉及的概念。

系统要求

OpenStack 依赖于一种 64 位 x86 架构;另外,它是为商用硬件而设计的,所以具有极低的系统要求。它可以在配有包含 8GB RAM 的单个系统上运行整套 OpenStack 项目。但是,对于大型的工作负载,它对于使用专用系统来实现存储至关重要。因为我们的重点在商用设备上,所以不需要独立磁盘冗余阵列 (redundant array of independent disks,RAID) 功能,但使用至少两个四核 cpu、8-12GB 的 RAM 和 1GB 的网络适配器是一种明智之举。显然,硬盘或固态磁盘的大小取决于要存储的数据量和希望的冗余级别。

安装

安装指令取决于发行版,更具体地讲,取决于您所选择的包管理实用程序。在许多情况下,必须声明存储库。所以,举例而言,如果您使用的是 Zypper,那么您要用 zypper arlibzypp 公开:

# zypper ar -f http://download.opensuse.org/repositories/Cloud:/OpenStack:/Grizzly/SLE_11_SP3/Cloud:OpenStack:Grizzly.repo

然后,安装所需的 Swift 和/或 Cinder 包。包管理实用程序应自动安装所有依赖关系。整个安装程序取决于您所期望的配置和 OpenStack 的准确版本。请务必查看安装指南中的权威说明,为了演示之目的,下面提供了适用于 Debian(例如 Ubuntu)、Red Hat(例如,Red Hat Enterprise Linux®、CentOS、Fedora)和 openSUSE 的一些主要命令。

  • Debian:在所有主机上安装基础 Swift 包:
    sudo apt-get install python-swift
    sudo apt-get install swift
    and the server-specific packages on the hosts that will be running them:
    sudo apt-get install swift-auth
    sudo apt-get install swift-proxy
    sudo apt-get install swift-account
    sudo apt-get install swift-container
    sudo apt-get install swift-object

    Cinder 包包含 API、调度程序和卷管理程序:

    sudo apt-get install cinder-api
    sudo apt-get install cinder-scheduler
    sudo apt-get install cinder-volume
  • Red Hat:在 Red Hat 系统上,使用的命令是:
    sudo yum install openstack-swift
    sudo yum install openstack-swift-proxy
    sudo yum install openstack-swift-account
    sudo yum install openstack-swift-container
    sudo yum install openstack-swift-object
    sudo yum install openstack-swift-doc
    sudo yum install openstack-cinder
    sudo yum install openstack-cinder-doc
  • openSUSE:使用以下命令:
    sudo zypper install  openstack-swift
    sudo zypper install  openstack-swift-auth 
    sudo zypper install  openstack-swift-account 
    sudo zypper install  openstack-swift-container 
    sudo zypper install  openstack-swift-object 
    sudo zypper install  openstack-swift-proxy
    sudo zypper install openstack-cinder-api
    sudo zypper install openstack-cinder-scheduler
    sudo zypper install openstack-cinder-volume
配置

配置 OpenStack Object Storage 安装涉及到为四个包的每一个包量身定制配置文件:

  • account-server.conf
  • container-server.conf
  • object-server.conf
  • proxy-server.conf

配置文件安装在 /etc/swift/ 中。默认的一组选项在标准安装中运作良好,但在有特殊需求时,有必要编辑该配置。

使用场景

如欲了解如何使用 OpenStack 存储,可以想象这样一个场景:在该场景中,有一项服务使用一个文件系统和新代码运行了遗留软件,您想在该文件系统和新代码中使用分布式对象存储。适用于此项目的环境应该包括 Swift 和 Cinder。

首先来看一看 Cinder。

  1. 以具有 Member 角色的用户身份登录到 OpenStack Dashboard。在导航面板中的 Manage Computer 下,单击 Volumes > Create Volume
    图 2. 创建一个卷

卷应出现在项目的列表中。

图 3. 项目中的卷

图 3. 项目中的卷

  1. 编辑附件,以便将卷连接到其中一个计算实例。
    图 4. 管理卷附件

OpenStack 创建一个惟一的 iSCSI 合格名称,并将其显示给目前具有活动 iSCSI 会话的计算节点。如果实例是逻辑存储(通常是一个 /dev/sdX 磁盘),那么可以使用 Cinder 卷。

要想对您的项目使用 Swift,首先必须创建一个容器。

  1. 作为具有 Member 角色的用户身份登录到 OpenStack Dashboard,在导航面板的 Object Store 下,单击 Containers > Create Container
    图 5. 创建容器

    这是一个简单的操作,根本不会涉及提供任何数据。它只是一个名称而已。

当拥有容器之后,通常由应用程序使用对象填充它,并根据需要使用一个编程接口来检索这些对象。

图 6. 已填充的容器

图 6. 已填充的容器

  1. 不过,您还可以从仪表板上传对象。在 Object Store 下,单击 Containers > Upload Object 并提供一个包含存储内容的文件。
    图 7. 上传对象

您还可以使用界面来下载、复制或删除对象。

结束语

如您所见,OpenStack 提供了一个直观的界面来设置私有云存储,并使其可用于工作负载。这些只是所有可能情况的冰山一角。例如,许多客户使用 Ceph 或 glusterFS 作为后端存储机制,但即使在这些情况下,最终用户也只需与用户界面进行交互。如您在本系列的前几篇文章中已经了解到的,OpenStack 仅仅是集成一组可插拔组件的抽象层。

参考资料

学习
  • 查阅 OpenStack 文档。
  • 随时关注 Twitter 上的 OpenStack。
  • 在本系列中阅读更多 OpenStack 文章。
  • 阅读有关 IBM 的开放云架构 的内容。
  • 关注 Twitter 上的 developerWorks。
  • 观看 developerWorks 演示,从面向初学者的产品安装和设置演示,到面向经验丰富的开发人员的高级功能。
  • 通过 观看演示 来了解 IBM SmartCloud Application Services。
  • 查看 Ceph 存储解决方案。
  • 了解有关 GlusterFS 的更多信息。
  • 浏览 developerWorks 的云计算专区。
获得产品和技术
  • 亲自 试用 OpenStack。
  • 以最适合您的方式 评估 IBM 产品:下载产品试用版或在线试用产品。
讨论
  • 加入 developerWorks 中文社区。探索由开发人员推动的博客、论坛、群组和维基,并与其他 developerWorks 用户进行交流。

OpenStack: Storage 组件 Swift 和 Cinder的更多相关文章

  1. xcode-server – Xcode服务器在哪里存储机器人?如何将机器人转移到另一台机器上?

    我使用Xcode和Xcode服务器创建了多个机器人.我想备份这些机器人并将其转移到另一台机器上.如何才能做到这一点?

  2. openstack swift ring文件解析

    一直以为对swift的ring文件充满好奇,这段时间重新研究swift,正好借此机会好好研究下。

  3. KeyStone安装部署笔记

    KeyStone客户端:OpenStack身份服务API的命令行接口。OpenStack出于扩展性的考虑也支持多个region。下面的命令在regionOne创建了keystone的三种端点:为admin租户和用户申请令牌:最后验证admin租户和用户:输出结果验证了身份服务工作正常,Keystone安装部署成功。

  4. OpenStack对象存储――Swift

    Swift前身是RackspaceCloudFiles项目,随着Rackspace加入到OpenStack社区,于2010年7月贡献给OpenStack,作为该开源项目的一部分。Swift目前的最新版本是OpenStackEssex1.5.1。Swift特性在OpenStack官网中,列举了Swift的20多个特性,其中最引人关注的是以下几点。在OpenStack中还可以与镜像服务Glance结合,为其存储镜像文件。Auth认证服务目前已从Swift中剥离出来,使用OpenStack的认证服务Keysto

  5. OpenStack之swift安装笔记

    安装过程依然参考的是OpenStack的官方安装手册,但补充了一些细节。OpenStack的对象存储是一个多租户的、高可扩展的对象存储系统,通过RESTfulHTTPAPI管理着大量的非结构化数据,在部署对象存储之前必须至少安装了身份服务。首先在KeyStone中创建Swift的用户、服务及endpoint,具体命令及结果如下:然后安装proxy-server,swift客户端、memcached等:yuminstallopenstack-swift-proxypython-swiftclientpyth

  6. OpenStack入门到实战视频教程全集下载罗勇老师经典教程系列

    全网最经典的openstack视频教程,现在免费了!罗老师讲得实在是太好了,目前绝对是全网最好的openstack入门视频,而且讲得特别细,非常适合初学者学习,收集了好久终于齐了,现在贡献给大家。

  7. 对象存储系统Swift技术详解:综述与概念

    通过阅读Swift的技术文档,我们可以理解其中的设计的原理和实现的方法。本人于9月底开始接触swift,刚开始看文档的时候一知半解,有幸阅读了zzcase等人的博客,才得以入门。随着对swift设计原理的理解和源码的深入,文档经过数次反复的修改,希望对各位学习swift的童鞋有所帮助,水平有限,若各位发现有错误之处,恳请指出。

  8. OpenStack Swift 存储策略

    OpenStackSwift对象存储及其存储策略简介Swift2.0于2014年7月8日发布,其中最重要的新特性是存储策略,该特性改变了以往存储系统中存储策略由设计与实施方决定的做法,让用户能够以Container为粒度,为不同需求的数据指定不同的副本数量、不同参数的纠删码、不同性能的存储介质、不同地理位置、不同的后端存储设备。本文只是对存储策略做了一个简要的介绍,让读者体会存储策略的用途,进一步深入探索可以查看参考资料了解有关OpenStackSwift的更多相关信息。

  9. OpenStack Swift源码导读:业务整体架构和Proxy进程

    OpenStack的源码分析在网上已经非常多了,针对各个部分的解读亦是非常详尽。其中proxy是前端的业务接入进程。account、container和object目录分别是账户、容器和对象的业务处理逻辑进程。各个业务进程或模块之间的逻辑关系可以参考《OpenstackSwift简介》文中的架构图。在《OpenstackSwift简介》从理论上面介绍了具体的节点寻找过程。

  10. cinder swift的区别

    [原]OpenStack入门以及一些资料之2014-4-29阅读1144评论0注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明。它拥有自己的文件系统,通过网络文件系统NFS或通用文件系统CIFS对外提供文件访问服务。Raid,不同的raid等级在增加数据可靠性以及增加存储器(群)读写性能间取得平衡。卷组描述区域,和磁盘将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷的VGDA中。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部