随着云计算的发展,云存储作为一种更基础的云上资源池设施也越来越受到重视和欢迎。从云存储的类型来讲,目前流行的有块存储、文件存储和对象存储三种。今天的主角是对象存储,不过我们在介绍对象存储之前,先来了解下另外两种存储,做个对比,这样才能更好的了解对象存储。
对于这些概念网上我们可以找到很多,但是看着觉得太专业,云里雾里。在这里我以更通俗的方式来介绍什么是块存储。
首先我们要明白一个关键,块存储的直接使用者不是我们人类,而是文件系统。更简单的说块存储可以理解为一块硬盘,就是这么简单。至于这块硬盘是单独的物理盘,还是采用磁盘阵列技术组成的阵列,文件系统是不关心的,它️知道有几个盘,至于是逻辑的还是物理的,它完全关心(其实也管不着)。
我们常见的文件(数据)是以固定大小的块存放在块存储中的,根据文件大小的不同,可以分成很多个块,当我们读取这个文件的时候,底层的存储系统会将多个数据块合并一起,就成了一个我们需要的文件。
一个块存储,需要格式化(选择文件系统的过程)才能被使用。比如你在腾讯云上买了一个40G的SSD云盘,这个云盘就是一个块存储,你需要挂载到云主机上,然后选择合适的文件系统进行格式化,然后才能使用。
块存储支持随机读写,一般用于特定业务的数据存储,不过他不支持共享。
文件存储我们最常见了,就是我们电脑上的文件,经常接触。他们是以文件、文件夹的方式组织的,有层次结构。通过FTP、SMB可以进行共享,供多个用户同时访问。
文件存储的元数据信息是放在文件里的,存储有限,并且层次结构也限制着性能。
虽然块存储和文件存储可以满足大多数需求,但是它们还有个局限性就是不适合公有云存储,它们一般是用于局域网内使用。
对象存储,一种以对象为基本单位的存储,它的结构式扁平的,甚至可以认为不存在结构,所以它扩展比较容易。
对象存储的数据一般是非机构化数据,比如文件、图片和视频这些。
对象存储的非结构化数据,会被分片成一个个对象,存储在不同的存储节点上,这也是叫对象存储的原因,它不想文件存储是以文件和文件夹方式,块存储是以数据块的方式。
对象存储非常简单,只有2个核心概念:存储桶(Bucket)和对象(Object)。一个存储桶可以有很多个对象,这些对象都是平级的,也就是扁平的。
在对象存储的时候,KEY就是对象的名称,Value就是对象的内容。所以对于对于是一个类似Hash,是一个KV方式存储。
既然我们的对象都是扁平存储的,而且还被分片了,那么是如何管理它们的,或者说如何找到我们想要的文件以及文件的信息等?这就是对象存储核心的对象元数据管理。
对象的元数据就是用来管理数据的存储、分片以及数据本身的信息,因为元数据单独存储,所以我们可以为一个对象扩展任意多的元数据,这也是文件存储做不到的。
对象存储的底层设计都是扁平的,没有层次结构,但是我们看到的对象存储管理工具的确给我们提供了目录层次的管理,就像我们在使用文件系统一样,其实这样方式是通过KEY进行区分的。
假设我们想达到/static/1.jpg
这样的存储效果,那么在存储的时候,对于图片1.jpg
保存在对象存储中的KEY是/static/1.jpg
,通过KEY中的/
分隔,达到多级目录的效果,其实本质是KEY做了改变。
以MinIO为例,对于分布式的对象存储系统,是采用纠删码的方式保证数据的安全。纠删码会把分布式的盘组成一个纠删码集合,默认情况下,哪怕丢失N/2的数据盘,数据也可以正常恢复使用。
假设一个8块盘(可以分散在多个主机上)组成的纠删码集合,哪怕同时又4个盘损坏丢失,数据也可以正常使用,并且可以从中恢复,是不是很厉害。
Minio采用的是开源的纠删码实现,可以参考github.com/klauspost/reedsolomon了解更多实现。
对象存储业界比较有名的是GlusterFS和Ceph,MinIO是后起之秀,也是是Ceph的开发人员做的,采用Go语言实现。而且他的扩容机制是采用更简单的集群方式而不是节点方式,大大降低了维护的复杂度,因为节点的方式需要重新计算Hash以及对应的旧文件迁移,加一个节点原来的Hash就乱了。MinIO的地址是:https://github.com/minio/minio,有兴趣的朋友可以研究下。
对象存储兼容了文件和块存储的有点,又具备更好的扩展以支持公有云存储的需求,成本低、无限扩容、更容易访问等优点,会更多的被用户所选择。就像我当前的博客网站 https://www.flysnow.org/使用的就是对象存储搭建的静态网站托管。