1. 文件系统
概念:
名字空间:目录树
文件的读写:打开(offset)、读、写、关闭(避免内存泄漏)
设计:
下层接口:磁盘的读写接口,磁盘的地址(磁盘的驱动)
上层接口:目录树的组织、文件数据的读写
本质功能:将文件名字翻译定位到一个具体的磁盘位置,进而可以完成文件的读写。
2. 文件系统接口的标准化
虚拟文件系统VFS:物理文件与服务之间的一个接口,对各种文件系统(ext3、nfs、vfat)的细节进行抽象化
3. 文件系统的磁盘数据结构
例子:ext2
磁盘 = 启动块+块组 = boot block(启动块)、block group0(块组)......、block group n
对于某一个块组,包括:
super block(超级块):描述文件系统的相关信息
group description:块组本身的描述
data block bitmap:用0、1标记数据块有没有被使用
inode bitmap:inode代表了一个目录,用0、1表示inode是否存在
inode table:inode的信息(address、size),不包含文件名
data blocks:目录名称
4. 文件系统讨论
磁盘块的大小:一个文件起码占一个磁盘块(例如4kb),磁盘块小浪费小,但是性能差
文件系统的缓存:时间局部性、空间局部性
磁盘系统的优化策略:顺序读写(100MB)与随机读写(<1MB)
5. 分布式文件系统与本地文件系统
分布式文件系统建立的基础:建立在虚拟机的操作系统之上,不用直接面对磁盘
分布式文件系统中的地址:先定位到一台host
分布式文件系统的本质的功能:将一个以目录树表达的文件翻译成一个具体的节点,而到磁盘的定位则可以交给本地文件系统去做
6. 最简单的分布式文件系统NFS(网络文件系统)
读写命令->VFS(本地)->NFS clinent->NFS server->VFS(服务器)
NFS:将目录定位到服务器上(只有一台服务器)
NFS文件系统的扩展:AFS文件系统
AFS:定位到一个服务器
7. Google文件系统
应用需求:
搜索引擎:存储互联网容量的数据、支持数据快速写入、支持查询、建立倒排索引、对网页数据进行排序
目标:
文件系统(目录树、文件读写),支持读写非常大的文件
充分利用资源(负载均衡、扩展性)
容错(不能因为少数的节点出错就停止)
系统简洁:易于控制
基本设计:
数据块:64MB,远大于一般的文件系统
性能设计:依据全局动态信息,负载动态调整
可靠性:副本的方式保存在多个节点中(一般3个节点)
系统设计简洁:通过单个节点来保护文件系统的元数据(主节点master)
结构:
API(File name、chunk index)
主服务器:文件系统命名空间,file->(chunk1,chunk2、...),chunk index->h1、h2、h3(存储服务器)
主服务器(chunk handle、chunk locations)返还给应用程序,应用程序与对应的chunk服务器通信
性能问题:
块服务器:
负载均衡问题:master服务器收集信息,均衡分配;对于热点访问,增加副本数目
扩展性:加一个服务器,更新主服务器
主服务器:
容量:64MB块数据->64B块信息;10PB->10GB(可以存储在内存中)
可靠性问题:
块服务器:副本恢复(服务器上的数据块并行恢复)
主服务器:
内存出错:日志的方式保存在硬盘中、定期保存时间点(最新的数据)
硬盘出错:影子服务器
一致性:
三副本一致性的基本要求
基于租期以及主要副本的顺序定义:master决定主要副本(租期)、主要副本(决定操作顺序)
放松的一致性:
Append:Atomic、不用知道位置(爬虫)
一致的:文件的三个副本一致
明确的:反应了客户端的操作
POSIX兼容性:
GFS不是标准的文件系统,与标准的POSIX文件系统并不兼容
追加了append操作
放松了一致性要求
删除数据不是直接从本地文件系统中删除,而是通过垃圾收集的方法