4.4 存储分类

软件定义存储的核心是,将存储管理和底层硬件分离,可以将底层的多种异构存储进行整合,从而提供更加统一的接入、更大的规模和存储容量。结合分布式系统的特点,可以在没有宕机的情况下完成系统的扩容和升级,而且可以易于开源迅速部署一套企业级的存储系统,已经有很多公司部署PB级别的HDFS存储系统,并且能够平稳运行。存储按照使用的方式分为块存储、文件存储和对象存储。

4.4.1 块存储

块存储(Block storage)通常是以磁盘的方式提供的,数据在块存储中表示为同等大小的块(扇区),每个块存储的比特位没有实际含义,记录的只是0和1,必须和上层存储系统结合才能表示一个实体。举例来说,文件在文件系统中是独立的实体,但如果保存到块存储上面,会通过算法拆分成多个块保存,有的还会被加密保存,所以单独看每个块的数据是没有意义的。这种存储采用了直接操作磁盘的方法,所以它最大的优点是读写速度快、延迟低,通常用作数据库系统等对I/O有一定要求的系统,还可以用作其他系统的底层系统。

分布式块存储,将不同类型底层数据盘抽象合并,提供统一的数据接入,如图4-10所示。块存储挂载到目标机器后,在目标机器上面显示的是一个磁盘,由于都遵循了SCSI协议,操作系统并没有感知这是一个虚拟盘,可以格式化文件系统,并挂载到指定目录,像本地文件系统一样读写。这样不仅扩展了存储容量,而且可以提高读写速度。

图4-10 分布式块存储

分布式块存储主要考量的性能指标有IOPS(Input/Output Operations per Second,即每秒能处理的I/O个数,用于表示块存储处理读写能力)、吞吐量(单位时间内可以成功传输的数据数量)和访问延迟(块存储处理一个I/O需要的时间)。由于块大小和块存储的容量不同,性能也会不同。块越大,IOPS越低,但吞吐量越高。通常的分布式块存储的IOPS大约在10000 IOPS左右,吞吐量大概200Mbit/s。

4.4.2 文件存储

文件存储(File storage)是以文件目录的方式提供的,直接将文件系统呈现给用户。我们每天使用的桌面系统,使用的就是文件系统。我们可以在目录下面创建和删除文件,每个操作对象都是一个独立的实体。文件系统可以以支持网络传输的方式共享,NFS就是最常用的网络文件系统。在服务端创建一个共享目录,通过NFS的方式,可以在多个客户端挂载这个目录,从而完成数据的读写和共享。这种存储方式最大的优点是方便快捷,但缺点也很明显,首先,由于通过网络协议传输文件,文件系统操作会导致性能及一致性的问题,无法应用在高并发场景;其次,存储的容量受限于单个文件系统,不适用于大数据场景,文件存储一般用于中小容量的文件共享服务。常用的存储协议在Linux系统需要使用Network File System(NFS)协议,Windows系统需要使用SMB(又称为CIFS)协议。

4.4.3 对象存储

对象存储(Object storage)是以二进制对象的方式提供服务,它既不像块存储那样提供块的读取,也不像文件存储那样读写文件,而是以HTTP API的方式上传或者下载二进制对象。我们使用的网盘服务就是一种对象存储,当然,最著名的对象还是AWS的S3存储。

大数据特点之一是非结构化,什么是非结构化数据呢?简单来说,就是数据的结构不是固定,我们很难通过结构化定义一个网页的数据,不同的CSS风格页面布局,以及嵌入的图片和视频,还有我们的日志数据,结构复杂多变不统一,这些数据的存储很难通过RDS (Relational Database Service)数据库完成。对象存储的引入就是为了解决非结构化数据如何低成本的持久化这个问题。

对象存储的另一个重要作用是存储大文件,如视频、图片等,相比文件存储和块存储,对象存储的容量更大,价格更便宜,并且消除了文件存储inode个数的限制,在处理大量文件遍历的场景也比文件存储要快,但对象存储也不是万能的,它必须通过HTTP接口的方式传输数据,这导致读写的性能不会太高,并且也无法组织复杂的目录结构。

对象存储通常分为两级,bucket(桶)和object(对象),可以将bucket当作一个大的目录,而object则是这个目录下的文件。为了安全访问,还可以分别针对bucket和object设置读写权限,如针对bucket的读权限包括了查询bucket下所有对象的权限,而bucket的写权限主要包括更新或者删除bucket对象的权限,object的读权限则包括对象下载的权限。