2020-03-24 19:11:40

1、块存储

- 典型设备: 磁盘阵列,硬盘

- 主要是将裸磁盘空间映射给主机使用的。

- 使用场景:

  • - docker容器、虚拟机远程挂载磁盘存储分配。

  • - 日志存储。

  • - 文件存储。

  • - ...

2、文件存储

- 典型设备: FTP、NFS服务器为了克服块存储文件无法共享的问题,所以有了文件存储。在服务器上架 设FTP与NFS服务,就是文件存储。

- 使用场景:

  • - 日志存储。

  • - 多个用户有目录结构的文件存储共享。

  • - ...

文件存储通常需要一个app 的服务器将文件存储挂载到本地。

3、对象存储

- 典型设备: 内置大容量硬盘的分布式服务器(swift, s3),多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。

- 使用场景: (适合更新变动较少的数据,没有目录结构, 不能直接打开/修改文件)

  • - 图片存储。

  • - 视频存储。

  • - 文件

  • - 软件安装包

  • - ...

对象存储实际上更贴近http的应用。

区别说明:

    通常我们说存储分为块、文件和对象,从应用场景来看:

    对象存储近年来在国内市场逐渐火热起来,主要是特定行业的海量非结构化数据的应用场景。由于对象存储采用扁平的文件组织方式,所以在文件量上升至千万、亿级别,容量在PB级别的时候,这种文件组织方式下的性能优势就显现出来了,文件不在有目录树深度的问题,历史和近线数据有同样的访问效率。另外,对象存储多采用分布式架构,可以在商用x86服务器上轻松构建对象存储,磁盘介质也大多采用低速的SATA盘,所以在成本上也具优势。

    块存储主要用于结构化数据类应用,在相对小的容量空间上可以提供更高的IO性能,所以从后端存储产品形态上来看,一般是多控多活的紧耦合集中式SAN架构,存储介质大多采用高速的SAS和近年来已成主流的固态硬盘,前端多采用FC光纤协议组网。另外,存储双活、存储虚拟化、存储复制等技术也支撑着这块的生态。

    文件存储主要是集中式或分布式的NAS类应用,以灵活的共享文件系统为特色,承载百万文件量和TB级别的文件类应用。

    我的总结:说白了,块存储,是最底层的存储,它关注的是磁盘的基本存储单元——块(Block),块存储可以没有软件服务器。而文件存储(像NAS)和对象存储(S3、七牛云),是软件层面的存储,底层也是基于块存储的。而文件存储和对象存储的区别在于,他们组织文件的方式,文件存储是有目录树的、有标准属性的(权限、用户、读写),而对象存储是扁平的、没有目录的、附加属性是灵活的,他们的接口协议也不一样。对象存储接口主要以S3与Swift为代表,其接口就是简单的GET、PUT、DEL和其他扩展,文件存储的话是以POSIX接口为主,以libcephfs为代表。有些分布式存储,比如Ceph,是同时支持块存储、对象存储和文件存储的,只是对应的接口不同,强烈建议看下这篇文章:一篇文章让你理解Ceph的三种存储接口(块/文件/对象)

    这三种存储,分别对应了不同的访问协议,这也就决定了他们的本质差别。

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

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

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

问两个问题:

    0、文件存储,底层是块存储。那么对象存储,底层也是文件存储吗?这个问题有点难解释,后面单独说明。

    1、FastDFS、HDFS属于文件存储还是对象存储?答案:对象存储。或者说“基于文件存储的对象存储”。

    2、作为容器的持久化卷,应该用那种存储?答案:要使用块存储,或支持POSIX接口的文件存储,比如NAS、GlusterFS、CephFS等。

解释:

    对象存储,底层不一定是文件存储,也可能是跳过文件,直接到块存储。我们通常眼睛看见的文件,只不过是操作系统给我们形象化的数据标志(一个图标、一个名字),对文件的操作是基于操作系统的文件系统函数。但是文件系统不止一种,有一些虚拟的文件系统,它甚至可以不直接使用操作系统的文件系统,而是直接调用更底层的命令,甚至直接操作物理存储的块数据。这个地址:http://www.dbseeker.com/blog/?post=7,是说Oracle的底层数据存储,可以看到Oracle自己做了一个逻辑卷管理,这个逻辑卷管理,它的逻辑块可以直接映射物理块数据。这里再做个答疑:Oracle能部署在NAS卷上面吗?答案是:可以,但是性能下降很大(有人说下降100倍),理论上可以,那是因为NAS磁盘,应该是兼容操作系统内核的绝大部分API,Oracle的逻辑卷管理,也是用的操作系统的底层API(非上层的文件系统API),所以没问题。但是NAS和本地磁盘还是有所区别,比如阿里云的官方文档上写着NAS 上使用 inotifywait (Linux文件系统函数)存在的问题,另外NAS的应用场景里面没有提到数据库:NAS的应用场景

    当然,并不是所有对象存储,都跳过了文件系统,像Kafka、HDFS的数据,都是直接写文件,只是会将原文件拆分,而FastDFS更省事,直接将原文件完整保存下来,本质上这些都是基于文件存储来实现的(但是HDFS、FastDFS的归类还是对象存储)。

关于POSIX标准、文件系统类型、VFS及FUFS,参见这篇文章:《文件系统、POSIX标准及VFS》

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐