Files
MIT6.824/lecture-03-gfs/3.4.md
2022-01-25 02:41:31 +00:00

5.3 KiB
Raw Permalink Blame History

3.4 GFS Master 节点

接下来看看GFS的大致架构这在论文的图1中也有介绍。

假设我们有上百个客户端和一个Master节点。尽管实际中可以拿多台机器作为Master节点但是GFS中Master是Active-Standby模式所以只有一个Master节点在工作。Master节点保存了文件名和存储位置的对应关系。除此之外还有大量的Chunk服务器可能会有数百个每一个Chunk服务器上都有1-2块磁盘。

在这里Master节点用来管理文件和Chunk的信息而Chunk服务器用来存储实际的数据。这是GFS设计中比较好的一面它将这两类数据的管理问题几乎完全隔离开了这样这两个问题可以使用独立设计来解决。Master节点知道每一个文件对应的所有的Chunk的ID这些Chunk每个是64MB大小它们共同构成了一个文件。如果我有一个1GB的文件那么Master节点就知道文件的第一个Chunk存储在哪第二个Chunk存储在哪等等。当我想读取这个文件中的任意一个部分时我需要向Master节点查询对应的Chunk在哪个服务器上之后我可以直接从Chunk服务器读取对应的Chunk数据。

更进一步我们看一下GFS的一致性以及GFS是如何处理故障。为了了解这些我们需要知道Master节点内保存的数据内容这里我们关心的主要是两个表单

  • 第一个是文件名到Chunk ID或者Chunk Handle数组的对应。这个表单告诉你文件对应了哪些Chunk。但是只有Chunk ID是做不了太多事情的所以有了第二个表单。
  • 第二个表单记录了Chunk ID到Chunk数据的对应关系。这里的数据又包括了
    • 每个Chunk存储在哪些服务器上所以这部分是Chunk服务器的列表
    • 每个Chunk当前的版本号所以Master节点必须记住每个Chunk对应的版本号。
    • 所有对于Chunk的写操作都必须在主ChunkPrimary Chunk上顺序处理主Chunk是Chunk的多个副本之一。所以Master节点必须记住哪个Chunk服务器持有主Chunk。
    • 并且主Chunk只能在特定的租约时间内担任主Chunk所以Master节点要记住主Chunk的租约过期时间。

以上数据都存储在内存中如果Master故障了这些数据就都丢失了。为了能让Master重启而不丢失数据Master节点会同时将数据存储在磁盘上。所以Master节点读数据只会从内存读但是写数据的时候至少有一部分数据会接入到磁盘中。更具体来说Master会在磁盘上存储log每次有数据变更时Master会在磁盘的log中追加一条记录并生成CheckPoint类似于备份点

有些数据需要存在磁盘上,而有些不用。它们分别是:

  • Chunk Handle的数组第一个表单要保存在磁盘上。我给它标记成NVnon-volatile, 非易失),这个标记表示对应的数据会写入到磁盘上。
  • Chunk服务器列表不用保存到磁盘上。因为Master节点重启之后可以与所有的Chunk服务器通信并查询每个Chunk服务器存储了哪些Chunk所以我认为它不用写入磁盘。所以这里标记成Vvolatile
  • 版本号要不要写入磁盘取决于GFS是如何工作的我认为它需要写入磁盘。我们之后在讨论系统是如何工作的时候再详细讨论这个问题。这里先标记成NV。
  • 主Chunk的ID几乎可以确定不用写入磁盘因为Master节点重启之后会忘记谁是主Chunk它只需要等待60秒租约到期那么它知道对于这个Chunk来说没有主Chunk这个时候Master节点可以安全指定一个新的主Chunk。所以这里标记成V。
  • 类似的租约过期时间也不用写入磁盘所以这里标记成V。

任何时候如果文件扩展到达了一个新的64MB需要新增一个Chunk或者由于指定了新的主Chunk而导致版本号更新了Master节点需要向磁盘中的Log追加一条记录说我刚刚向这个文件添加了一个新的Chunk或者我刚刚修改了Chunk的版本号。所以每次有这样的更新都需要写磁盘。GFS论文并没有讨论这么多细节但是因为写磁盘的速度是有限的写磁盘会导致Master节点的更新速度也是有限的所以要尽可能少的写入数据到磁盘。

这里在磁盘中维护log而不是数据库的原因是数据库本质上来说是某种B树b-tree或者hash table相比之下追加log会非常的高效因为你可以将最近的多个log记录一次性的写入磁盘。因为这些数据都是向同一个地址追加这样只需要等待磁盘的磁碟旋转一次。而对于B树来说每一份数据都需要在磁盘中随机找个位置写入。所以使用Log可以使得磁盘写入更快一些。

当Master节点故障重启并重建它的状态你不会想要从log的最开始重建状态因为log的最开始可能是几年之前所以Master节点会在磁盘中创建一些checkpoint点这可能要花费几秒甚至一分钟。这样Master节点重启时会从log中的最近一个checkpoint开始恢复再逐条执行从Checkpoint开始的log最后恢复自己的状态。