本文主要介绍分布式对象存储架构。如果亲们对存储有需求,请随时联系筋斗云的客服,我们7x24小时提供技术协助等服务。筋斗云是阿里云战略级的合作伙伴,购买阿里云的产品可享受折上折。
在对象存储中,存储的不仅是数据,还有与丰富的数据相关的属性信息。系统会给每一个对象分配一个唯一的OID(Object ID)。对象本身是平等的,所有的OID都属于一个平坦的地址空间,而并非文件系统那样的树状逻辑结构。对象存储空间访问对象只通过一个唯一的OID标识即可,不需要复杂的路径结构,没有“路径”他“文件夹”的概念。对象存储架构有以下组成部分。
对象
对象是系统中数据存储的基本单位。一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合(如图1所示),这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等;而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。
对象存储设备(OSD,Object Storage Device)
OSD有自己的CPU、内存、网络和磁盘系统,和块设备的区别不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问,目前国际上通常采用标准化计算单元结构实现对象存储设备。OSD执行从对象到块的映射,这个动作允许本地实体以最佳方式决定怎样存储一个对象,OSD存储节点不仅具备存储功能,还包括智能化的高级能力。传统的存储驱动只是作为Target响应客户端的I/O请求,而对象存储设备是智能设备,它能同时执行Target和Initiator的功能,支持与其他对象存储设备的通信和协作,如数据分配、复制与恢复。
元数据服务器(MDS ,Metadata Server)
元数据服务器的工作就是管理文件系统的名称空间、控制客户端与OSD对象的交互,缓存和同步分布式元数据。虽然元数据和数据两者都存储在对象存储集群,但两者分别管理,支持可扩展性。
对象存储系统的客户端
为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client,通常提供POSIX文件系统接口,允许应用程序像执行标准的文件系统操作一样。
在客户端,用户使用文件系统是透明的,Linux通过内核虚拟文件系统交换(VFS)来进行底层的操作访问。终端用户访问大容量的存储系统,无需知道下面聚合成大容量存储池的元数据服务器、监视器、独立的对象存储设备。文件系统的智能化处理分布在节点上,这简化了客户端接口,可以支撑大规模动态扩展能力。
对象存储构筑在标准硬件存储基础设施之上,无需采用RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。
与通常的分布式文件系统一样,放入对象存储集群中的文件是条带化的,依据特定的数据分布式算法放入集群节点中。应用程序可以通过RESTful接口与各OSD节点其通信,将对象直接存储在集群中。
以OpenStack中的对象存储组件Swift为例。从Swift的架构与特性来看,除了极高的数据持久性,各个存储的节点完全对等,是对称的系统架构;扩容的时候只需简单的增加机器,扩展性很好;没有主从结构,不存在单节点故障,任意一个节点出现故障时,数据并不会丢失。如图2所示分别表示了上传文件PUT和下载文件GET请求的数据流,两个请求操作的是同一个对象。上传文件时,PUT请求通过负载均衡挑选一台Proxy Server,将请求转发到后者,后者通过查询本地的Ring文件,选择3个不同Zone中的后端来存储这个文件,再给用户返回文件写成功的消息。下载文件时,GET请求也通过负载均衡挑选一台Proxy Server,后者上的Ring文件能查询到这个文件存储在哪三个节点中,然后同时去向后端查询,Proxy Server从中选择一个节点下载文件。