OpenStack Swift架构简述

原创
2012/07/30 15:44
阅读数 1.4K

关于这片文章

完全翻译的官方文档,英语水平有限,但是翻译下来对我了解Swift很有帮助。

Swift 架构概述

Proxy Server(代理服务器)

Proxy server 是负责将Swift架构其余的部分整合起来。对于每一个请求,它将会查阅位于ring上的
account,container,或者object然后相应的路由这个请求。公共的API也暴露通过Proxy Server.

大量的失败处理也会在Proxy Server进行。例如,如果一个服务器不可用对于一个对象的PUT请求,它将会请求
ring做一个服务器的切换,然后进行转发请求。

对象以流的形式到达(来自) 对象服务器,它们直接从代理服务器传送到(来自)用户—代理服务器并不缓冲它们。

The Ring

ring 代表着一种映射 在磁盘上存储的实体的名字和他们的物理位置。有单独的rings对于accounts,containers,和objects.
当其他的组建需要去执行一些操作在object,container,或者account,它们需要查询相应的ring来确定它们在集群的位置.

Ring 维护这个映射,使用域,设备,虚节点(partitions),和副本。每一个虚节点在ring上是可以被复制的,默认的下,在集群中有三次
对于一个虚节点的位置,被存储在映射所维护的ring中。ring同时负责决定哪一个设备被用于传送在失败的场景下。

ring使用区域的概念来隔离数据。每一个虚节点的副本用来保证属于一个不同的区域。一个区域可以使一个磁盘,一个服务器,一个机架
一台交换机,甚至是一个数据中心。

当安装Swift时,虚节点会被均匀的划分到所有的设备中。当虚节点需要被移动(例如如何一个设备被添加到集群中),ring确保一次移动最小的数量的
虚节点,一次只移动一个虚节点的一个副本。

权重 被用来平衡集群中的虚节点在驱动器上的分配。例如,当不同大小的驱动器被用于集群中就显得非常的有用。

ring 被Proxy server和一些后台的进程所使用(例如 replication).

Object Server

Object Server 是一个非常简单的二进制大对象存储服务器 可以用来存储,检索和删除存储在本地设备上的对象。对象以二进制文件的形式存储在文件系统上,元数据存储
在文件的扩展属性中(xattrs),这需要对象服务器的基本文件系统的选择支持xattrs,一些文件系统,例如 ext3
默认xattrs是关闭的。

每个对象使用对象的名称的哈希值和和操作的时间戳组成的路径来存储。最后一次的写操作总是会成功,
确保最后对象的版本会被处理。一个删除的操作也会被认为是文件的一个版本(一个0字节以.ts结尾,.ts代表墓碑),这确保了被删除的文件
被正确复制,旧版本不会因为由于失败的场景而神奇的出现。

Container Server

Container Server最重要的工作就是处理对象列表.它不知道对象存储在哪里,只是知道什么对象在一个特殊的容器中。这个列表以sqlite数据库文件的形式存储,
和对象一样在集群中进行类似的备份。跟踪统计包括对象的总数,容器的存储使用的情况。

Account Server

Account Server 跟 Container Server非常的相似,只是它负责容器的列表,而不是对象。

Replication(复制器)

Replication 被设计用来面对临时的网络停机或者驱动失败时,保持系统的一致性。

replication进程比较本地的数据和每一个远端拷贝来确保它们全都包含最新的版本。对象复制使用一个哈希表来快速比较每一个虚节点的字段,
容器和账户的复制使用哈希和共享的高水位标记相结合来比较。

Replication 的更新是基于推送,对于对象复制,更新只是rsync文件对等的问题,账户和容器复制推送丢失的记录通过HTTP或者rsync整个数据库文件。

复制器也确保数据从系统中移除,当一条项目(对象,容器,或者账户)被删除,一个墓碑被设置作为这条项目的最后版本。复制器将会看到整个墓碑确保这条项目从整个系统中移除。

Updaters(更新器)

有时当容器或者账户数据不能被立即更新时,通常发生在故障的情况下或者高负载的时期。如果一次更新失败,、
这次更新将会会被加入到队列在本地文件系统,然后更新器会执行失败的更新,一个最终一致性窗口将最有可能启用,
例如,假设一个容器服务器处于负荷之下,一个新的对象加入到系统中,这个对象将马上可用于读,当代理服务器成功响应了客户端的请求。
然而,容器服务器不更新对象列表,因此这次更新将进入队列等待之后更新。容器列表,因此可能不会立即包含这个对象。

实践中,一致性的窗口的大小和更新器运行的频率一样,或许不会被发现 当代理服务器路由列表请求到第一个响应的内容服务器。
服务器在负荷之下应该去执行后来的请求列表。其他的两个副本应该处理。

Auditors(设计器)

审计器 反复的在本地服务器上检查对象,容器和账户的完整性,如果不完整被发现(例如发生了bit rot,),
这个文件将会被隔离,复制会从其他的副本那里取代这个损坏的文件,如何其他的错误被发现将会被记录到日志中(例如,一个对象列表不能再如何一个内容服务器上找到)。


 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部