在谈对象存储是什么之前,我们先回顾一下块存储和文件存储是什么
块存储与文件存储
块存储:
常见的块存储设备是磁盘阵列,它会向主机提供裸磁盘空间。也就是说操作系统看到的只是一块磁盘而已,虽然它底层可能是多块硬盘组合起来的逻辑盘。
这种方式下,操作系统还可以对挂载的裸硬盘进行分区、格式化,与主机内置的硬盘使用没有区别。
一般块存储会采用SAN架构组网,而且会使用FC 协议,这样传输速度和吞吐量都会很大。但是也正因为需要使用FC协议,自然也需要FC HBA卡以及FC交换机,成本将比较高。
另外,磁盘阵列一般会把某一块LUN映射给某个主机,也就是说这块主机独享这块LUN,就相当于它的本地盘,自然无法与其他的主机共享数据。
文件存储
块存储很难解决文件共享的问题,因为主机的操作系统可能不一样,所以文件管理系统也不一样,那么能不能把文件系统单拿出来,放到某一专用的设备上呢?当然可以,这就形成了文件存储系统,最经典的当属NAS设备。
简单的说,NAS设备就是把文件管理功能移植到专用的设备上,而且只需要以太网就可以,成本大大降低。
缺点也很明显,传输速率远远赶不上SAN网络。
对象存储系统
对象存储怎么来的
我们知道块存储、文件存储各有其优缺点,简单的说,块存储读写块,但是不利于共享,文件存储读写慢,但是利于共享。
有没有一种方式,可以克服他们的优缺点呢?也就是读写快,同时利于共享。要想读写快,最好的方法是并行取,要想共享,最好能结合文件系统的特点。既然如此,我们先再看看文件存储有没有什么可以借鉴的地方吧。
在文件系统里面,一个文件包含了元数据以及内容,比如FAT32这种文件系统,文件数据与元数据一起存放的。当你要存放一个文件的时候,首先会划分为4k大小的块,然后写到硬盘里面,注意切分的时候会不区分数据和元数据。
每个块都会指向下一个块的地址,所以读取的时候只能一个一个顺序的查找,速率自然上不去。具体实现方式可见http://www.cnblogs.com/dy2903/p/8367217.html
后来我们把主机的文件系统移植到专门的NAS设备上,主机要访问某个文件只需要传递路径和文件名即可。也就是说NAS设备其实就是把“文件——块”的映射关系移植到了专门的设备里面。如下图所示。
传统的NFS架构,一个目录只能载入一次,所有的请求只能发与它,哪怕是这个目录下的文件实际上是存在另一个节点上,也需要通过此节点进行转发,无法并行。
那我们能不能故技重施,把磁盘也挪出去,组成集群,然后文件系统可以并行的访问这些磁盘呢。
但是主机客户端怎么知道要访问的文件在哪个磁盘上呢?再不能在客户端本地维护一份映射关系吧。解决的方法是维护元数据的功能也剥离出来,形成一个独立的元数据服务器,由它来维护“文件——磁盘——块”之间的映射关系。
那么如果客户端要访问文件,首先需要向元数据服务器发起请求,由它来告知需要文件存放的具体位置。之后,客户端可以直接向磁盘发出IO请求。
总结一下就是将文件系统逻辑从主机端移出来放到元数据服务器上,所有的硬盘也放到网络中
不过这个架构需要硬盘非常的智能,因为要把很多逻辑放到硬盘上来处理,到目前来说也没有实现。没有关系,我们把硬盘换成Server就可以了,取名为对象存储设备(Object Storage Device, OSD)
那么对象存储就是把元数据独立出来,成为元数据服务器,主要作用是存储对象数据的元数据。而其他实际存放文件数据部分的节点就叫OSD。文件我们改称为Object
,目录称为Partition
,OSD中每个Object用一个128b的Object ID(OID)表示,其实就类似NAS中的File Handle(文件句柄)
那么用户访问对象的时候,首先需要向元数据服务器请求对象存储在哪些OSD里面,然后用户才会向这些OSD服务器再次请求。可以看出,这样可以实现多台节点并行传输数据,速度自然加快。
同时因为对象存储是有专门的文件系统的,OSD节点又相当于文件服务器,所以可以解决文件共享的问题。
总的来说,对象存储结合了块存储和文件存储的优点。
访问的流程
下图为对象存储的整体架构,其中元数据服务器、OSD服务器之前已经讲过了,我们还需要在主机上安装一个代理OSD Initiator
。
如果用户想读取或者写入文件的时候,首先由这个代理向元数据服务器中查询文件存储的OSD设备,然后也是由它与操作系统的虚拟目录层对接,翻译成对应的OSD 请求,发给OSD。而且代理只需要给出OID即可,不需要给出绝对路径。
与集群分布式文件系统的区别
我们可以再对比一下对象存储与集群分布式文件系统的区别。
集群文件系统架构中,客户端只能从某台节点上挂载某个目录,如果请求的数据不在这个节点上,会由它来进行重定向,那么这个节点的性能将成为瓶颈。
而OSD则不然,在开始访问之前,需要从元数据服务器上查询目标文件分布在哪些OSD节点上,然后才会并行的向相关节点发起IO请求,并行的存储数据,简单的讲对象存储既有块存储的高效率,又有文件存储的灵活性。