存储(文件存储、对象存储、块存储)

如果我们按存储的业务逻辑分,那么可以分为:键值存储(Key-Value Storage)、文件系统(File System)、数据库(Database,不是很严谨,只是作为所有支持多键值的存储的统称)、消息队列(MQ)等等。按这种分类方法存储的种类是无穷尽的,我曾经说过 “存储即数据结构”,表达的就是这个意思。数据结构无穷尽,存储也会无法穷尽。块存储我们很少把它划分到上面的分类中,因为它是虚拟存储设备,是为 VM 服务的一个东西,并不直接面向用户业务(用户不需要调用块存储设备的 api 来完成业务,当然如果我们把 VM 也认为是一个业务系统的话,块存储也勉强可以作为一种特定的数据结构存在)。对象存储(Object Storage)是键值存储(Key-Value Storage)的特例,它假设 Value 是文件,尺寸范围可以很大(比如七牛可以支持文件大小从 0 字节到 1TB)。如果要对对象存储做进一步分类,我能够想到的就是按实现方案来分类。比如按冗余方案来分,可分为多副本、RAID、纠删码等等;或者我们按一致性方案分,可以分为主从结构和对等结构等。

不会有什么存储方案能够一统天下。不同业务系统的场景需求不同,对存储的诉求会不同,选择自然会不同。基于纠删码的存储系统,复杂性远高于三副本的存储系统。从易维护的角度,如果业务对存储成本不敏感,那么人们自然而然会选择三副本的方案。

                                -- 许式伟

存储

按照这三种接口和其应用场景,很容易了解这三种类型的 IO 特点,括号里代表了它在非分布式情况下的对应:

  1. 对象存储(键值数据库):接口简单,一个对象我们可以看成一个文件,只能全写全读,通常以大文件为主,要求足够的 IO 带宽。

  2. 块存储(硬盘):它的 IO 特点与传统的硬盘是一致的,一个硬盘应该是能面向通用需求的,即能应付大文件读写,也能处理好小文件读写。但是硬盘的特点是容量大,热点明显。因此块存储主要可以应付热点问题。另外,块存储要求的延迟是最低的。

  3. 文件存储(文件系统):支持文件存储的接口的系统设计跟传统本地文件系统如 Ext4 这种的特点和难点是一致的,它比块存储具有更丰富的接口,需要考虑目录、文件属性等支持,实现一个支持并行化的文件存储应该是最困难的。但像 HDFS、GFS 这种自己定义标准的系统,可以通过根据实现来定义接口,会容易一点。

============================================================================

【块存储】典型设备:磁盘阵列,硬盘

块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有 5 块硬盘(为方便说明,假设每个硬盘 1G),然后可以通过划逻辑盘、做 Raid、或者 LVM(逻辑卷)等种种方式逻辑划分出 N 个逻辑的硬盘。(假设划分完的逻辑盘也是 5 个,每个也是 1G,但是这 5 个 1G 的逻辑盘已经于原来的 5 个物理硬盘意义完全不同了。例如第一个逻辑硬盘 A 里面,可能第一个 200M 是来自物理硬盘 1,第二个 200M 是来自物理硬盘 2,所以逻辑硬盘 A 是由多个物理硬盘逻辑虚构出来的硬盘。)

接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有 5 块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是 5 块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。

优点:

  1. 这种方式的好处当然是因为通过了 Raid 与 LVM 等手段,对数据提供了保护。
  2. 另外也可以将多块廉价的硬盘组合起来,成为一个大容量的逻辑盘对外提供服务,提高了容量。
  3. 写入数据的时候,由于是多块磁盘组合出来的逻辑盘,所以几块磁盘可以并行写入的,提升了读写效率。
  4. 很多时候块存储采用 SAN 架构组网,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。

缺点:

  1. 采用 SAN 架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。
  2. 主机之间的数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使用后,对于主机来说相当于本地盘,那么主机 A 的本地盘根本不能给主机 B 去使用,无法共享数据。
  3. 不利于不同操作系统主机间的数据共享:另外一个原因是因为操作系统使用不同的文件系统,格式化完之后,不同文件系统间的数据是共享不了的。例如一台装了 WIN7/XP,文件系统是 FAT32/NTFS,而 Linux 是 EXT4,EXT4 是无法识别 NTFS 的文件系统的。就像一只 NTFS 格式的 U 盘,插进 Linux 的笔记本,根本无法识别出来。所以不利于文件共享。

【文件存储】典型设备:FTP、NFS 服务器

为了克服上述文件无法共享的问题,所以有了文件存储。

文件存储也有软硬一体化的设备,但是其实普通拿一台服务器 / 笔记本,只要装上合适的操作系统与软件,就可以架设 FTP 与 NFS 服务了,架上该类服务之后的服务器,就是文件存储的一种了。

主机 A 可以直接对文件存储进行文件的上传下载,与块存储不同,主机 A 是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。

优点:

  1. 造价交低:随便一台机器就可以了,另外普通以太网就可以,根本不需要专用的 SAN 网络,所以造价低。
  2. 方便文件共享:例如主机 A(WIN7,NTFS 文件系统),主机 B(Linux,EXT4 文件系统),想互拷一部电影,本来不行。加了个主机 C(NFS 服务器),然后可以先 A 拷到 C,再 C 拷到 B 就 OK 了。(例子比较肤浅,请见谅……)

缺点: 读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要 1 台服务器里面的硬盘来承担,相比起磁盘阵列动不动就几十上百块硬盘同时读写,速率慢了许多。

【对象存储】典型设备:内置大容量硬盘的分布式服务器

对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。

之所以出现了对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬它俩各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写快,利 于共享的出来呢。于是就有了对象存储。

首先,一个文件包含了了属性(术语叫 metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。

以往像 FAT32 这种文件系统,是直接将一份文件的数据与 metadata 一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如 4M 的文件,假设文件系统要求一个块 4K,那么就将文件打散成为 1000 个小块),再写进硬盘里面,过程中没有区分数据 / metadata 的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。

这种情况下读写速率很慢,因为就算你有 100 个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有 1 个机械手臂在实际工作。而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器 + 对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做 OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些 OSD,假设反馈文件 A 存储在 B、C、D 三台 OSD,那么用户就会再次直接访问 3 台 OSD 服务器去读取数据。

这时候由于是 3 台 OSD 同时对外传输数据,所以传输的速度就加快了。当 OSD 服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。

另一方面,对象存储软件是有专门的文件系统的,所以 OSD 对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。 所以对象存储的出现,很好地结合了块存储与文件存储的优点。 最后为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?

  1. 有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更适合使用块存储。
  2. 对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。

===========================================================================

IT 系统按应用存储方式可以分为文件存储、对象存储、块存储三种类型。

文件存储

对象存储

块存储

三种存储方式的差异

统一存储

统一提供文件存储、对象存储和块存储的分布式存储服务。如ceph,sheepdog

分布式存储架构规划

需求

-->