最近接触分布式系统开发,从头开始熟悉分布式文件系统开发,整理了下相关资料(我是互联网搬运工,资料都是网上大神的精华萃取,如有侵权联系我删除),适合刚开始入门了解阶段。
1. 概述
1. 存储系统
存储系统是指电子设备把二进制数据进行可持久化保存的一套设备。存储系统由软件和硬件组成,典型的如CD、硬盘,SSD等设备。尽管存储系统的实现的原理不尽相同,但他们的作用都是一样,就是持久化保存和读取二进制数据,而不感知二进制数据内容。有价值的不是这些高低电平的数据,而是这些数据所表示的内容和意义。好比一篇填满文字的文章,如果人们无法通过其文字内容,了解这边文章表达的意思,那么这个文章就是无用的。
目前根据存储内容,可将存储系统可分为:块存储,对象存储,文件存储。
块存储,是基于磁盘块设备发展过来的概念。就是提供一块一定容量的块读写设备,典型是一个磁盘,或者一个磁盘某个分区。对于该块内容,对使用者而言只是提供二进制数据,对数据内容不做任何识别,相当于一个未格式化的硬盘。一般用户使用块设备,会进行格式化处理,可以按照私有方案的格式化,也可以采用主流的文件系统格式(xFS, NTFS等等)。分布式存储系统,其块设备设计主要用于给用户系统提供外挂的系统盘,或者超大容量数据盘等。
对象存储,是对块存储内容进一步感知,但又不像文件系统那样有层次的组织结构,目的是给应用程序使用,直接采用key-value方式组织数据放到块设备里,达到快速定位数据的效果。该存储技术出现主要是互联网应用需要快速存储和访问大量特定格式的数据,如图片,视频等。通过键值设计的对象存储系统,能满足应用程序快速索引的要求,提高互联应用访问速度和用户体验。
文件存储,就是按照B树形结构方式组织数据,能组织更加复杂的数据保存,但访问效率没有对象存储那么直接。更多的是为了符合人类直观的操作模型。
1.2.1 文件系统
由于存储系统只负责保存和读取二进制数据,但二进制数据所表示内容和意义才是存储数据的真正价值。为了实现用户或者应用程序能有效地直观的感知存储的数据,人们按照人类可理解的思维,按照树的结构组织解析二进制数据,从而产生文件系统概念。
文件系统本质上是给操作系统应用提供读写存储设备的接口,是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。
文件系统为操作系统提供一套高效读写所需数据的统一方法,并且能提供软件级的数据容错和读写优化策略。
文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
1.2.2本地文件系统
文件系统早期是本地操作系统管理本地存储设备的一种,因为限于传输技术发展,系统对数据读写都是基于本地IO读取,存储设备都是通过短距离的本地I/O方式与操作系统交互(如串口,SCIS,USB等),多个存储设备通过本地高速总线,或者RAID等技术连接到一起提供给操作系统使用。操作系统一般可直接接口调用方式(如POXIS定义的open,read、wirte等操作)。
2. 网络文件系统
网络文件系统,是适应于基于网络接入方式的存储设备数据读写的一种文件系统,本质上就是把传统文件系统对存储设备的读写接口,从本地驱动设备直接读取改成更上层的TCP/IP方式读取,使得操作存储设备不限于本地存储,可以直接操作基于网络连接的存储设备。
1.3.1 网络文件系统协议
由于网络文件系统,需要利用TCP/IP技术远程读取分布式的存储设备数据,则需要有对应的协议来规范远程操作的方法。只要满足遵循该方法的用户系统和存储系统,就能像本地访问文件的方式来访问远程存储设备数据。
1.3.2 典型网络文件系统协议
目前主流的接入协议主要有Linux阵营和window阵营,其中Linux是一NFS协议为代表,而window产品则以cifs/SMB协议为典型代表。不过随着技术发展,基本可以通用了。
CIFS/SMB协议
详见《CIFS技术白皮书》
NFS协议
详见《NFS技术白皮书》
pNFS
下面介绍图中三个协议:
pNFS protocol:在服务器和客户端之间传递元数据(更正式的叫法为“布局”)。包括:文件写入位置、文件属性等。
storage access protocol:指定客户机访问数据仓库的方式。
control protocol:同步元数据服务器和数据服务器之间的状态。同步是对客户机隐藏的,比如重新组织介质上的文件。此外,NFSv4.1 并没有规定控制协议;因此它有多种形式,这在性能、成本和特性方面的竞争为供应商提供了灵活性。
1.2.3 网络文件系统开源项目
3. 分布式文件系统
随着传输技术发展,操作系统读写数据的方式,不止限于本地I/O技术,也同时支持远距离的TCP/IP方式获取数据。就是相当于新增一种可以远距离传输的I/O技术,使得分散的存储设备和用户操作系统可以通过网络方式接入联合在一起,形成更大容量,更易于拓展伸缩的存储系统,对此人们引入分布式文件系统的概念,本质上跟传统的文件系统没本质的差别。只是网络连接的可靠性复杂性等因素,相对于本地总线而言,分布式接入的存储设备,需要应用层做更多复杂的策略来配合达到相同的效果。
2. 架构
1. 概述
分布式文件系统架构主要面向的集群系统所采用的一套策略方案。主要考虑的有读写性能,数据容灾备份,避免单点故障,以及数据备份,数据容错恢复等。
2. 主流架构
3. 原生客户端
分布式文件系统客户端,是指针对分布式文件系统,需要有配套的接入端来实现用户能访问分布式文件系统,目前主流做法是两个,一个是原生客户端(Native client),另一个是协议网关代理服务。
原生客户端,设计配套的客户端接入(类似自定义一套私有的接入协议),如图2-1。分布式文件系统,需要提高可靠性和容错能力,设计基本采用集群方案,不是传统的C/S模型,而是多客户端对多服务端(Multi-C/Multi-S, 简称MC/MS)模型,类似DNS负载均衡。该模型需要在用户客户端能实现负载均衡,寻址定位等功能,因此必须使用与存储集群相配套的原生客户端(Native client)接入才能满足分布式系统设计要求。
2-1 原生客户端
协议网关代理服务,目的是为了兼容传统的网络文件系统协议(如NFS/FTP/CIFS),如图2-2;分布式文件系统基本都需要兼容传统网络文件系统协议,但传统网络文件系统协议(CIFS/NFS)针对的是点对点的C/S架构设计的协议,无法像分布式文件系统客户端那样,实现高性能高可靠的接入(pNF会引入并行访问能力,类似分布式文件系统架构,但不同分布式文件系统项目的后端架构都不相同,还无法做到直接对接该功能)。因此都需要采用网关代理模式,在代理服务器里集成分布式文件系统的原生客户端,间接访问存储集群。
4. 主流产品分析
Ceph
1、提供统一接口协议(ceph storage Cluster Protocol,librados),块存储、对象存储、文件系统的客户端接入都基于该协议设计对用的服务网关,或者文件系统。
2、不支持直接NFS/CIFS协议接入,而是可以通过客户端文件系统挂载的方式实现NFS/CIFS访问。
GlusterFS
1、采用用户态的文件系统方式原生客户端。
2、集成有NFS代理服务(Gluster NFS server),可以直接通过NFS客户端连接到NFS代理服务,无需额外NFS组件支持。
3、Gluster client提供用户态的存储访问接口,可以直接兼容开源NFS-Gnaesha。
Lustre
1、提供支持POSIX兼容的客户端,支持文件系统直接挂载;
2、支持NFS/CIFS通过文件系统方式间接访问;
QF2
1、资料上说明支持NFS/SMB,实际如何实现未从资料里看出,猜测也是基于代理的模式。
OceanStore
1、从资料上看仅支持NFS/CIFS通过文件系统方式间接单个存储节点;
2、支持利用DNS访问方式,实现NFS/CIFS接入负载均衡。
3、NFS增强功能,必须在客户机集成原生客户端实现。本质上也是利用客户机做网关代理;
TFS
HDFS
3. 关键技术
当前分布式文件系统比较热点的关键技术总结了有几下几点,后续单独对这个进行展开讨论。
1、 纠删码技术
2、 一致性协议
3、 数据定位技术
4、 日志技术
5、 RDMA
4. 总结
第一,开发分布式文件系统,可以优先支持客户端文件系统。从开源分布式文件系统角度看,基本都支持客户端文件系统访问,可以采用FUSE实现如图4-1,也可以直接写一个文件系统组件如图4-2。用户可以通过文件系统挂载的方式,直接将分布式存储盘直接挂载到客户机上,实现本地文件访问。
4-1 FUSE实现本地文件系统
4-2 直接内核支持新文件系统
第二,利用客户端文件系统,可以直接使用Linux系统集成的Samba/NFS服务作为网关代理,间接实现客户机通过NFS/CIFS访问。
第三,独立网关代理。当前除了pNFS协议外,其它网络文件系统协议都是点对点的访问模式,无法利用分布式文件系统无中心,分布式,负载均衡等特性,建议通过独立网关代理服务器方式,为用户提供接入服务。
第四,pNFS协议支持。pNFS协议是专门为分布式文件系统设计,其实现原理是基于元数据服务器模式,可以根据分布式文件系统架构,从开发阶段就考虑支持pNFS协议。
从开发效率角度上看,开发流程按照如下模块进行,整体会相对科学合理。
OSD-> MDS -> 原生客户端->本地文件系统-> NFS/SAMBA挂载测试->NFS-GANESHA开源适配->samba开源适配