本文介绍了OpenStack存储组件,这些组件可为其他OpenStack项目提供持久存储。
如有关OpenStack计算的文章所述,计算是计算工作负载的核心。 在某些情况下,可能只需要一个计算实例,但是经常需要在实例的整个生命周期中都持续存在的持久存储。 或者可能需要在运行的服务之间共享大量数据。
实际上,在某些情况下,在OpenStack环境之外运行的应用程序取决于复制的,可伸缩的和可靠的存储,而OpenStack存储符合这些规范。 但是在评估替代方案之前,重要的是要认识到OpenStack和许多其他云服务具有两种根本不同的存储服务:
- OpenStack Swift是对象存储的示例,其概念与Amazon Simple Storage Service类似。
- 相反,OpenStack Cinder代表块存储,类似于Amazon Elastic Block Store。
块存储(煤渣)
Cinder是OpenStack块存储的项目名称; 它向来宾虚拟机(VM)提供持久性块存储。 对于可扩展文件系统,最佳性能以及与企业存储服务以及需要访问原始块级存储的应用程序的集成,块存储通常是必需的。
该系统可以公开和连接设备,随后管理服务器的创建,连接和脱离。 应用程序编程接口(API)还可简化快照管理,从而可以备份块存储的卷。
对象库(Swift)
Swift是这两种产品中较成熟的一种:自OpenStack诞生以来,它一直是一个核心项目。 Swift充当可访问API的分布式存储平台,可以直接集成到应用程序中,或用于存储VM映像,备份和档案以及较小的文件(例如照片和电子邮件)。
对象存储有两个主要概念-对象和容器。
对象是主存储实体。 它包括内容和与存储在OpenStack对象存储系统中的文件关联的任何可选元数据。 数据以未压缩和未加密的格式保存,并且由对象的名称,其容器以及键值对形式的任何元数据组成。 对象分布在整个数据中心的多个磁盘上,因此Swift可以确保数据复制和完整性。 分布式操作可以利用低成本的商品硬件,同时增强可伸缩性,冗余性和耐用性。
容器类似于Windows®文件夹,因为它是一组文件的存储盒。 容器不能嵌套,但是租户可以创建无限数量的容器。 对象必须存储在一个容器中,因此您必须至少有一个容器才能使用对象存储。
与传统的文件服务器不同,Swift分布在多个系统中。 它自动存储每个对象的冗余副本,以最大程度地提高可用性和可伸缩性。 对象版本控制为防止意外丢失或覆盖数据提供了额外的保护。
迅捷架构
Swift架构包含三个组件-服务器,进程和环。
伺服器
Swift架构是分布式的,可防止出现任何单点故障以及水平扩展。 它包括以下四个服务器:
- 代理服务器
- 对象服务器
- 容器服务器
- 帐号服务器
代理服务器为OpenStack对象存储体系结构的其余部分提供了统一的接口。 它接受创建容器,上传文件或修改元数据的请求,还可以提供容器列表或当前存储的文件。 收到请求后,它将确定帐户,容器或对象在环中的位置,并将请求转发到相关服务器。
对象服务器是一个简单的服务器,可以上载,修改和检索存储在其管理的设备上的对象(通常是文件)。 这些对象使用扩展属性存储在本地文件系统中,以保存任何元数据。 该路径基于对象名称的哈希值和时间戳。
容器服务器本质上是对象的目录。 它处理对象到特定容器的分配,并根据要求提供容器的列表。 清单在整个群集中复制以提供冗余。
帐户服务器通过使用对象存储服务来管理帐户。 它与容器服务器的操作类似,因为它提供了清单,在这种情况下,枚举了分配给给定帐户的容器。
Craft.io流程
几个计划的内务处理流程管理数据存储,包括复制服务,审计程序和更新程序。
复制服务是必不可少的过程:它们确保整个群集的一致性和可用性。 因为对象存储的主要吸引之一是它的分布式存储,所以OpenStack必须在出现瞬态错误情况(例如断电或组件故障)的情况下确保状态一致。 通过定期将本地数据与其远程副本进行比较,并确保所有副本都包含最新版本,可以做到这一点。
为了最大程度地减少比较所需的网络流量,这些服务将为每个分区子部分创建一个哈希,然后比较这些列表。 容器和帐户复制也使用散列,但以共享的高水位标记作为补充。 实际推送更新,通常使用rsync
复制对象,容器和帐户。
复制器还执行垃圾回收,以在删除对象,容器或帐户时强制执行一致的数据删除。 删除后,系统会用墓碑标记最新版本,该信号会通知复制器从所有复制的节点中删除该项目。
但是,即使最好的复制设计也仅与实现它的组件一样有效。 生产环境必须能够应对故障,无论是硬件或软件故障的结果,还是仅仅是容量不足的产物。 在Swift中,这是通过更新程序和审计程序完成的。
在出现故障时,更新程序负责确保系统的完整性。 当复制服务遇到问题且无法更新容器或帐户时,会出现一段时间的不一致,在此期间对象存在于存储中,但未在所有容器或帐户服务器上列出。 在这种情况下,系统会将更新排队在本地文件系统上,并且更新程序会定期重试更新。
审核员可以提供更高级别的保护,以防止不一致。 他们定期扫描本地存储库,以验证帐户,容器和对象的完整性。 当发现任何损坏时,他们将隔离该元素并将其替换为另一个副本的副本。 如果他们发现无法协调的不一致之处(例如,不属于任何容器的对象),则将错误记录在日志文件中。
戒指
用户和其他OpenStack项目通过其逻辑名称引用存储实体,但是最终,所有请求(无论是读取还是写入)都需要映射到物理位置。 为此,代理服务器和后台进程(包括复制服务)需要能够将逻辑名映射到物理位置。 这种映射称为环。 帐户,容器和对象分配有单独的环。 环根据设备,分区,副本和区域来描述此映射。
在此上下文中,术语分区是指存储在环中的内容的逻辑子集。 建议为每个参与设备分配100个分区。 分区在分配给OpenStack对象存储的所有设备之间平均分配。 如果群集使用大小不同的驱动器,则还可以分配权重,以平衡设备之间分区的分布。
默认情况下,每个分区被复制3次。 可以使用更高的数量来优化可用性,但是显然这也会增加存储消耗。 环还指定了在故障情况下应使用哪些设备进行切换,以及在将设备添加到群集或从群集中删除设备时如何重新分配分区。
环形映射的最后一个元素是用于启用数据亲和力和反亲和力的区域。 区域可以代表存储设备,物理服务器或位置,例如机架,过道或数据中心。 用户可以使用此逻辑概念来满足他们的需求,但是它通常反映诸如位置,电源和网络连接之类的物理元素。
Cinder架构
Cinder比Swift更加简单,因为它不提供自动对象分发和复制。 图1显示了Cinder的体系结构。
图1. Cinder架构
与其他OpenStack项目类似,Cinder的功能通过API向仪表板和命令行公开。 它能够通过具有表示性状态传输(REST)的HTTP API访问对象存储,并使用称为Auth Manager
的Python类将身份验证结合到OpenStack Keystone。
该API解析所有传入的请求并将其转发到消息队列,在此由调度程序和卷服务执行实际工作。 创建新卷后,调度程序将决定由哪个主机负责。 默认情况下,它将选择具有最大可用空间的节点。
卷管理器管理可动态连接的块存储设备,称为卷。 它们可以用作虚拟实例的启动设备,也可以用作辅助存储。 Cinder还提供了用于快照的功能,快照是卷的只读副本。 然后可以使用这些快照创建新卷以供读写使用。
卷通常通过iSCSI连接到Compute节点。 块存储还需要某种形式的后端存储,默认情况下是本地卷组上的逻辑卷管理,但可以通过驱动程序扩展到外部存储阵列或设备。
设定
实际的安装说明在发行版和OpenStack发行版之间有很大差异。 通常,它们是发行版的一部分。 但是,必须完成相同的基本任务。 本节使您对所涉及的内容有所了解。
系统要求
OpenStack依赖于64位x86架构; 否则,它是为商品硬件设计的,因此最低的系统要求是适度的。 可以在具有8GB RAM的单个系统上运行整个OpenStack项目套件。 但是,对于大工作量,使用专用系统进行存储是有意义的。 由于重点放在商用设备上,因此不需要冗余的独立磁盘(RAID)功能阵列,但是建议至少使用双四核CPU,8-12GB RAM和1GB网络适配器。 显然,硬盘驱动器或固态磁盘的大小取决于要存储的数据量和所需的冗余级别。
安装
安装说明取决于发行版,更具体地取决于您选择的软件包管理实用程序。 在许多情况下,必须声明存储库。 因此,例如,在Zypper的情况下,您用zypper ar
向libzypp
宣布:
# 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 EnterpriseLinux®,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
- 红帽 :在红帽系统上,命令是:
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对象存储安装涉及为四个软件包中的每一个定制配置文件:
- account-server.conf
- container-server.conf
- 对象服务器
- proxy-server.conf
配置文件安装在/ etc / swift /中。 一组默认选项对于标准安装而言效果很好,但是对于任何特殊要求,有必要编辑配置。
使用场景
为了了解如何使用OpenStack存储,请设想一个场景,在该场景中,您要使用文件系统和新代码运行要运行旧版软件的服务,而要使用分布式对象存储。 该项目的环境应包括Swift和Cinder。
让我们从Cinder开始。
- 以具有成员角色的用户身份登录到OpenStack仪表板。 在导航窗格中的管理计算机下,单击卷 > 创建卷 。
图2.创建一个卷
- 该卷应显示在您的项目列表中。
图3.项目中的卷
- 编辑附件以将卷连接到您的计算实例之一。
图4.管理卷附件
OpenStack创建一个唯一的iSCSI限定名称,并将其公开给现在具有活动iSCSI会话的计算节点。 实例可以将Cinder卷用作本地存储(通常是/ dev / sdX磁盘)。
要在项目中使用Swift,必须首先创建一个容器。
- 以具有成员角色的用户身份登录到OpenStack仪表板。 在导航窗格中,在“对象存储”下,单击“ 容器” >“ 创建容器” 。
图5.创建一个容器
这是一个简单的操作,完全不需要提供任何数据。 这只是一个名字。
- 有了容器后,通常由应用程序决定是否要使用对象来填充它并使用编程接口根据需要检索它们。
图6.填充的容器
- 但是,您也可以从仪表板上载对象。 在对象存储下,单击容器 >上载对象 ,然后为文件提供存储的内容。
图7.上传一个对象
您也可以使用该界面下载,复制或删除对象。
结论
如您所见,OpenStack提供了一个直观的界面,用于设置私有云存储并将其提供给工作负载。 就可能而言,这些只是冰山一角。 例如,许多客户使用Ceph或GlusterFS作为后端存储机制,但是即使在这种情况下,最终用户也只需要与用户界面进行交互。 正如您在本系列的前几篇文章中所看到的,OpenStack只是一个抽象层,它集成了一组可插拔的组件。
翻译自: https://www.ibm.com/developerworks/cloud/library/cl-openstack-swift-cinder/index.html