块存储和对象存储和文件存储

2022/10/06 OperationSystem 共 2780 字,约 8 分钟

块存储和对象存储和文件存储

参考

块存储

它是什么?

块存储通常意义上,可以理解为一个不带文件系统的裸磁盘,是将裸磁盘空间映射给主机使用的。比如我们日常使用的硬盘、U盘,这是最常见的形式。当然不仅仅可以直接使用物理设备,也通过虚拟化间接使用物理设备(比如VMware、VirtualBox可以创建虚拟磁盘)。

怎么用它?

我在这里举一个实际例子,假设我们拥有3块1T的硬盘,我们可以直接将裸设备给操作系统使用;也可以通过raid、逻辑卷等方式将其映射为一个或多个逻辑盘提供给系统使用。注意前面提到块存储是不带文件系统的,我们是使用客户端的文件系统接口来访问的块存储里的数据。所以客户端的文件系统或操作系统是无法区分映射上来的磁盘是真正的物理磁盘还是逻辑磁盘,操作系统就只是对其进行正常分区、格式化、访问等操作。

为啥选它?

所以块存储并不是直接提供给用户(或者说自然人)使用,而是提供给专门的文件系统以及专业的备份管理软件、分区软件以及数据库使用的。针对这些特定软件而言,通过块存储直接访问存储设备,会比通过文件系统访问数据效率高。但同时,块存储并没有支持共享协议,所以无法进行共享操作,只能独占。

文件存储

它是什么?

通常意义上,文件存储就是提供文件系统的存储。这里通常意义上是指支持了Posix接口,并且是文件目录管理结构的存储系统。但是现在也把GFS、HDFS这种非标准Posix接口的文件存储系统算为文件存储。

怎么用它?

由于自带文件系统,用户可以轻松的访问存储资源。文件系统中最基本的体现形式是目录和文件,数据以文件的方式存储和访问,按照目录结构进行组织和管理。同时与偏向底层的块存储不同,文件存储上升到了应用层,可以提供更加高级的管理服务,可以很方便的共享。常见的NFS、CIFS、FTP等这些都是基于文件存储的基础上提供的文件共享协议。

为啥选它?

文件系统是非常简单易用的。不论是普通用户要查找读写文件,或者绝大部分应用软件需要存取数据文件通过文件系统操作都是非常方便的。同时文件系统对共享传输的支持也非常好。但是文件存储需要管理维护其庞大复杂的文件目录树,对于一个深层文件的访问需要逐层目录访问才能最终进行操作。所以在处理极其海量数据时,性能会有一定影响。

对象存储

它是什么?

从本质上来说,大家可以把对象存储理解成为一个简单的键值访问的存储。所有被存储的文件都可以理解成为一个独立的对象,整体是一种扁平化的结构。

怎么用它?

通常对象存储会提供一套易用的HTTP协议的API,供大多数客户端访问(不受客户端语言的限制)。对象存储会提供全局唯一的UUID来代表某一个对象文件(比如一个固定的网址https://**..com///**/xxx.jpg),用户可以直接对这个地址进行GET、PUT、DELETE等操作来管理这个文件。

为啥选它?

由于对象存储是类似于键值管理的方式,所以利于客户端直接定位并操作数据,非常简单易用。同时对象存储天然适合网络存储的场景,所以非常便于在网络上共享和传输。而且因为不像文件系统拥有目录结构,不用目录检索以及维护目录结构,在海量文件场景访问时性能和效率表现会更加优秀。

特点

参考

对象存储其实介于块存储和文件存储之间。文件存储的树状结构以及路径访问方式虽然方便人类理解、记忆和访问,但计算机需要把路径进行分解,然后逐级向下查找,最后才能查找到需要的文件,对于应用程序来说既没必要,也很浪费性能。

而块存储是排它的,服务器上的某个逻辑块被一台客户端挂载后,其它客户端就无法访问上面的数据了。而且挂载了块存储的客户端上的一个程序要访问里面的数据,不算类似数据库直接访问裸设备这种方式外,通常也需要对其进行分区、安装文件系统后才能使用。除了在网络上传输的数据包效率更高以外,并不比使用文件存储好多少,客户端的文件系统依然需要对路径分解,然后逐级查找才能定位到某一个具体的文件。

是否可以用不排它但又类似块设备访问的方式呢?理论上是可以的,但对块设备的访问方式虽然比文件存储快,其实也很麻烦——一个文件往往是由多个块组成,并且很可能是不连续的。例如要读取一个文件,可能需要发出这样的指令:

  • 读取从编号A₁开始的N₁个块;
  • 读取从编号A₂开始的N₂个块;
  • 读取从编号A₃开始的N₃个块;
  • …………
  • 读取从编号Ai开始的Ni个块。

最后自行把这i个连续的块自行拼接成一个文件,这才完成了一个文件的读取操作。为了发出这些指令,访问文件的软件系统需要记录下这个文件分成多少个部分,每个部分的起始块编号是多少,有多少块,顺序如何。不单是读取操作,删除、写入、修改操作也是如此,非常麻烦复杂。而且往往一个文件可能需要被多个系统访问使用,这就更麻烦了。

为了解决这中麻烦,使用一个统一的底层存储系统,管理这些文件和底层介质的组织结构,然后给每个文件一个唯一的标识,其它系统需要访问某个文件,直接提供文件的标识就可以了。存储系统可以用更高效的数据组织方式来管理这些标识以及其对应的存储介质上的块。

总结

简单来说,块存储直接与硬盘打交道,读写效率最高,但是不利于共享。文件存储访问简单,利于共享,但是海量数据场景下访问性能可能存在瓶颈。对象存储既天然支持网络共享,同时也适用于海量数据的场景。当然现如今,随着文件存储和对象存储的发展,涌现了越来越多的分布式文件或对象存储,在海量数据、高并发、性能上做的越来越好。块存储、文件存储和对象存储都存在各自不同的适用场景,并不存在绝对意义上的优劣之差。

总结

这三者的本质差别是使用数据的“用户”不同:块存储的用户是可以读写块设备的软件系统,例如传统的文件系统、数据库;文件存储的用户是自然人;对象存储的用户则是一些其他软件。

访问协议也不同

先说一下文件存储,主要操作对象是文件和文件夹。以 NFS 为例,文件相关的接口包括:LOOKUP/ACCESS/READ/WRITE/CREATE/REMOVE/RENAME 等等,文件夹相关的接口包括:MKDIR/RMDIR/READDIR 等等。同时也会有 FSSTAT/FSINFO 等接口用于提供文件系统级别的信息。POSIX,SAMBA 等也是文件存储协议。协议更注重接口的灵活,以及访问权限控制。

块存储,主要操作对象是磁盘。以 SCSI 为例,主要接口有 Read/Write/Read Capacity/Inquiry 等等。FC,iSCSI,也是块存储协议。和文件存储相比,没有文件和目录树的概念,一般协议也不会定义磁盘的创建和删除操作。协议更注重传输控制。

对象存储,主要操作对象是对象(Object)。以 S3 为例,主要接口有 PUT/GET/DELETE 等。和文件和对象存储相比,没有随机读写的接口。和文件存储相比,没有目录树的概念。协议更注重简洁。

因此对象存储适合一些比如TOS, AWS S3这样的,如果要改只能重新上传。

Search

    Table of Contents