OpenStack:Swift组件介绍

来自CloudWiki
跳转至: 导航搜索

背景与概览

O1-40.png

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

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

基本原理

一致性散列(Consistent Hashing)

面对海量级别的对象,需要存放在成千上万台服务器和硬盘设备上,首先要解决寻址问题,即如何将对象分布到这些设备地址上。Swift 是基于一致性散列技术,通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用 2 的 n 次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。

Openstack9-34.png

数据模型

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

Openstack9-2.png

明确以下三个基本概念:

  • Account:出于访问安全性考虑,使用Swift系统,每个用户必须有一个账号(Account)
  • Container:Swift中的container可以类比Windows操作系统中的文件夹或者Unix类操作系统中的目录,用于管理数据,所不同的是container不能嵌套
  • Object:Object(对象)是Swift中的基本存储单元

Account、Container、Object是Swift系统中的3个基本概念,三者的层次关系是一个Account可以创建拥有任意多个Container,一个Container中可以包含任意多个Object。

Swift优势

  • 数据访问灵活性:Swift通过Rest API接口来访问数据使得资源管理实现自动化
  • 高数据持久性:Swift提供多重备份机制,拥有极高的数据可靠性
  • 极高的可拓展性:Swift通过独立节点来形成存储系统,在数据量的存储上就做到了无限拓展
  • 无单点故障:由于Swift的节点独立的特点,不会发生传统存储系统的单点故障

架构解析

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

Openstack9-35.png 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):移除被标记为删除的账户,删除其所包含的所有容器和对象。

REST架构

Swift采用了REST架构

REST(Representational State Transfer)是一种轻量级的Web Service架构风格, 这个原则诞生于2000年,是Roy Fielding 的博士论文第一次提出的,该人,是 HTTP(1.0/1.1) 规范的主要编写者之一,也是Apache服务器软件的作者之一,Apache基金会的第一任主席。

而RESTful是指按照REST规定的规则应用程序或者设计风格。

Openstack9-100.JPEG

REST的规则概括起来有以下五个方面:

  • 以资源为核心

什么是资源?在web应用中,什么都是资源(或者抽象成资源)。资源可以是一个实体,也可以是一个过程,或者也可以是一个版本。比如,商品是资源,库存是资源,价格是资源等等。


  • 每个资源分配唯一一个URL

每一个资源一个URL,而且是唯一的URL,比如我们使用http://www.haodaquan.com/v0/product 这个URL标识商品资源。

  • 通过标准的HTTP(HTTPS)方法操作资源。

操作(调用)资源使用HTTP中的标准方法,比如常见的GET(获取资源),POST(存储资源),PUT(重置资源),PATCH(局部更新资源)、DELET(删除资源),也可能会有HEADER和OPTIONS方法。

  • 资源的表现层可以是xml、json或者其他

这里是指调用资源后返回的数据格式,一般以JSON和XML居多,特别json格式可以直接被js使用,爽的很,经常被使用。

  • 操作是无状态的

REST架构是不存储调用者的状态的。换句话说,比如登陆才能调用资源,你可别指望登陆这个状态让REST服务帮你存储。换句话说,业务层的活,REST不干。

CRUD原则

REST软件架构使用了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:

创建(Create)、获取(Read)、更新(Update)和销毁(DELETE),就可以组合成其他无数的操作。

其实世界万物都是遵循这一规律:生、变、见、灭。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭)

因为其简洁方便性,越来越多的web服务开始采用REST风格设计和实现。

因为Swift采用REST架构,我们不能像普通的文件系统那样对数据进行访问,必须通过它提供的API来访问操作数据。

Openstack9-1.png

Swift支持的操作

Swift 支持的所有操作可以总结为表 1:

表 1. Swift RESTful API 总结
资源类型 	URL 	GET 	PUT 	POST 	DELETE 	HEAD
账户 	/account/ 	获取列表容器 	- 	- 	- 	获取账户元数据
容器 	/account/container 	获取对象列表 	创建容器 	更行容器元数据 	删除容器 	获取容器元数据
对象 	/account/container/object 	获取对象内容和元数据 	创建、更新或拷贝对象 	更新对象元数据 	删除对象 	获取对象元数据

详细的 API 规范可以参考开发者指南。应用开发可采用 Swift 项目本身已经包含的 Python 的绑定实现;如果使用其它编程语言,可以参考 Rackspace 兼容 Swift 的 Cloud Files API,支持 Java,.Net,Ruby,PHP 等语言绑定。

参考文档: https://baijiahao.baidu.com/s?id=1563270305805056&wfr=spider&for=pc

[2] https://blog.csdn.net/qq_38526635/article/details/81636063