Openstack持久存储之Swift
OpenStack中的持久存储可分为三类:对象存储(object storage)、文件共享存储(file share storage)和块存储(block storage),对应的项目分别是Swift、Manila和Cinder。
一句话说清楚对象存储就是:对象存储不是NAS/SNA,对象存储允许用户使用RESTful HTTP API以对象形式存储数据并且对象存储可以无限扩展,可以更好地处理节点故障而不丢失数据,无法通过文件协议(如BFS块文件系统、SMB块文件系统或CIFS公共 Internet 文件系统)直接访问对象存储。对象存储通常用于归档和备份数据,例如虚拟机镜像、照片、视频和音乐。
一、Swift架构
Swift是一种创新的存储系统,它通过独特的架构实现无缝扩展和高度容错,确保数据持续可用,而不模仿传统存储接口,专注于高效、可靠的数据管理。Swift架构是分布式的,可以防止任何单点故障(Single Point Of Failure,SPOF),它还被设计为能够水平缩放。
Swift包括以下组件:Swift代理服务,账户服务,容器服务,对象服务
解释 元数据: 元数据提供对象的描述性信息,它被存储为键值对(时间-存储信息)。
二、Swift在实际存储上的规划(目的:为了隔离故障)
Swift层次结构图
三、Swift如何实际将数据存储在磁盘上?
Swift对象存储系统通过一致性哈希算法和Ring机制将数据分区并映射到多个节点的磁盘上,每个对象以独立文件形式存储,同时维护多个副本以确保高可用性和数据冗余。在较高的层次上看,Swift就像一个巨大的哈希数据结构,其中所有可用空间都被分成槽,然后使用哈希函数来将数据映射为槽位。
四、Swift如何实现存储策略?
在Swift对象存储系统中,为了确保数据的高可用性,传统的做法是通过维护多个副本并将它们分散到不同的区域、区(Zone)、节点和磁盘上来实现冗余。这种策略虽然非常有效,但它确实带来了较高的存储成本——当每个对象都使用默认的三副本时,实际可用的存储量仅为总容量的大约三分之一,对于至关重要的数据,组织或许愿意承担这样的成本以换取更高的可靠性和冗余度。然而,这种方法对那些希望利用昂贵的Swift对象存储系统来满足其数据可用性和性能需求的应用来说是一个挑战。因此,Swift引入了存储策略的概念,旨在通过差异化复制策略来解决冗余性和成本之间的矛盾。
除了传统的多副本机制外,纠删码(Erasure Coding, EC)作为另一种冗余性策略,在Kilo版本发布后被OpenStack Swift所采用。纠删码通过奇偶校验信息来重建丢失的数据片段,从而提供了一种创新的方法来平衡性能与成本。具体而言,当用户上传文件至配置了纠删码的对象存储时,Swift代理会将数据分割成若干段(segments),然后调用PyECLib库将这些数据段编码为纠删码片段(fragments)。随后,这些编码后的片段会被流式传输到各个存储节点上进行保存。
纠删码的原理可以类比于RAID技术中的RAID 5,其中数据被划分为条带,并生成奇偶校验条带来从磁盘故障中恢复数据。相比之下,默认的Swift复制策略类似于RAID 1或镜像(mirroring),即数据在不同磁盘之间直接复制。而采用纠删码的方式只需要大约40%左右的数据大小的额外空间,这远低于基于复制方案所需的存储开销。
为了支持纠删码功能,Swift依赖于一个名为PyECLib的后端库,它为多种纠删码算法提供了Python接口,并且具有良好的扩展性,允许以插件形式集成自定义的纠删码实现。
五、对象存储和raid存储之间的关系
尽管Swift本身并不依赖于RAID技术,但在实际应用中,两者常常结合使用以满足不同的性能和可靠性要求。例如,在媒体行业中,一家公司可能会选择将原始素材(如视频、音频和图片)存储在对象存储平台上,因为这类数据通常是非结构化的且体积较大;而对于需要频繁读写的编辑过程,则更适合采用RAID存储系统,因为它能提供更高的I/O速度和更低的延迟。最终成品可以再次归档回对象存储中长期保存,形成一个完整的生命周期管理流程。
原文地址:https://blog.csdn.net/weixin_45631123/article/details/145061029
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!