CEPH篇块存储、⽂件存储和对象存储意义和差异理解块存储、⽂件存储和对象存储的应⽤场景和选择
应⽤场景(王豪迈(麦⼦迈|wheats))
分布式存储的应⽤场景相对于其存储接⼝,现在流⾏分为三种:
对象存储: 也就是通常意义的键值存储,其接⼝就是简单的 GET、PUT、DEL 和其他扩展,如七⽜、⼜拍、Swift、S3
块存储: 这种接⼝通常以 QEMU Driver 或者 Kernel Module 的⽅式存在,这种接⼝需要实现 Linux 的 Block Device 的接⼝或者 QEMU 提供的 Block Driver 接⼝,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿⾥云的盘古系统,还有 Ceph 的 RBD(RBD 是 Ceph ⾯向块存储的接⼝) ⽂件存储: 通常意义是⽀持 POSIX 接⼝,它跟传统的⽂件系统如 Ext4 是⼀个类型的,但区别在于分布式存储提供了并⾏化的能⼒,如Ceph 的 CephFS(CephFS 是 Ceph ⾯向⽂件存储的接⼝),但是有时候⼜会把 GFS,HDFS 这种⾮ POSIX 接⼝的类⽂件存储接⼝归⼊此类。
按照这三种接⼝和其应⽤场景,很容易了解这三种类型的 IO 特点,括号⾥代表了它在⾮分布式情况下的对应:
对象存储(键值数据库):接⼝简单,⼀个对象我们可以看成⼀个⽂件,只能全写全读,通常以⼤⽂件为主,要求⾜够的 IO 带宽。
块存储(硬盘):它的 IO 特点与传统的硬盘是⼀致的,⼀个硬盘应该是能⾯向通⽤需求的,即能应付⼤⽂件读写,也能处理好⼩⽂件读写。但是硬盘的特点是容量⼤,热点明显。因此块存储主要可以应付热点问题。另外,块存储要求的延迟是最低的。
⽂件存储(⽂件系统):⽀持⽂件存储的接⼝的系统设计跟传统本地⽂件系统如 Ext4 这种的特点和难点是⼀致的,它⽐块存储具有更丰富的接⼝,需要考虑⽬录、⽂件属性等⽀持,实现⼀个⽀持并⾏化的⽂件存储应该是最困难的。但像 HDFS、GFS 这种⾃⼰定义标准的系统,可以通过根据实现来定义接⼝,会容易⼀点。
因此,这三种接⼝分别以⾮分布式情况下的键值数据库、硬盘和⽂件系统的 IO 特点来对应即可。⾄于冷热、快慢、⼤⼩⽂件⽽⾔更接近于业务。但是因为存储系统是通⽤化实现,通常来说,需要尽量满⾜各种需求,⽽接⼝定义已经⼀定意义上就砍去了⼀些需求,如对象存储会以冷存储、⼤⽂件为主。
如何选择(王旭)
⾸先对象存储和⽂件存储的区别是不⼤的,存储的都是⼀样的东西,只是抛弃了统⼀的命名空间和⽬录树的结构,使得扩展起来桎梏少⼀些。
独⽴的互联⽹存储服务⼀般都是做对象存储的,因为块存储是给计算机⽤的,对象存储是给浏览器等 HTTP 客户端⽤的。独⽴服务所提供的存储系统,访问都来⾃互联⽹,⾃然是做对象存储;与之相对应,⼤部分类 AWS 的主机服务商都会提供⼀个块存储服务搭配主机服务。
同⼀个服务商同时提供两个服务是有好处的,除了提供的服务⽐较全这个优点以外,对象存储还可以⽀撑块存储的快照、主机的系统镜像存储等应⽤,可以相互结合的。
权衡的因素有很多——可靠性要求、可⽤性要求、时延要求、⼀致性要求、使⽤模式相关要求(包括请求⼤⼩、QPS/IOPS、吞吐)等。
⽐如:
对于块存储,要求的访问时延是 10ms 级的,因为给虚拟机⽤的,传统硬盘也是 10ms 级的时延,请求尺⼨都很⼩,但 qps(iops)可能会很⾼,那么在这种情况下:
异地多中⼼是不现实的,存储要和主机尽量接近,相应地可靠性必然会有所打折
强⼀致副本不会过多,强⼀致要求对时延有影响
对于对象存储,要求的访问时延是 100ms - 1s 级的,请求⼀般是中到⼤尺⼨,低 qps 的,在这种情况下
可以⽤更多的分散副本数来换取更⾼的可靠性,但过多副本增加维持⼀致性的难度,需要折衷
另外 SSD 随着成本降低,在块存储⾥逐渐成为主流了,以便提供更好的 IOPS,AWS 这个⽉开始,创建的 EBS 卷缺省就是 SSD 的了。
对于评价⼀个实现,⾸先是看适合不适合这个⽤途,然后看这个⽅案有没有显著的缺点,是否有严重的影响,然后成本之类的也是⼀个因素,做软件的⼈总觉的⽤便宜硬件实现⾼⼤上的服务才值得吹⽜,呵呵。
下⽂链接:www.zhihu/question/21536660/answer/33279921
块存储
典型设备:磁盘阵列,硬盘
块存储主要是将裸磁盘空间整个映射给主机使⽤的,就是说例如磁盘阵列⾥⾯有5块硬盘(为⽅便说明,假设每个硬盘1G),然后可以
通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种⽅式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例
如第⼀个逻辑硬盘A⾥⾯,可能第⼀个200M是来⾃物理硬盘1,第⼆个200M是来⾃物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)
接着块存储会采⽤映射的⽅式将这⼏个逻辑盘映射给主机,主机上⾯的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它⼀概就认为只是5块裸的物理硬盘⽽已,跟直接拿⼀块物理硬盘挂载到操作系统没有区别的,⾄少操作系统感知上没有区别。
此种⽅式下,操作系统还需要对挂载的裸硬盘进⾏分区、格式化后,才能使⽤,与平常主机内置硬盘的⽅式完全⽆异。
优点:
这种⽅式的好处当然是因为通过了Raid与LVM等⼿段,对数据提供了保护。
另外也可以将多块廉价的硬盘组合起来,成为⼀个⼤容量的逻辑盘对外提供服务,提⾼了容量。
写⼊数据的时候,由于是多块磁盘组合出来的逻辑盘,所以⼏块磁盘可以并⾏写⼊的,提升了读写效率。
很多时候块存储采⽤SAN架构组⽹,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。
缺点:
采⽤SAN架构组⽹时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本⾼。
主机之间的数据⽆法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使⽤后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使⽤,⽆法共享数据。
不利于不同操作系统主机间的数据共享:另外⼀个原因是因为操作系统使⽤不同的⽂件系统,格式化完之后,不同⽂件系统间的数据是共享不了的。例如⼀台装了WIN7/XP,⽂件系统是FAT32/NTFS,⽽Linux是EXT4,EXT4是⽆法识别NTFS的⽂件系统的。就像⼀只NTFS格式的U盘,插进Linux的笔记本,根本⽆法识别出来。所以不利于⽂件共享。
⽂件存储
典型设备:FTP、NFS服务器
为了克服上述⽂件⽆法共享的问题,所以有了⽂件存储。
⽂件存储也有软硬⼀体化的设备,但是其实普通拿⼀台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是⽂件存储的⼀种了。
主机A可以直接对⽂件存储进⾏⽂件的上传下载,与块存储不同,主机A是不需要再对⽂件存储进⾏格式化的,因为⽂件管理功能已经由⽂件存储⾃⼰搞定了。
优点:
造价交低:随便⼀台机器就可以了,另外普通以太⽹就可以,根本不需要专⽤的SAN⽹络,所以造价低。
⽅便⽂件共享:例如主机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对外⼜相当于⽂件服务器,那么就不存在⽂件共享⽅⾯的困难了,也解决了⽂件共享⽅⾯的问题。
所以对象存储的出现,很好地结合了块存储与⽂件存储的优点。
最后为什么对象存储兼具块存储与⽂件存储的好处,还要使⽤块存储或⽂件存储呢?
有⼀类应⽤是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给⾃⼰后,再根据⾃⼰的数据库⽂件系统来对裸盘进⾏格式化的,所以是不能够采⽤其他已经被格式化为某种⽂件系统的存储的。此类应⽤更适合使⽤块存储。
对象存储的成本⽐起普通的⽂件存储还是较⾼,需要购买专门的对象存储软件以及⼤容量硬盘。如果对数据量要求不是海量,只是为了做⽂件共享的时候,直接⽤⽂件存储的形式好了,性价⽐⾼。