热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenStackObjectStorage(Swift)架构简介

OpenStackObjectStorage(Swift)是OpenStack开源云计算项目的子项目之一。Swift使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。Swift的是用Python开发,前身是RackspaceCloudFiles项目,随着Rackspace加入到OpenSta

OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一。Swift使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。Swift的是用Python开发,前身是Rackspace Cloud Files项目,随着Rackspace加入到OpenStack社区,Racksapce也将Cloud Files的代码贡献给了社区,并逐渐形成现在Swift。Swift最新的发型版本为essex 1.4.6。

功能

Swift提供的服务与AWS S3基本相同,可以用以下用途:

作为IaaS的存储服务

与OpenStack Compute对接,为其存储镜像

文档存储

存储需要长期保存的数据,例如log

存储网站的图片,缩略图等

Swift使用RESTful API对外提供服务,目前 1.4.6版本所提供的功能:

Account(存储账户)的GET、HEAD

Container(存储容器,与S3的bucket相同)的GET、PUT、HEAD、DELETE

Object(存储对象)的GET、PUT、HEAD、DELETE、DELETE

Account、Container、Object的元数据支持

大文件(无上限,单个无文件最大5G,大于5G的文件在客户端切分上传,并上传manifest文件)、

访问控制、权限控制

临时对象存储(过期对象自动删除)

存储请求速率限制

临时链接(让任何用户访问对象,不需要使用Token)

表单提交(直接从HTML表单上传文件到Swift存储,依赖与临时链接)

静态WEB站点(用Swift作为静态站点的WEB服务器)

架构

OpenStack Object Storage(Swift)架构

图为Swift的基本架构。

在介绍Swift的架构之前,先介绍一下OpenStack的设计原理:

1、Scalability and elasticity are our main goals

(可扩展性和伸缩性是我们的主要目标)

2、 Any feature that limits our main goals must be optional

(任何影响到可扩展性和伸缩性的功能都必须是可选的)

3、Everything should be asynchronous,If you can’t do something asynchronously, see #2

(所有的环节必须是异步的,如果不能异步实现,参考第二条设计原理)

4、All required components must be horizontally scalable

(所有的基础组件必须能横向扩展)

5、Always use shared nothing architecture (SN) or sharding,If you can’t Share nothing/shard, see #2

(始终使用无共享的架构,如果不能实现,参见第二条)

6、Distribute everything,especially logic. Move logic to where state naturally exists.(所有的都是分布式的,尤其是逻辑。把逻辑放在状态应该存在的地方)

7、Accept eventual consistency and use it where it is appropriate.

(接受最终一致性,并在适合的条件下使用)

8、Test everything(充足的测试)

依赖组件

Memcached,分布式缓存系统,在swift中主要被用于token和account信息,container信息的存储

Sqlite,轻量级数据库引擎,在swift中主要被用于管理account和container数据库

rsync,远程同步工具,用于storage node之间的数据同步

XFS文件系统

WSGI,Python Web服务网关接口,通过paste.deploy工具包管理swift各服务进程、中间件的处理流程

Eventlet,Python搞并发网络编程库,swift所有的服务器进程均依赖于该库

主要组件

Ring文件

在基本架构图中,我并没有画出ring文件,但是它却是整个Swift中最重要的组件。ring文件是由一致性哈希算法生成,它的主要作用是存储名字到位置的映射。

ring文件分为三类,分别是:account.ring,container.ring,object.ring。

对于account的请求,就能通过account_name查询account.ring得到{‘/account_name’ : account_db_position}的映射,从而知道account数据库文件在集群的位置;

对于container的请求,通过account_name和container_name查询container.ring文件,得到{‘/account_name/container_name’ : container_db_position}的映射;

对于object的请求,通过account_name,container_name,object_name查询object.ring文件,得到{‘/account_name/container_name/object_name’ : object_position}的映射;

Ring文件作为一个静态文件存储在每个节点的/etc/swift目录下,被用于各节点之间的位置查询,使得swift的内部网络是一个P2P网络,不依赖某几个节点进行位置查询,避免了单点瓶颈。

生成ring文件的一致性哈希算法不但为数据的冗余性,分区容忍性提供了保证,也为整体架构上实现性能、容量的横向扩展奠定了基础。

Ring的详细构造过程将在下一节介绍。

proxy-server

proxy-server是proxy node中唯一运行的服务进程,也是swift集群的endpoint,向用户提供RESTful API。

对于用户的请求,proxy-server会根据配置文件的配置,将请求交给各个中间件进行处理,其中最重要的就是Auth中间件(认证),在处理完成后会根据请求路径将请求转发给相应的storage node中的account-server。container-server或object-server进程处理。

swift集群的流入数据和流出数据都需要经过proxy-server,proxy-server不会对数据进行缓存。

auth-server

验证服务进程,为用户生成token和验证每个请求的token及token的权限。swift的验证服务是作为一个中间件被proxy-server使用,是可选的,可以自己开发,也可以使用OpenStack Keystone。Keystone是官方开发的验证服务,使用Keystone可以无缝的与其它OpenStack项目整合。

account-server

account-server是storage node中负责处理对account的GET、HEAD、PUT、DELETE、RELICATION请求的服务进程,account-server使用sqlite的数据库文件保存account的相关信息。

container-server

container-server是storage node中负责处理对container的GET、HEAD、PUT、DELETE、RELICATION请求的服务进程,container-server使用sqlite的数据库文件保存container的相关信息。

object-server

object-server是storage node中负责处理对object的GET、HEAD、PUT、PSOT、DELETE、RELICATION请求的服务进程,object-server直接操作object,并利用XFS文件系统的xattr包存object的元数据。

account-auditor、container-auditor、object-auditor

这三个进程运行在storage node中,分别检测account的db文件,container的db文件,object是否损坏,如果损坏,将会向存储有其它副本的storage node请求副本,替换损坏的。

account-replicator、container-replicator、object-replicator

这三个进程运行在storage node中,分别负责account的db文件,container的db文件,object在集群中副本的同步。

例如,一个object在swift集群中通常被存储在3个不同的storage node中,对于一个PUT /account/container/object的请求,proxy-server会根据 /account/container/object查询ring文件,得到该object应该存储的节点列表(长度为3),proxy-server会将请求转发到这三个节点。如果只有两个节点写入成功,就认为这次PUT操作成功。写入失败的节点在一段时间后将会得到写入成功的节点object-replicator进程推送过来的数据。

container-updater、account-updater

这两个进程运行在storage node中,负责container数据库和account数据库的异步更新。使用异步更新的原因:在请求来量大时,container-server和account-server不能实时处理对数据库更新的请求,这些请求将被本地化到队列中,由updater进程进行异步更新。

总结

经过对Swift原理、代码的学习研究以及一系列地测试,我认为Swift简单、冗余、可扩展的架构保证了它能作为IaaS的一个基础服务。


推荐阅读
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 本文通过个人经历引出关于数学教学中的一个常见误解——被零除的结果,并深入探讨了浮点数中负零的存在及其背后的数学原理。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文深入探讨了在Spring Boot中处理RESTful风格的表单请求的方法,包括请求参数处理、请求映射以及RESTful设计原则的应用。文章详细介绍了如何利用HTTP动词(如GET、POST、PUT、DELETE)来操作资源,并结合Spring Boot的注解(如@GetMapping、@PostMapping等)实现高效、清晰的请求处理逻辑。通过实例分析,展示了如何在实际项目中应用这些技术,提高开发效率和代码可维护性。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 本文详细介绍了钩子(hook)的概念、原理及其在编程中的实际应用。通过对比回调函数和注册函数,解释了钩子的工作机制,并提供了具体的Python示例代码,帮助读者更好地理解和掌握这一重要编程工具。 ... [详细]
  • 性能测试工具的选择与应用
    本文探讨了性能测试工具的重要性及其在软件测试中的作用,重点介绍了选择合适性能测试工具的考量因素,并对几种常用的性能测试工具进行了对比分析。 ... [详细]
  • PySpark实战:高效使用DataFrame超越RDD
    本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
author-avatar
手机用户2502859861
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有