The Google File System摘要GFS 是一个可扩展的分布式文件系统,用于大型分布式数据密集型应用上 。它可以运行在便宜的普通硬件上,提供了高性能和一定的容错性 。
1. 分布式文件系统介绍GFS 与过去的分布式文件系统有很多相似之处,如性能、扩展性、可靠性和高可用性 。但对 GFS 的设计是由我们对应用负载和技术环节的探索所驱动的,它与之前的文件系统还是有设计上的明显区别 。
我们考虑下面一些设计分布式文件系统时的关键点:
- 首先,组件出错是一个普遍情况,而不是异常事件 。我们几乎可以确定在一个大型文件系统中,有一部分机器不可用 , 一部分机器无法从错误中恢复 。造成错误的原因可能有:
- 应用程序或操作系统的 bug 。
- 人为错误 。
- 磁盘、内存、网络等的错误 。
- 等等 。
- 其次,文件是巨大的 。每个文件通常包含很多对象,例如网页文档 。当我们经常使用由数十亿个对象组成的、大小达到许多个 TB 且依然在快速增长的数据集时,即使文件系统不拒绝这样的需求,我们也必须重新审视设计的假设和参数,例如 IO 操作和存储块的大小 。
- 第三,大多数文件通过追加数据而不是覆盖数据来进行操作 , 文件的随机写事实上并不存在 。这些文件写入后只用作读需求,且经常只是顺序读,各种数据共享这些属性 。
- 一些组成了数据仓库,用于供数据分析程序使用;
- 一些是正在运行的程序连续产生的数据流;
- 一些是档案资料;
- 一些是存储在一台机器上并在另一台机器上处理的中间数据(如 MapReduce 的中间键值对)
- 第四,应用程序和文件系统 API 在设计上的协作提高了整个系统的灵活性,从而优化了整个系统 。例如我们放松了 GFS 在一致性上的要求,这大大简化了文件系统,同时没有为应用程序引入额外的负担 。我们还采用了原子性的追加操作,以此使多个用户可以同时对一个文件进行追加操作,但又不用带来额外的同步开销 。
2. 设计概要2.1 设想在根据需求设计文件系统的过程中,我们也会依照一些挑战和机会并存的假设进行设计 。在第一节提到的一些事实的基础上,我们在细节上展示我们的一些假设:
- 系统是由许多廉价的、普通的、易出错的组件组成的 。它必须有不间断的自我监控、探测、容错,以及组件错误状态的快速恢复 。
- 系统存储了适量的大文件 。我们期望有几百万的文件 , 每个文件通常是 100MB 或者更大 。GB 级别的文件是很常见的,并且能够有效的进行管理 。小文件必须被支持,但是我们无需对它们进行优化 。
- 工作负载主要由两种读操作组成:大规模的流读取和小规模的随机读取 。在大规模的流读取中,单个的操作通常会读几百 KB 的数据,更常见的是 1MB 或者更多的数据 。来自同一个客户端的连续操作通常读取一个文件的一个连续范围 。小规模的随机读取通常在任意的位置读取几 KB 的数据 。追求性能的应用通过批处理和排序小规模的读操作 , 用以顺序的读取文件,而不是在读取过程中前后移动 。
- 工作负载同样还有很多大量的、序列写操作,它们将数据追加到文件末尾 。一般操作的大小与相应的读操作相近 。一旦写入,文件将很少再次改变 。在文件任意位置进行的小规模的写操作虽然是支持的,但效率很低 。
- 系统必须是高效的,这里的高效是指有很多客户端能够同时对一个文件进行数据追加 。我们的文件通常用于生产者-消费者队列或者多路合并 。运行在不同机器上的数百个生产者,将并发地对一个文件进行数据追加,使用最小同步开销的原子化操作是很有必要的 。这个文件可能会在以后被读?。蛘哒谕北灰桓鱿颜叨寥?。
- 持续的高带宽比低时延更重要 。大多数目标应用更看重大量地、高效地处理数据,而很少有应用对单个的读或写操作有严格的响应时间要求 。
推荐阅读
- JAVA的File对象
- Codeforces 1670 E. Hemose on the Tree
- 二 沁恒CH32V003: Ubuntu20.04 MRS和Makefile开发环境配置
- 驱动开发:内核监控FileObject文件回调
- 齐博X1-栏目的调用2
- Blazor组件自做十一 : File System Access 文件系统访问 组件
- How to get the return value of the setTimeout inner function in js All In One
- System.IO.FileSystemWatcher的坑
- Docker | dockerfile构建centos镜像,以及CMD和ENTRYPOINT的区别
- prometheus监控实战