OpenStack:Swift组件介绍
目录
背景与概览
Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack 开源社区作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务。Swift 构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。
此项目是基于 Python 开发的,采用 Apache 2.0 许可协议,可用来开发商用系统。
基本原理
一致性散列(Consistent Hashing)
面对海量级别的对象,需要存放在成千上万台服务器和硬盘设备上,首先要解决寻址问题,即如何将对象分布到这些设备地址上。Swift 是基于一致性散列技术,通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用 2 的 n 次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。
数据模型
Swift 采用层次数据模型,共设三层逻辑结构:Account/Container/Object(即账户/容器/对象),每层节点数均没有限制,可以任意扩展。这里的账户和个人账户不是一个概念,可理解为租户(即单位账户),用来做顶层的隔离机制,可以被多个个人账户所共同使用;容器代表封装一组对象,类似文件夹或目录;叶子节点代表对象,由元数据和内容两部分组成,如图 4 所示:
明确以下三个基本概念:
- 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 模式,提高了系统吞吐和响应能力
- 代理服务(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规定的规则应用程序或者设计风格。
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来访问操作数据。
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