为什么引入文件系统?
因为磁盘上面不仅要存放文件数据本身,还需要有对这些数据进行管理的数据,比如文件起始位置、大小、创建时间等。这些数据又叫做元数据(Metadata)。不同文件系统的元数据是不一样的。元数据会占用额外的磁盘空间,但总体比例不会很大,它对功能的实现和性能的提升有非常重要的作用。格式化文件系统,其实就是写入一些初始化的元数据的过程。
上图是一个完整的FAT32分区: FAT1: 文件分配表,描述文件存储空间的簇链接关系(下一簇数据存储在哪个簇,因为同一个文件中数据的簇号是连续的)。 FAT2: FAT1的备份。 FDT: 文件目录表,描述了其他元数据信息(包括起始位置、大小、时间、权限等文件和目录属性)。
这种链表式的存储方式效率不高。
缺点:
1.簇为最小单元,磁盘利用率不够。
2.链表形式导致磁盘碎片,会降低访问速度。
3.掉电可能引起FAT表未刷新,簇映射乱掉。
4.需要FAT表和目录共同匹配才能识别文件。
5.容量有限,簇数增加会导致FAT表索引速度慢。
Windows上用的FAT、NTFS,Linux下的ext4、XFS、btrfs都是常见的文件系统。FAT简单,用得也广,但功能、性能、对数据的保护度都有所欠缺。NTFS是Windows下推荐的文件系统。Linux中用ext4的人较多,这是大多数Linux发行版的默认文件系统。在服务器领域,用XFS的人较多,因为在部分环境下它能表现出较高的性能。
文件系统的发展
-
网络文件系统:如CIFS(Windows网上邻居所用的协议)和NFS,就是网络文件系统。它们和普通文件系统的概念有所差别,并不定义文件数据是如何在磁盘上面分布的,而是告诉网络中的客户端,文件数据应当如何传输,怎么通过网络访问远端的文件。所以,它实际上是搭建在普通文件系统之上的。提供网络文件服务的设备,需要有一个本地的文件系统(如ext4),然后在启动一个或多个网络文件系统,负责从普通文件系统中读取数据,向外传送。
-
分布式文件系统或集群文件系统:如Hadoop中的HDFS。它们能把很多台电脑里的数据整合起来,对外表现出一个单一的存储节点,提供服务,实现性能扩展和高可靠性等高级特性。它们实际上也不会直接操作磁盘数据,而是叠加在普通文件系统之上的。用户对这类文件系统的IO请求,被它们处理之后,会转化为每一个节点上的普通IO,再调用本地的文件系统进行实际的数据读写。
-
特殊文件系统:Linux下就有sysfs和procfs等特殊文件系统,用来管理系统设备,调用内核接口。它们和磁盘上的数据就没有任何直接的联系了,只是以文件接口的方式,提供了很多特殊功能给用户使用。因为在接口上面和普通文件读写类似,所以也被冠名为文件系统。
下面介绍几种分布式存储的方法:
持久化存储
关键概念: 文件系统,数据库系统
文件系统中,大量文件没有很好组织,缺乏对象之间关键,读取效率低,因此有了数据库。
单台计算机无法满足数据存储和处理需求,需要集群化方案,如何高效读取分布式计算机文件,高效执行分布式数据库的SQL查询,就有了NOSQL。包括:
- 知名分布式文件系统:HDFS
- 分布式非关系型(非结构化)数据库:Hbase和MongoDB。
分布式文件系统
2003年,Google发布论文GFS,启发Apache Nutch开发了HDFS。2004年,Google 又发布了论文《MapReduce: Simplified Data Processing on Large Clusters》,Doug Cutting等人实现计算框架MapReduce ,并与HDFS结合来更好的支持该框架。2006年项目从Butch搜索引擎中独立出来,成为了现在的Hadoop。
GFS隐藏了底层的负载均衡,切片备份等细节,使复杂性透明化,并提供统一的文件系统接口。其成本低,容错高,高吞吐,适合超大数据集应用场景。
HDFS原理: 1、横向扩展,增加“数据节点”就能增加容量。 2、增加协调部门,“命名节点”维护元数据,负责文件系统的命名空间,控制外部访问,将数据块印射到数据节点。还会备份元数据从命名节点,它只与命名节点通信。 3、数据库在多个数据节点备份。
弱点: 1.不适合实时数据访问。 2.无法高效存储小文件,太多小文件会降低命名节点检索效率,降低系统处理速度。 3.不支持多用户写入。 4.不支持文件任意位置修改,只能在文件末尾追加新数据。
分布式数据库
Google发布论文《Bigtable: A Distributed Storage System for Structured Data》。
HBase
Hbase在HDFS基础上提供了Bigtable的能力; 并且基于列的模式进行存储。
HBase的数据模型: 表格 行 列族 列限定符 单元 版本
HBase体系结构: HMaster HRegion HRegion服务器
HBase的列存储设计非常方便扩展,可以修改列族定义、增加列族或列限定符,所以被成为“宽表”。
宽表模式优点: 节省关系数据库连接操作和存储空间。 可将不同Schema模式的数据混合,即异构数据源的统一和集成。
MongoDB
面向集合,数据分组存储在数据集,数据集被称为集合,每个集合在数据库有唯一标识,可以包含无数文档。
与HBase区别: 1.数据直接存储在文件系统上,而非HDFS上。其也有大文件存储概念GridFS,由MongoDB自身实现。 2.数据模型以文档为单位,支持多种复杂结构。文档中字段或属性不限定特定类型。 3.单个文档不再切分和分布式存储。
非持久化存储
关键字:缓存和散列 散列:数据的散列值作为键,待写入的数据作为值,进行key-value配对存储。散列值由散列函数(算法)得出,好的算法尽量避免散列冲突(散列值不唯一)。
提高缓存访问命中率: 淘汰算法:最少使用(LFU),最久未用(LRU)。
缓存系统:
Memcached, Berkeley DB, Redis。 MongoDB也可以做缓存,Redis和Berkeley DB也支持持久化存储,没那么绝对。
Memcached: 基于散列映射。 LRU。 客户端(任何语言)通过Memcached协议 来与守护进程通信(c语言)。 服务器端无切片和副本等分布式功能,服务器之间不通信,需要应用端实现。
Berkeley DB(轻量级): 嵌入式数据库系统。 架构简单,key-value。 支持ACID数据库事务处理,细粒度锁,XA接口,热备份,同步复制等。 核心不支持分布式,支持持久化。
Redis(远程字典服务器):1.超高性能,每秒数十万次。 2.支持字符串,散列表,列表,集合。 3.支持事务性,例如a转账给b,a扣钱,b加钱,如果b未加成功,a扣的钱返还。 4.可设定生命周期,为key-value设置生命周期(TTL),例如验证码,限时特惠。 5.持久化,全量保存的RDB镜像(速度快),增量保存的AOF日志(资源消耗少,丢失少)。 6.主从同步,从服务器利用发布/订阅机制从主服务器接收发布的记录。 7.哨兵,自动化监控和故障恢复。 8.适用读多写少,主服务器写,从服务器读,主服务器一旦出错,系统恢复麻烦。Redis3.0后提出了“集群”概念,包括预分片技术,对水平扩展更好的支持。
分布式存储的三种类型:
分布式存储的应用场景相对于其存储接口,现在流行分为三种:
对象存储: 也就是通常意义的键值存储,其接口就是简单的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接口的类文件存储接口归入此类。