1、Proxy Server
Proxy server 是负责将Swift架构其余的部分整合起来。对于每个客户端的请求,它将在Ring中查询Account、Container或Object的位置,并且相应地路由请求。
Proxy提供了Rest-full API,并且符合标准的HTTP协议规范,这使得开发者可以快捷构建定制的Client与Swift交互。
2、Storage Server
Storage Server提供了磁盘设备上的存储服务。在Swift中有三类存储服务:Account、Container和Object。
1)、Object Server
Object Server 是一个非常简单的二进制对象存储服务器,可以用来存储、检索和删除存储在本地设备上的对象。对象以二进制文件的形式存储在文件系统上,元数据存储在文件的扩展属性中(xattrs)。这需要对象服务器的基本文件系统的选择支持xattrs。
2)、Container Server
Container Server最重要的工作就是处理对象列表。它不知道对象存储在哪里,只是知道什么对象在一个特殊的容器中。这个列表以sqlite数据库文件的形式存储,和对象一样在集群中进行类似的备份。跟踪统计包括对象的总数,容器的存储使用的情况。
3)、Account Server
Account Server 跟 Container Server非常的相似,只是它负责容器的列表,而不是对象。
三、重要概念 1、Ring
Ring是Swift重要的组件,一个ring代表云存储中的实体(Account、Container、Object)到物理位置的映射。Account、Container、Object都有各自分离的ring。当其他的组件需要对Account、Container、Object执行某些操作时,它们都需要和对应的ring交互来确定这些实体在集群中的位置。
Ring使用Zone、Device、Partition和Replica来维护这些映射信息。Ring中每个Partition在集群中都(默认)有3个Replica。每个Partition的位置由Ring来维护,并存储在映射中。
Ring文件在系统初始化时创建,之后每次增减存储节点时,需要重新平衡一下Ring文件中的项目,以保证增减节点时,系统因此而发生迁移的文件数量最少。 2、Zone
如果所有的Node都在一个机架或一个机房中,那么一旦发生断电、网络故障等,都将造成用户无法访问。因此需要一种机制对机器的物理位置进行隔离,以满足分区容忍性(CAP理论中的P)。因此,Ring中引入了Zone的概念,把集群的Node分配到每个Zone中。其中同一个Partition的Replica不能同时放在同一个Node上或同一个Zone内。注意,Zone的大小可以根据业务需求和硬件条件自定义,可以是一块磁盘、一台存储服务器,也可以是一个机架甚至一个IDC。
zone : a group of nodes that is as isolated as possible from other nodes (separate servers, network, power, even geography).The ring guarantees that every replica is stored in a separate zone.
3、Replica
如果集群中的数据在本地节点上只有一份,一旦发生故障就可能会造成数据的永久性丢失。因此,需要有冗余的副本来保证数据安全。Swift中引入了Replica的概念,其默认值为3,理论依据主要来源于NWR策略(也叫Quorum协议)。
NWR是一种在分布式存储系统中用于控制一致性级别的策略。在Amazon的Dynamo云存储系统中,使用了NWR来控制一致性。其中,N代表同一份数据的Replica的份数,W是更新一个数据对象时需要确保成功更新的份数;R代表读取一个数据需要读取的Replica的份数。 公式W+R>N,保证某个数据不被两个不同的事务同时读和写;公式W>N/2保证两个事务不能并发写某一个数据。 在分布式系统中,数据的单点是不允许存在的。即线上正常存在的Replica数量为1的情况是非常危险的,因为一旦这个Replica再次出错,就可能发生数据的永久性错误。假如我们把N设置成为2,那么只要有一个存储节点发生损坏,就会有单点的存在,所以N必须大于2。N越高,系统的维护成本和整体成本就越高。工业界通常把N设置为3。例如,对于MySQL主从结构,其NWR数值分别是N= 2, W = 1, R = 1,没有满足NWR策略。而Swift的N=3, W=2, R=2,完全符合NWR策略,因此Swift系统是可靠的,没有单点故障。