OpenStack对象存储(Swift)要领(译)-第二章

第二章:OpenStack架构

OpenStack Swift的神奇之处在于,它将一组无关的廉价商品存储服务器转变成可扩展的,耐久的,便于管理的存储系统.我们将通过理解对象逻辑结构和Swift怎样虚拟化底层硬件去组织数据来具体分析Swift的架构(基于Juno释出的版本).本章包括数据路径软件服务器的介绍和四种基本操作(create,read,update,delete)和后处理软件.本章讨论了内联中间件的选择和其他关键特性.

对象逻辑结构

首先,来看看对象的逻辑结构,然后是Swift怎样将对象完全抽象和映射到物理硬件上.

一个租户分配一个账户.一个租户的实体可以是个人,部门,公司等.一个账户可以有多个容器.一个容器可以有多个对象,如下图所示.对象在本质上可以视作文件.

Swift对象逻辑结构

一个租户可以添加额外的用户到账户中.用户可以持续添加容器或向容器中添加对象而不用像传统块或文件级存储那样考虑物理边界.一个账户中的容器显然需要一个唯一的名字,但两个分离的账户中的容器可以重名.容器是扁平化的,对象不是分层存储的,相对于文件系统中文件的存储–文件夹可以嵌套,这简化了设计也消除了许多分层文件系统存在的性能问题.然而,Swift确实提供了伪目录(pseudo-directories)的机制–在对象名中添加正斜杠(/)分隔符.

Swift的架构和实现

以下是所有存储系统必须解决的两个关键问题:

  • 从哪取放数据
  • 如何保持数据的耐久性和可用性

在讨论架构和实现之前,先来探究下这两个核心问题吧.

架构关键原则

以下是Swift的核心架构原则:

  • 自主设计:一个系统分配一个管理员容易造成故障和性能瓶颈.自主设计消除了这些隐患并且允许响应集群的多个成员的API请求.

  • 松耦合:集群中的各部分无需紧密的联系.这也在本质上减少了故障和性能瓶颈的产生.

  • 负载均衡:除非负载分散,否则无法保障性能,容量以及账户,容器和对象的可扩展性.

  • 自我修复:系统必须自我调整以应对硬件故障.按照第一章讨论的CAP理论,Swift的设计使其能应对硬件的局部故障.

  • 多租户层次:一些对象存储系统只是简单的为提交的对象返回一个散列关键字和提供一个完全扁平化的命名空间,而将创建账户容器和将关键字映射对象名的任务留给用户完成.Swift为用户提供了精心设计的数据组织层次,简化了用户的使用.

  • 可用性和最终一致性:如第一章讨论的,Swift需要最大化数据可用性然后确保数据能在最短操作时间内于所有节点实现一致性.

  • 异构:构成Swift的存储节点不需要完全一样.事实上如我们所见,可以使用相应的存储策略将对象放置在特殊的硬件上.

数据物理结构

Swift从逻辑结构中完全抽象出了物理结构.在物理层,Swift将一个区域的数据划分到一个层次中,如下图所示:

数据物理结构层次

下面是各层次介绍:

  • Region:这是Swift存储的最高层级,不同region的数据在地理上分隔因此深受高延迟链路之苦.但一个用户可能只使用一个,例如,只使用一个数据中心的集群.

  • Zone:zone在region内.zone是一组分别表现出不同可用性特征的存储节点.这里的可用性可能是一个关于物理构建,能源动力或网络连接的函数.这意味着一个zone可以是单个存储服务器,一个机架式服务器或一个完整的数据中心,这完全取决于你的需求.zone之间需要用低延迟链路连接.Rackspace建议一个region中至少需要五个zone.

  • 存储服务器:一个zone由一组存储服务器组成.

  • 磁盘(磁盘设备):磁盘驱动器是存储服务器的一部分.它可以是在服务器内或者连接一个磁盘簇(JBOD).磁盘设备可以运转磁盘或固态硬盘.

Swift为每个对象存储数个副本(默认三个)在不同的磁盘中.根据尽可能唯一(as-unique-as-possible)算法,这些备份彼此间隔尽可能”远”,这个算法依次尝试将数据放在不同的region,zone,存储服务器,磁盘块上(逐层检查是否不重复且数量大于副本数,若满足条件则将副本存储到该层各不相同的子集上).这个算法有利于Swift的耐久性,也提高了数据的可用性,自此三个节点是不连通的,导致数据也是连通的(???).

Swift使用半静态表确定在哪放置对象和它们的副本.它是半静态的因为一个叫做环(ring)的查找表,由Swift中的一个叫做环生成器(ring builder)的外部进程创建的.环是可以修改的,但不是动态的也不由Swift实施.它不是分布式的,所以每个处理数据安置的节点都有一个完整的环的拷贝.环有一个叫分区(不要与通常所说的磁盘分区(partition)混淆)的入口.根本上说,一个对象映射一个分区,分区分配设备存储它的副本.环也提供了一个可供切换的设备列表以应对初始化故障,为了达到相同的目的,对账户和容器也使用一样的机制.在整个集群中,账户环和容器环只有一个,但对象环为了非常重要的容量因素数量不止一个,接下来解释这个.

Swift允许同一集群中不同容器里的对象存在于不同的硬件集上.这点非常有用,如此管理员就可以根据如下的特性制定数据放置策略:

  • 耐久性:双重备份,三重备份等等

  • 硬件型号:运转磁盘,固态硬盘等等

  • 地理位置:多区域分隔存储,特殊区域存储等

管理员可以对这些策略进行适当的命名易于用户理解.然后用户可以根据特定的容器选择相应的策略.例如,医学图像可以存储在一个使用三重异地备份高密度磁盘节点策略的容器中.

日志可能存储在一个使用固态硬盘作为节点的双重备份单区域的容器中.Swift支持多个对象环的能力支持了存储策略的实施.每个环都遵循一个策略而且有一套特殊的设备重定向对象请求.

对象实际上存储在磁盘的文件系统上,例如,范围文件系统(XFS).账户和容器信息存储在SQL数据库中以应对并发存取.账户数据库存放账户的容器列表,容器数据库存放着容器的对象列表.这些数据库存放在一个单文件中,这个文件就像任何其他对象一样备份.

数据路径软件服务器

数据路径由以下四个软件服务器组成.这些都是技术上的服务但Swift文档称它们为服务器.为了保持一致,我们也称它们为服务器:

  • 代理服务器

  • 账户服务器

  • 容器服务器

  • 对象服务器

在不需要性能考虑的情况下,账户,容器和对象服务器通常放在一个叫做存储服务器(或节点)的物理服务器中,如下图所示:

数据路径软件服务器;一个存储服务器包含账户,容器和对象服务器

各种服务器的介绍如下:

  • 代理服务器:代理服务器是用来响应接收用户的HTTP请求,请求需要利用合适的环寻址需要被路由的存储服务器(或服务器).代理服务器通过查找可供切换的节点和执行读写绑定应对故障(在region内传递读写操作,参照创建操作读操作部分).当对象从对象服务器传入传出时,都是直接经过代理服务器.此外,代理服务器还支持读写quorum机制和托管大部分内联中间件(在本章后述讨论).

  • 账户服务器:账户服务器在一个特殊的账户里跟踪着其下所有容器名.数据存储在SQL数据库中,数据库文件存储在文件系统中.此服务器还跟踪着统计数据,但没有任何容器的存储单元信息,通常它和容器,对象一起被托管在同一个物理服务器上,但在大型安装项目中,它们需要分散在不同的物理服务器上.

  • 容器服务器:这个服务器和账户服务器很相似,不同之处是它在一个特殊的容器中处理其下所有对象名.

  • 对象服务器:对象服务器只存储着对象.每个磁盘都有一个文件系统,对象就存储在这些文件系统中.

让我们用各个组件构成数据的物理结构并探究以下四个基本操作:增,删,改,查(CRUD).为简单起见,我们将专注于对象服务器,不过之后也会深入推测账户和容器服务器.

创建操作

创建请求通过HTTP PUT API调用送达代理服务器.无论哪一个代理服务器接收到请求效果都相同,因为Swift是一个分布式系统,所有的代理服务器都被平等的创建.代理服务器与特定的环相互作用,进而使容器获得磁盘列表,进而向目标对象服务器写入数据.正如之前分析的,这些磁盘内容需要尽可能保持唯一.如果某一磁盘有故障或不可用了,环提供切换方案.一旦大多数磁盘写成功(例如,3个副本中的两个),则操作成功.如果剩下的也写成功了,任务结束,如果没有,备份进程最终将会完成剩余拷贝的创建,如下图所示:

创建操作

创建操作工作机制在多region集群中略有不同.对象的所有拷贝都写在其所在的region中.这通常被称为写绑定(write affinity).然后异步的转移到其他的region中.这个操作可能要使用一个专用的备份网络.

读操作

请求是通过HTTP GET API调用送达代理服务器.同样,任何代理服务器都可以接收这个请求.与创建操作过程相似,代理服务器与特定的环相互作用得到磁盘列表进而对目标对象服务器进行读操作.请求通过代理服务器发送到同一region内部的对象服务器称为读绑定(read affinity).对于在多个region间实现,最终一致性是摆在面前的一个问题,因为不同的region可能有不同的对象版本.为了解决这个问题,读操作只读取时间戳相对最大的对象,既然如此,代理服务器需要首先请求所有对象服务器的时间戳然后从有最新拷贝的服务器上读数据.与写相似,为了预防故障会提供备用切换措施.

更新操作

更新请求的处理与创建请求方式相同.对象都存储有时间戳,以确定被读得时候返回最新的版本.Swift在每个容器上也提供一个版本控制功能.当它开启时,之前版本会组成一个新的容器称为版本容器(versions_container)并保持可用.

删除操作

删除请求如更新请求一样是通过HTTP DELETE API调用送达代理服务器,不过不是产生一个新的版本,而是一个占用0字节的”墓碑”版本将取而代之.删除操作在分布式系统中很难实现,因为系统会从根本上抵制删除–通过还原被删除的副本确保对象有正确数量的复制.Swift的解决方法确实很简洁–限制被删除的对象突然复原的可能性.

后处理软件组件

有三个重要的后处理组件运行在后台,而不是作为数据路径的一部分.(???)

Replication

Replication是Swift的一个重要组件.它确保系统是一致的–环指定服务器和磁盘存储对象或数据库最近版本的副本.这个进程阻碍了故障,硬件迁移和环平衡(环改变数据将移动)的产生.这由比较本地数据和远程数据完成.如果远程拷贝需要升级,备份进程”PUSH”一个拷贝.比较进程是很有效率的,它执行的是简单的比较哈希表而不是对象的每一个字节(账户或容器数据库).Replication使用rsync来复制数据,它基于Linux远程文件同步程序.Replication替代了例如ssync和Swift中依然可用的原生备份系统.

Updaters

在某一情况下,账户或容器服务器由于沉重负载或难以利用而繁忙.这时,更新将排入存储服务器的本地存储队列中.有两个更新服务(updater)将处理排队的操作.对象更新服务将在容器数据库中更新对象,容器更新服务将在账户数据库中更新容器.这个情景将导致一个有趣的最终一致性行为,可用对象有可能不在容器的对象列表中.这些不一致性无实际影响(???).

Auditors

Auditors检查每个对象,容器和账户的数据完整性–MD5算法算出哈希值并与对象的Etag元数据键存储的哈希值比对(查阅之后的元数据章节).Etag元数据键在对象首次写时创建.如果没找到,则将对象转移到隔离目录,最后复制进程将创建原始副本.这就是系统自我修复.用户可以使用MD5的哈希值执行一些操作,例如比对本地数据库中的哈希值防止其错存在Swift上.

其他服务

其他后台服务如下:

  • 账户收割(Acount reaper): 这个服务用于删除在数据库中被标记的整个账户

  • 到期对象处理: Swift允许用户设置对象的保留策略为”在某时刻删除”或”在…之后删除”.这个服务确保到期对象的删除.

  • 驱动检查: 这个后台服务也很有用, 它搜寻故障的驱动并卸载它们.这比让auditor处理此类故障更有效率.

  • 容器间同步: 使用容器间同步进程能使任意容器内容都能被镜像到其他容器中,容器在不同集群间进行此操作需使用一个同步密匙.在支持多region之前,这是在多个region间制造多份数据副本的唯一方式.除了替代执行备份外,这个特性对于混合云(私有公有结合)或社区云(大量私有云)来说也是有用的.

  • 容器协调器(Container reconciler): 组合策略和最终一致性暂时导致了目前对象执行错误写策略的风险.这个服务更正了任何的此类错误写.

中间件选项

除了此前提及的核心数据路径组件,其他数据路径组件也可能被替代以扩充Swift的功能.中间件做到了,这得益于Swift的架构.下面是一个不完全的中间件模块列表.它们中大多数应用于代理服务器,也有一些模块例如日志和侦查模块同样很好的应用于其他服务器.

身份认证

身份认证是最重要的內联组件之一.所有的中间件都是分离出来的,用于扩展Swift功能.因此,身份认证系统是分离的项目而且有很多可以选择.Keystone身份认证原是OpenStack官方身份识别服务,能够与Swift结合,用户也可以创建自己的身份认证系统或使用其他的例如Swauth或者TempAuth.

身份认证工作如下:

  1. 用户传递证书到认证系统.这一步由执行一个HTTP REST API调用完成.

  2. 认证系统提供给用户一个AUTH令牌.

  3. 每个请求的AUTH令牌并不是唯一的,在一段时间后会过期(例如在TempAuth中,默认存活期是86,400秒)

每一个Swift请求必须伴随一个AUTH令牌.

  1. Swift是在认证系统中确认令牌并提供缓存机制,令牌到期时将刷新缓存.

  2. 认证系统中通常有管理员账户(租户)和非管理员账户(普通用户)之分.管理员账户的请求直接就能通过.

  3. 非管理员账户请求需核对访问控制列表(ACL).管理员可在ACL列表中设置每个非管理员的读写权限.

  4. 因此,对于非管理员用户的请求,在代理服务器递送之前需要核对访问控制列表.下图明示了Swift内部运作认证系统的步骤.

身份认证

其他模块

其他许多Swift及第三方的中间件是可用的,下面是一些例子:

  • 日志: 日志是一个非常重要的模块.用户也可以自定义日志处理程序.

  • 稳定性检查: 这个模块提供一个简单的方法监控代理服务器检查是否当机–简单的访问/healthcheck路径,访问成功这个模块将响应OK,表示正常,否则表示出现故障.

  • 域映射: 这个中间件允许用户将账户和容器名映射到主机域名上.这使域名更易读.

  • 别名查询(CNAME lookup): 使用这个软件,用户可以创建更友好易读的域名–直接指向账户或容器名.别名查询和域映射可以联合使用.

  • 速率控制: 速率控制被用来限制请求速率从而限制数据库账户和容器服务器写速率.

  • 容器配额和账户配额: 管理员可以用这两个中间件设置账户或容器的限额以字节为单位.

  • 批量删除:这个中间件允许批量操作例如多对象和多容器删除.

  • 批量归档自动提取(Bulk archive autoextraction): 使用这个软件执行一个简单的命令,就可在为多个制定文件创建一个档案文件,也可以从一个档案文件tarball(TAR,tar.gz,tar.bz2)中解压缩出文件.

  • 临时URL: 临时URL中间件允许用户创建一个URL提供对象的临时访问.这个访问没有身份认证,会在固定时间后过期.此外,这个访问只针对指定单个对象,但不能通过这个URL访问其他对象.

  • Swift源服务器(Swift origin server): 这个模块允许使用Swift作为一个源服务器搭建内容提交网络(CDN)

  • 静态页面: 这个软件将Swift转变为静态页面服务器.用户也可以提交CSS层叠样式表对页面外观进行控制.显然,外来请求不需要身份确认.

  • 表单提交: 使用表单提交中间件,可以通过HTML规范的post上传对象到Swift.这个组件将POST请求转变为相应的PUT请求,而且请求不需要身份验证,进而使集群中的使用者和非使用者协作.

  • 侦查: Recon是一个有用的管理软件.它监控集群并回馈各种有关数据.

  • 档案: 这个组件累积了所有的外来请求的记时统计.这对了解性能问题和转变意图有很大帮助.

附加特性

Swift还有一些上述没有涉及的特性,在下面的章节中将细细讲解.

大型对象支持

Swift对单个对象上传的大小进行限制(默认5GB),但允许存储和下载无限制大小的对象,使用的技术是分段–将一个对象分成等大的段(不包括最后一段)并上传.这样上传效率很高,因为这些分段相对都不算大,而且传输是并发执行的.当对象上传完毕,原大型对象的分段清单将上传.下载时Swift将整合各个段为一个单个的大型对象.

元数据

Swift允许自定义账户,容器和对象的附加元数据,并以自定义头部的方式创建和检索.元数据就是键值对集合(键对应名字).元数据在创建对象(使用PUT)或其后更新(使用POST)时产生.它可以使用HEAD方法独立的恢复对象.ETag元数据的例子,在Auditors部分中提到过,其本质是自定义标签,例如为一张医学影像添加病患姓名,医生姓名,X光日期等标签(元数据).

多范围支持(Multirange support)

HTTP规范允许多范围GET(multirange GET)操作,Swift通过从对象的多个区间取数据而不是从整个对象入手实现对多范围的支持.

CORS

跨域资源共享(CORS)是一个规范–允许浏览器中运行JavaScript以向其他域(domain)发出请求.Swift支持这个特性,所以在一个域中用JavaScript托管网站并在Swift集群的另一个域中请求对象是能实现的.Swift支持更宽泛的跨域策略,通过在不同域中与客户端技术如Flash,Java,Silverlight协作实现.

服务器端拷贝

Swift允许用户完全利用服务器端的拷贝操作实现对象在不同容器或账户间的复制.自此,完整拷贝操作在服务器端执行,客户端不参与.

集群稳定性

Swift差量报告(swift-dispersion-report)工具可以通过判断各种对象和容器副本是否在适当的位置来评估整个集群的稳定性.

总结

总的来说,Swift利用一组商品服务器创建了一个耐久的可扩展的并且易于管理的存储系统.在本章,我们回顾了Swift的架构和主要功能模块.下一章将展示如何使用多个服务器安装Swift.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值