openstack swift

来源:互联网 发布:bandcamp 知乎 编辑:程序博客网 时间:2024/05/01 01:35

0.1swift 是什么?

OpenStack Object Storage 最开始是由 Rackspace 开发,并于 2010 年 7 月贡献给 OpenStack ,作为其开源子项目。 OpenStack Object Storage 最初作为 RackspaceCloud Files service 的主体实现,工程代号为 swift 

OpenStackObject Storage (Swift)是开源的,用来创建可扩展的、冗余的、对象存储(引擎)。swift使用标准化的服务器存储PB级可用数据。但它并不是文件系统(file system),实时的数据存储系统(real-timedata storage system)swift看起来更像是一个长期的存储系统(long term storage system),为了获得、调用、更新一些静态的永久性的数据。比如说,适合存储一些类型的数据:虚拟机镜像,图片存储,邮件存储,文档的备份。没有“单点”或者主控结点(master point of control)swift看起来具有更强的扩展性、冗余和持久性。

0.2  Swift Architectural Overview
============================
TODO - add links to more detailed overview in each section below.

Proxy Server

proxy server 负责连接swift的其他构件。对每次请求(request) ,proxy server都查询ring中的account,container或者object(account,container, or object in the ring in the ring),并转送请求。公开的api也是通过proxy server暴露给外部。

prox server 同样处理大量的"请求失败",proxy server并不干预对象的数据流在object sever和user之间传递(实际上,proxy只是作为"请求信息"的主控结点,而不参与数据传送)。
-------
The Ring
--------

ring代表存储在硬盘上的实体(entity)名称和实际物理位置的映射。accounts, containers,objects都有各自的ring。当其它组件需要对object,container或者account操作时,需要使用各自的ring去确定各自在集群上的位置.

ring 使用zones,devices,partitions和replicas来维护这些映射(mapping)信息。每个ring中的partition在集群中都(默认)有3个replica(副本)。
而每个partition的位置由ring来维护,并存储在映射(mapping)中。当请求失败时(译注:多数为存储或转移数据时目标server无响应),ring同样负责决定哪一个device将接手(请求)

ring中的数据由zone保证各自隔离。每个partition的replica被放在不同的zone上。一个zone可以是一个驱动器(drive),一个server,一个机架(cabinet),一个交换机(switch),甚至是一个数据中心(datacenter)。
swift安装时ring的device会均衡的划分每个partition。当partition需要移动时(例如新device被加入到集群),ring会确保一次移动最少数量的partition,并且一次只移动一个partition的一个replica。(译注:partition的移动可能并不是真实的移动,也许只是大小的改变,机制待挖掘...partition为多大还不是很清楚)

ring 被proxy server和一些后台进程(比如replication)使用。

-------------
Object Server
-------------

object server 是个非常简单的大对象(blob)存储server,可以用来操作(检索和删除)本地device上的object。object以二进制文件的形式和元数据(metadata)存储在文件统(filesystem)上,元数据放在文件系统的扩展属性(xattrs)中。这潜在的要求object server需要支持有扩展属性(xattrs)的文件系统(file system)。一些文件系统,像ext3,默认的xattrs属性是关闭着的。
每个object名字hash之后加上操作时的时间戳组成object的存储路径名。last write(上次的写操作)一定是成功的,并要确保最新的object已经可以对外(提供)服务(读、写)。删除(操作)也作为文件的一个版本(一个0 byte文件,以.ts为后缀,代表tombstone墓碑)。这确保被删除的文件副本被正确删除,而不是在不恰当的时候意外出现(比如删除失败due to failure scenarios)。


----------------
Container Server
----------------

主要工作为处理object的列表动作(listing).container server 并不知道object存在哪,只知道指定container里存的哪些object。这些列表以sqlite数据库文件的形式存储,类似object一样在集群上做备份。container server也跟踪(trace)做一些统计,比如object的个数,container的使用情况。

--------------
Account Server
--------------

除了负责处理container的列表动作(listing),account server和container server是非常相似的。

-----------
Replication
-----------

replication被设计用来保证系统故障时(比如网络瘫痪、或drive 宕机)的数据一致性。

replication进程比较本地数据和远程拷贝,确保他们都包含最新的文件版本。object replication用hash表快速比较每个partition的子段(subsection);container replication和account replication使用hash 和共享的高水位线(high water marks)进行文件版本的比较。

replication更新时,replication是以push(推动)为基础。对object replication来说,更新是传输一些rsync同步文件(而不是新的全部文件)到各个结点。account server 和container server则使用http或rsync补全整个数据库文件上丢失的记录。

replicator同样应该确保被删除的数据确实从系统中删除了。当一项(object,container,account)被删除掉,则这项的最新的版本标志(as the latest version)被设置成tombstone(译注:也许并没有被删除,只是"标记"为删除)。replication将能看到tombstone,并确保置为tombstone的项已从整个系统中删除掉了.
--------
Updaters
--------

总有很多情况container和account中的数据不会被立即更新(update)。这种情况经常发生在系统故障或者是高负荷的情况下。如果一次更新(update)失败,(按上下文,update操作一般是远程的update)会排队(queue)请求本地文件系统进行更新,这时updater会继续尝试更新(update)工作。这时最终一致性间隔(eventual consistency window)将会起作用。(This is where an eventual consistency window will most likely come in to play。)例如,假设一个container server被加载之后,一个新的object被加入到系统。当proxy server 回应client请求(说明已写成功,client之后请求读),这个object应该是立即可读的。但是container server 并没有更新object列表。因此更新(update)将排队(queue)等待延后的更新(update)。container 列表不可能立即就包含这个新的object。

实际使用中,一致性间隔(也称一致性窗口,the consistency window)的大小和updater的运行频度一致,但如同proxy server 会转送(route)列表请求(listing request)给第一个响应的container server一样,updater的工作并不会被注意到。当然正在被加载(under load)的server不应该响应后续的列表请求(listing requests),其他2个(如果副本为2)中的一个应该处理这些列表请求。
--------
Auditors
--------

auditors会在本地服务器上反复的“爬”,以保证object、container、account的完整性。一旦发现不完整的数据(即使是bit级的差异),该文件就会被隔离,然后replication会从其他的副本那里把“问题文件”替换。如果其他错误出现(比如在任何一个container server 中都找不到所需的object),还会记录进日志

0.3 swift 怎么使用?

上层开发者指的是上层开发者指的是调用Swift REST接口进行编程的人员。Swift面向开发者提供了一个REST接口文档,可参考这个文档写程序按照这个文档,根据Openstack站点上描述,SwiftRackspace的云文件存储的接口是兼容的,可以使用Rackspacs提供的经过特定语言封装REST之后的编程接口,这样对程序员会更友好。调用Swift REST接口进行编程的人员。Swift面向开发者提供了一个REST接口文档,可参考这个文档写程序按照这个文档,我成功写了一个简单的创建、上传和下载的网络应用实例。根据Openstack站点上描述,SwiftRackspace的云文件存储的接口是兼容的,可以使用Rackspacs提供的经过特定语言封装REST之后的编程接口,这样对程序员会更友好。

HTTP GET ,请求 object 的下载; HTTP HEAD 请求 object metadata (元数据), HTTP DELETE删除处理 object 。

支持多种语言封装对 object 的请求,包括 Java, Python, Perl, PHP, .NET。




参考文献:

http://blog.csdn.net/zzcase/article/details/6578521

http://laokaddk.blog.51cto.com/368606/830751

http://blog.sina.com.cn/s/blog_6b98772b0100pk7p.html