Openstack swift 学习笔记

Swift 不是文件系统或者实时的数据存储系统,而是对象存储,用于长期存储永久类型的静态数据。这些数据能够检索、调整和必要时进行更新。Swift最适合虚拟机镜像、图片、邮件和存档备份这类数据的存储。node

Swift没有采用RAID,也没有中心单元和主控点,而是经过在软件层面采用一致性HASH和数据冗余性,牺牲必定程度的数据一致性达到高可用性和可收缩性。支持多用户模式、容器、和对象存储。最佳应用场景为非结构化数据存储问题。所谓的非结构化数据是相对于结构化数据而言的,节后数据即行数据,存储在数据库中,能够用二维表结构来逻辑实现的数据,而非结构化数据不方便用数据库二维逻辑表来表现,包括全部格式的办公文档、文本、图片、标准通用标记语言下的子集XML、HTML、各种报表、图像和音频/视频。算法

swift的主要技术特色:数据库

一、极高的数据持久性swift

二、彻底的对称系统架构:对称意味着Swift中的各节点能够彻底对等,能极大的下降成本api

三、无限的可扩展性:一方面是数据能够无限的扩,另外一方面Swift的性能能够线性提高(暂时没有体会到,能够再后续的阅读了解中体会,主要看它的架构设计)缓存

四、无单点故障:Swift的元数据存储时彻底均匀随机分布的,而且与对象文件存储同样,元数据也会存储多份。服务器

swift与HDFS的技术差别架构

一、在Swift中,元数据呈分布式,跨集群复制,而在HDFS中,采用中央系统(Namenode)来维护元数据,这对于HDFS来讲,无疑使单点故障点,于是扩展到规模很是大的环境很困难并发

二、Swift设计时考虑到多租户架构,而HDFS没有考虑这个概念(下午学习什么是多租户架构)异步

三、在Swift中,文件能够写入屡次,在并发场景下,以最近一次的的操做为标准。而在HDFS中,文件写入一次,并且每次只能有一个文件写入

四、Swift可以可靠地存储数量很是多的大小不一的文件,而HDFS用于存储数量中等的大文件,来支持数据处理。

注:存储系统元数据的缺点:元数据是指记录数据逻辑与物理位置的映像关系。对于元数据的管理通常分为两种,一种是使用集中式元数据服务来维护元数据,如HDFS,这种维护方式会致使单点故障和性能瓶颈,另一种是使用分布式元数据服务来维护元数据,如OpenStack的Swift,这种维护方式存在性能负载和元数据同步一致性问题,如Swift就是经过系统必定程度的数据一致性来达到高可用性和可伸缩性的。

Swift的原理:

一、一致性Hash

一致性Hash算法提出了在动态变化的Cache环境中,断定hash算法好的标准:

一、平衡性:平衡性是指哈希的结果可以尽量的分布到全部的缓冲中去,这样可使得全部缓冲空间可以都获得利用。为了更好的知足平衡性,引入了虚拟节点概念,虚拟节点是实际节点在hash空间的复制品,一个实际节点对应若干个虚拟节点,这个对应的个数也称为复制个数,虚拟节点在hash空间以hash值排列。

二、单调性:单调性是指若是已经有些内容经过Hash分派到相应的缓冲中,又有新的缓冲加入到系统中,哈希的结果应可以保证原有已分配的内容能够被映射到原有或者新的缓冲中区,而不会被映射到旧的或者其余缓冲区。

三、分散性:在分布式环境中,客户端可能看不到全部的缓冲,而只能看到其中一部分。当终端但愿经过哈希过程将内容映射到缓冲上时,因为不一样的客户端所看到的缓冲范围可能不一样,从而致使获得的Hash结果不一致,致使结果相同的内容被映射到不用的缓冲区中。这种状况应该被避免,由于这将会致使相同的内容将会被映射到不一样缓冲区中,下降了系统的存储效率。

四、负载:负载时对分散性要求的另外一个维度。既然相同的内容可能被映射到不一样的缓冲中去,那么对于同一个缓冲而言,就有可能被不一样的用户映射不一样的内容。与分散性同样,这种状况应该被避免。

swift使用一致性Hash的主要目的是在改变集群的节点数时,能尽量少的减小key和node的映射关系,以知足单调性。

因为在node较少的状况下,改变node会致使大量的数据迁移,所以使用虚拟节点。

Swift中存在两种映射关系:对于一个文件,经过hash算法找到对应的虚拟节点,虚拟节点再经过映射关系找到对应的设备,这样就文在在设备上的存储。(关于虚拟节点和节点的个数设置后续再学习)

数据一致性模型

根据CAP理论,一致性、可用性、分区容忍性三个方面只能知足两方面,Swift放弃了一个一致性,而采用一致性模型,以达到高可用性和水平扩展能力。

为了控制一致性,Swift采用了NWR策略(Quorum协议),NWR是一种在分布式存储系统中控制一致性级别的策略,其中N表明一份数据的Replica数,

W是更新一份数据对象确保成功更新成功的份数,R表明读取一个数据须要读取的Replicad的份数。公式W+R>N保证某个数据不被两个不一样的事物同时读和写,公式W>N/2,保证两个事物不能并发写同一份数据。在分布式系统中,一般把备份数目设置为3份,若是是1,则是很是危险的,一旦这个Replica失败了,则数据就损坏了,若是N为二,那么只要一个存储节点发生错误,就会有单点存在。若是副本数设置太高高,则系统的维护成本就会变高。

补充:对于NWR,强一致性:R+W>N,以保证对副本的读写操做能够产生交集,从而保证能够读到最新版本;若是W=N,R=1,则须要所有更新,适合大量读少许写操做的场景下的强一致性。若是R=N,W=1,则只更新一个副本,经过读取所有分布来获得最新版本,适合少许读大量写的的强一致性。

环是Swift中的重要组件,用于记录存储对象和物理位置间的映射关系,在查询Account、Container、Object信息时就须要查询集群的Ring信息。

ring是为了将虚拟节点(partition)均衡的映射到一组物理存储设备上,并提供必定的冗余度而设计的

Swift为帐户、容器和对象分别定义了环,其查找过程是相同的。Ring中每一个分区的在集群中都默认有3个副本,每一个分区的位置都有ring来维护,并存储在映射中。

Ring使用zone来保证数据的物理隔离,每一个分区的副本数确保放在不一样的zone中。

总的来讲,Ring引入一致性Hash的缘由是为了减小因为增长节点致使数据项移动的数量来提升单调性,引入partition的缘由是为了减小因为节点数过少而致使移动过多的数据项,引入副本为了防止数据单点,提升冗余性,引入zone的缘由是为了保证分区容忍性,引入权重是为了保证分区的分配的平衡性。

swift架构设计

Swift部署架构

主要组件:

一、Proxy Server

Proxy Server是提供swift api的服务器进程,swift经过Proxy Server 向外提供基于HTTP和RESET的服务接口,负责swift其他组件的相互通讯。对于每一个客户端的请求,它将在环中查询Account、Container或者Object的位置,并相应的转发 请求。因为采用无状态的REST请求协议,能够进行横向扩展来均衡负载。在访问swift以前,要先经过认证服务获取访问令牌,而后在发送的请求中加入头部信息 X-Auth-Token。

二、Storage Server

Storage Server提供累了磁盘设备上的存储服务。在Swift中有三类存储服务器帐户服务器(Account Server)、容器服务器(Container Server)、对象服务器(Object Server)。

2.1 Account Server

帐户服务提供帐户元数据和统计信息,并维护所含容器列表的服务,每一个帐户的信息被存储在一个SQLite数据库中

2.2  Container Server

容器服务器提供容器元数据和统计信息,并维护所包含对象列表的服务。容器并不知道对象存在位置,只知道容器里存的那些对象。这些对象信息以SQLLite数据库文件的形式存储,和对象同样在集群上作相似的备份。

2.3 Object Server

对象服务器提供元数据和内容服务,用于存储、检索和删除本地设备上的对象。在文件系统中,对象以二进制的文件的形式存储,它的元数据存储在文件系统的扩展属性中,建议采用默认支持扩展属性饿XFS文件系统。每一个对象使用对象名称的哈希值和操做的时间戳组成的路劲来存储。最后一次的写操做总能够成功,并确保最新一次的对象版本将会被处理。

三、Consistency Server

在磁盘上存储数据并向外提供Rest-ful API 最主要的问题是故障处理。Swift的Consistency Server的目的是查找并解决由数据损坏和硬件故障引发的错误。主要由3个server组成,Auditor、Updater、和Replicator。Auditor运行在每一个Swift服务器的后台持续的扫描磁盘来检测对象、容器和帐号的完整性,若是发现数据损坏,Auditor将会将该文件移动到隔离区域,而后由Replicator负责将一个无缺的副原本替代该数据。在系统高负载或者发生故障的状况下,容器或帐号中的数据不会被当即更新。若是更新失败,该次更新在本地文件系统中被加入队列,而后Updater会继续处理这些失败了的更新操做。

3.1 审计服务(Auditor)

在本地服务器上反复的检查对象、帐户和容器的完整性,若是法相比特级的错误,文件将会被隔离,而后由Replicator负责用一个无缺的拷贝来替代该数据,其余类型的错误会被记录到日志中

3.2 复制服务(Replicator)

该服务一方面用于检测本地分区副本和远程副本是否一致,具体方式是用对比哈希文件盒高级文件水影来完成,当发现不一致时采用push的方式更新远程副本:对于对象的复制,更新只是使用rsync同步文件到对等节点。帐号和容器的复制经过HTTP或Rsync来推送整个数据库文件上丢失的记录,另外一方面用于确保被标记删除的对象从文件系统中移除:当有一项被删除,则一个墓碑文件被设置为该项的最新版本,复制器或检测到该墓碑文件确保将他从整个系统中移除。

3.3  更新服务(Updater)

当对象因为高负载或者系统故障等缘由而没法当即更新时,任务将会被序列化到本地文件系统中进行排队,以便回复后进行异步更新。

四、Cache Server

缓存的内容包括对象服务令牌,帐户和容器的存在信息,但不会缓存对象自己的数据。