OpenStack对象存储Swift

一、Swift介绍

1.1.Swift是什么?

Swift无需采用RAID(磁盘冗余阵列),也没有中心单元或主控结点。Swift通过在软件层面引入一致性哈希技术和数据冗余性技术,牺牲一定程度的数据一致性来达到高可用性 HA 和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。

(1)高可用,分布式对象存储服务。

(2)最终一致性模型。

(3)适合解决互联网应用场景下非结构化数据存储的问题(对象存储),

(4)构筑在比较便宜的标准硬件存储基础设施之上(构建在X86架构的硬件之上)

1.2.结构化的数据与非结构化数据

(1)结构化存储数据指的是按照明确定义的数据模型和格式组织的数据,通常以表格形式呈现,例如关系型数据库中的表格。这种数据类型具有明确的数据模式和固定的字段,使得数据容易被组织、存储和查询。比如,常见的结构化数据包括日期、数字、文本和各种标识符。

(2)非结构化存储数据则是指没有明确的数据模型或格式,不容易以表格形式呈现或整理的数据。这种数据可能包含各种格式的文件,如文本文档、音频文件、视频、图像、电子邮件等。

1.3.Switf存储的特点:

(1)基于REST API,友好的访问方式。

(2)数据在系统中均匀分布,高可靠性,资源高效利用,易于扩展。。

(3)硬件无关,支持多种标准硬件,无需定制专门的硬件设备。

(4)没有中央数据库,没有单点性能瓶颈或单点失败的隐患。

(5)Account/Container/Object三级存储结构均无需文件系统且均有N(3)份拷贝,数据高可靠性。

1.4.为什么说swift是没有中央数据库?

在传统的关系型数据库中,通常会存在中央数据库,即所有数据都存储在一个集中的数据库服务器上,并由该服务器负责管理和处理所有的数据操作请求。或者采用多区域的数据库存储,由中央数据库存储数据的元信息,也就是数据实际存储的位置,但这种方式也存在中心化,依托于中央数据库,而Swift 存储方式中元数据也是ring,accout\container\object。本身也是分布式的。

二、Swift原理与架构

2.1.一致性哈希

(1)通过计算可将对象均匀分布到虚拟空间的虚拟节点上。

(2)在增加或删除节点时可大大减少需移动的数据量。

(3)在实际部署的时候需要经过仔细计算得到合适的虚拟节点数,以达到存储空间和工作条载之

间的平衡.

一致性哈希在swift中的应用:当我们进行对象存储的时候,会将Account/container/object/作为key值,进行hash存储到不同的节点当中,实现分布式存储的目的。如果按顺序存储key值的话,会造成IO有热点区域,整个存储池只能发挥某个硬盘的I0性能。与此同时,hash过于庞大,导致CPU寻址时间过长,右移M位,M默认=3,相当平均分8份,即使用8个节点可帮助我们减少寻址次数,性能提升。

2.2.数据一致性模型

N:数据的副本总数         W:写操作被确认接受的副本数量        R:读操作的 副本数量。

(1)强一致性:R + W > N,以保证对副本的读写操作会产生交集,保证可以读到最新的版本。

(2)弱一致性:R + W <= N,如果读写操作的副本集合不产生交集,就可能会读到脏数据;适合对一致性要求比较低的场景。

Swift 默认配置是N=3,W=2,R=1或2,即每个对象会存在3个副本,这些副本会尽量被存储在不同区域的节点上; W=2表示至少需要更新2个副本才算写成功;当R=1时意味着某一个读操作成功便立刻返回, 此种情况下可能会读取到旧版本(弱一致性模型);当R=2时,需要通过在读操作请求头中增加x-newest=true参数来同时读取2个副本的元数据信息,然后比较时间戳来确定哪个是最新版本(强一致性模型)。

2.3.Ring环

(1)Container Ring(容器环):Container Ring用于管理Swift存储系统中的容器Containers。容器是Swift中组织和管理对象(Objects)的逻辑集合单位,类似于文件夹。每个容器都有一个唯一的ID,Container Ring记录了每个容器在Swift存储集群中的位置信息,例如容器存储在哪些设备上以及副本的数量等。当客户端需要访问容器中的对象时,Swift根据Container Ring的信息定位到对应的存储设备,并返回相关的数据。

(2)Account Ring(账户环):Account Ring则负责管理Swift存储系统中的账户Accounts,账户是Swift用于组织和管理容器的逻辑集合单位,类似于租户。每个账户也有一个唯一的ID,Account Ring记录了每个账户在Swift存储集群中的位置信息,包括账户存储在哪些设备上以及副本的数量等。通过Account Ring,Swift可以根据账户ID快速找到对应的存储设备,进行相关的操作。

(3)对象环记录了每个对象在Swift存储集群中的位置信息,包括对象存储在哪些设备上以及副本的数量等。当客户端需要访问特定的对象时,Swift会根据对象环的信息定位到对应的存储设备,并返回所需的数据。

当用户想要查一份数据的时候,需要在帐户中寻找容器、在容器中寻找对象、寻找对象在硬盘对应的数据块。虚拟节点与设备的映射,注意同一分区的不同副本不能存放于同一区域。

2.4.Swift API

Swift通过Proxy Server向外提供基于HITP的 REST 服务接口,对账户、容器和对象进行CRUD等操作。

三、Swift 的架构

Swift将整个存储分为三个层次:Account、Container 和Object。这里的Account本身只是一个存储区域,并不代表认证系统里的“账号”,但是通常会让每个Account对应一个租户。这就是为什么我们作为一个OpenStack用户在使用Swift时,只能看到Container和Object,而看不到Account的原因,如果这个用户切换到另一个租户下,他将看到属于另一个租户也是另一个Account下的Container和Object。

猜你喜欢

转载自blog.csdn.net/m0_73901077/article/details/134804777
今日推荐