OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一。Swift使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。Swift的是用Python开发。

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存储,依赖与临时链接)

swift的构架一般如下:可扩展性和伸缩性是我们的主要目标

swift服务依赖于以下技术

memcache 存储token、account、container信息等。

sqlite 用于管理account和container数据库

rsync 在storage node之间同步数据

xfs

Wsgi python web服务网管接口管理swift进程

eventlet python 并发网络库

proxy server

proxy server是proxy node中运行的唯一的进程服务,他是swift集群的endpoint。proxy server负责连接swift的其他构件,对每次请求,proxy server都会查询ring中的account、container或者object,然后转发请求。API接口也是通过proxy server开放给外部的。proxy server也会处理大量的失败请求,例如当一个object PUT时,这时他会查询ring中其他可以提供服务的server,并转发请求。proxy server并不缓冲数据在object server和user之间,对于用户的请求proxy server会根据配置文件将请求交给中间件处理,在处理完成后会将请求路径转发给相应的storage node中的account、container或者object进行处理

ring

ring代表了存储在硬盘上的实体和实际物理位置的映射,account、container、object都有自己的ring,当其他组件需要对account、container或者object操作时,就需要用ring去确定各自在集群上的位置。

ring使用zone、devices、partitions、replicas来维护这些映射信息,每个ring中的partition在集群中都默认有3个副本(replicas),每个partition的位置由ring来维护,存贮在映射中,当请求失败时ring负责决定哪一个device接手请求。ring中的数据由zone保证各自隔离,每个partition的replica都被放在不同的zone上,一个zone可以是一个drive,一个server,一个cabinet,一个switch或者一个datacenter。

swift在安装ring的device时,会均衡的划分每个partition,当partition需要移动时,ring确保一次移动最少数量的partition,并且一次只移动一个partition的一个replica,weight可以用来均衡drive在partition在集群中的分布。

container server

container server主要处理object的listing,container server并不知道object存贮在哪里,只知道指定的container里面存储了哪些object,这些列表一sqlite数据库文件的形式存储,object一样在集群上做备份,container server也跟踪做一些统计。

container-server是storage node中负责处理对container的GET、HEAD、PUT、DELETE、RELICATION请求的服务进程。

account server

account server负责处理container的listing动作,作用和container server一样,account-server是storage node中负责处理对account的GET、HEAD、PUT、DELETE、RELICATION请求的服务进程。

object server

object server是一个简单的blob存储,他可以用来操作(检索和删除)本地devices上的objects,object以二进制文件的形式和元数据(Metadata)存贮在文件系统上,元数据存放在文件系统的扩展属性中(xattrs)中,ext3的xattrs默认是关闭的。每个object的名字hash之后加上操作的时间戳组成object的存贮路径名,last write一定是成功的,并确保最新的object已经可以对外提供服务,删除操作也作为文件的一个版本,确保被删除的文件副本被正确的删除。

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

replication

replication用来保证系统故障时的数据一致性,replication进程比较本地数据和远程的拷贝,确保他们都包含最新的版本,object replication用hash表快速的比较每个partition的子段,container replication和account replication使用hash和high water marks进行文件版本比较,replication更新时,replication是以push为基础,对于object replication来说,更新时传输一些rsync同步文件到各个节点,并不是全部文件,account server和container server使用http或者rsync补全整个数据库文件上丢失的记录,replication同样确保被删除的数据确实从系统中删除了,当一项(object、container、account)被删除掉,则这项的最新的版本标志被设置成tombstone,replication能够看到ts,并确保设置为ts的项从系统中删除。

auditors

auditors 会在本地服务器上反复的检查,以保证object、container、account的完整性,一旦发现不完整的数据,该文件会被立即隔离,然后replication会从其他副本那里把问题文件替换。

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中会涉及到Proxy Server,Account Server,Container server,Object Server四种服务器。在Account Server,Container server,Object Server 3个服务器中都会有复制器(Replication),更新器(Updater),审计器(Auditor),分别负责相应服务存储数据的复制,更新,及其数据的审核。

在Account server中存储了包括的该系统会涉及到的容器列表,在Container server中,包含的是该系统存储的所有的对象信息列表,这两种服务器的数据组织都以sqlite数据库文件的形式存储,而Object Server是一个非常简单的块存储服务器,对象以二进制形式存储。

Openstack swift对象存储的更多相关文章

  1. ios – 重新创建Persistant Store后的核心数据错误

    在我的应用程序中,我能够清除数据库中的所有数据.完成此操作后,将解析捆绑的JSON,然后将其保存到数据库(以便将数据库返回到默认状态).解析和保存此JSON的操作在任何情况下都可正常工作,除非在清除并重新创建持久性存储之后,在这种情况下我得到’NSinvalidargumentexception’,原因:’无法从此NSManagedobjectContext的协调器访问对象的持久存储’.在保存在后

  2. core-data – 错误: – [UIImage _deleteExternalReferenceFromPermanentLocation]无法识别的选择器发送到实例

    当我删除包含图像的托管对象时,在外部记录中存储为可转换值,然后我崩溃并出现此错误:解决方法我在AppleDeveloperforums回答了类似的事情.我猜你在数据建模器中的那个字段上选择了外部存储复选框.有一个bug可以解决.我是这样做的:一旦更新了数据并保存了上下文,任何删除它的尝试都会引发这个“无法识别的选择器”异常.要强制可以响应_deleteExternalReferenceFromPe

  3. ios – 如何使用string中的参数创建Selector

    我正在使用Swift3.1和Xcode8.3.3编写程序.我想创建一个类,负责在键盘出现和消失时移动整个视图.但是我在使用字符串参数创建自定义选择器时遇到了困难.要显示或隐藏键盘我们需要功能:我正在尝试创建一个这样的选择器:它正在编译,但是当键盘出现时,它会崩溃.因为它是独立的类我不能使用这种结构:因为它将Swift函数转换为Objective-C函数.所以问题是:如何用参数字符串创建一个Selector表单?

  4. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  5. ios – 如何为NSNotification编写单元测试

    我在swift工作,我想刷新一个页面,所以我使用通知发送它,我在一个ViewController中发布通知并在另一个中添加观察者,它工作正常.我想要做的是在swift中添加单元测试.我查了很多网站但是没能做到.我是新手,不知道从哪里开始.基本上工作是,当我点击按钮通知被发布时,并且当加载下一个视图控制器时,添加通知观察者.我该怎么做单元测试提前致谢编辑:码并添加观察者解决方法一般的解决方案是:使用

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – NSNotificationCenter多次呼叫

    我在我的应用程序中实现了NSNotificationCenter.我在完成图像解码时发送通知.第一次图像解码将完成8次.所以通知假设发送8次.但它调用64次(8*8).这是我的代码我是如何实现的–>//初始化//调用方法//解除分配//发布通知有人可以建议我做错了.提前致谢.//调用方法是这样的(调用8次)解决方法解:我重新检查了我的代码,initWithFrame:(CGRect)框架调用了8次

  8. ios – 使用NSMutableAttributedStrings快速更改文本颜色

    我有一个UITableView,我想在同一行中使用不同的颜色显示每行的文本.我试过这个代码,尝试从Obj-C翻译,但我不能让它工作这一切的输出是其中数字34对应于object.valueForKey!.description)被替换为{.如果我留下关于NSAttributedString的这段代码,行文本会正确显示.解决方法我认为问题可能在于分配给cell.textLabel?.attributedText.也许是这样的:不确定你是否希望字符串的第二部分是红色或其他颜色,所以我把它变黑了.

  9. Xcode / iOS:如何隐藏Navigation-和ToolBar向下滚动?

    我想在iPhone上隐藏两个滚动条.当我向上滚动时,他们应该再次出现..我该如何处理?

  10. ios – 通过objectID获取NSManagedObjects数组返回空数组

    TL;DR其持久性存储协调器不再在内存中的NSManagedobjectID会丢失其NSEntityDescription(实体),并且不会将等同于来自不同持久性存储协调器的NSManagedobjectID,即使它们的URIRepresentation相同也是如此.沿着兔子洞甜蜜……),因为这些objectID来自的PSC现在不再在内存中,并且NSManagedobjectID必须保持对必须由PSC持有的NSEntityDescription(实体)的一周引用.正如评论者所怀疑的那样,零实体似乎会引起问

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部