并行系统Parallelism System(四)
GFS (Google File System) 是一个非常重要的分布式文件系统
-
什么是 GFS?
GFS 就是一个可以运行在由成千上万台廉价服务器组成的集群上,能够提供高吞吐量、高容错性、可伸缩的分布式文件系统
-
GFS解决什么问题?
- 组件故障是常态 (Component Failures are the Norm):
- 文件是巨大的 (Files are Huge):
- 主要访问模式是追加写入和顺序读取 (Most Files are Mutated by Appending, and Read Sequentially):
- 应用程序和文件系统 API 的协同设计 (Co-design of Applications and File System API):
GFS 的核心架构 (Core Architecture)
GFS采用了一种简化的Master-Worker(主-从)架构,针对文件系统存储的特性进行了优化
GFS集群主要由三种实体组成:
- 一个Master(主服务器)
- 角色:GFS集群的唯一协调者,不存储实际的文件数据,只存储和管理文件系统的元数据(Metadata)
- 元数据包括:
- 文件和 Chunk 的命名空间 (Namespace): 文件的层级结构(目录、文件名)
- Chunk 到 Chunkhandle 的映射: 每个文件被逻辑上分割成多个固定大小的 Chunk (块)(默认 64MB),每个 Chunk 都有一个全球唯一的 64 位 Chunkhandle。Master 维护文件到其 Chunkhandle 列表的映射
- Chunkhandle 到 Chunk Server 位置的映射: Master 知道每个 Chunk 的所有副本存储在哪些 Chunk Server 上。由于 Chunk Server 会出现故障,Master 会通过心跳等机制定期更新这些信息
- 多个Chunk Server(数据块服务器)
- 存储实际的文件数据 Chunk。它们通常是廉价的商用服务器,每个 Chunk Server 存储数十到数百个 Chunk
- 存储 Chunk: 在本地磁盘上以 Linux 文件系统的普通文件形式存储 Chunk
- 数据读写: 根据 Master 的指令,为客户端提供 Chunk 的读写服务
- 多个客户端 (Clients):
- 应用程序通过 GFS 客户端库来访问 GFS
- 与 Master 通信: 向 Master 查询文件的元数据(如文件由哪些 Chunk 组成、每个 Chunk 存储在哪个 Chunk Server 上)
- 与 Chunk Server 通信: 直接与 Chunk Server 通信来读写实际的 Chunk 数据。客户端不会缓存元数据,但会缓存 Chunk 的位置信息
GFS的基本读写流程概览:
读取文件:
- 客户端查询 Master: 客户端向 Master 发送请求,提供文件名和要读取的数据的偏移量
- Master 返回 Chunk 信息: Master 根据文件名和偏移量,计算出对应的 Chunkhandle,并返回该 Chunk 的 Chunkhandle 和所有存储该 Chunk 副本的 Chunk Server 的位置信息给客户端
- 客户端直接读取 Chunk Server: 客户端选择一个最近的 Chunk Server,直接向其发送请求,请求读取指定 Chunkhandle 和偏移量的数据
- Chunk Server 返回数据: Chunk Server 从本地磁盘读取数据并返回给客户端
写入文件 (Writing a File):
- 客户端查询 Master: 客户端向 Master 发送请求,提供文件名和要写入的数据。Master 返回该 Chunk 的 Chunkhandle 和一个Primary Chunk Server (主 Chunk 服务器) 的地址,以及所有存储该 Chunk 副本的 Secondary Chunk Server 的地址。Master 通过租约 (Lease) 机制来指定 Primary
- 客户端推送数据到所有副本: 客户端不直接写入 Primary,而是将数据流式推送 (push) 到所有 Chunk Server(包括 Primary 和 Secondary),数据以管道 (pipeline) 的方式传输,以优化带宽利用
- Primary 协调写入: 数据到达所有副本后,客户端向 Primary 发送写入指令。Primary 接收到指令后,会为写入操作分配一个顺序号,并将指令(包括顺序号)转发给所有 Secondary Chunk Server
- 所有副本执行写入: 所有 Chunk Server(包括 Primary)都按照相同的顺序号执行写入操作
- 返回确认: 当所有副本都完成写入后,Secondary Chunk Server 向 Primary 发送确认。Primary 收到所有 Secondary 的确认后,向客户端返回最终确认