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

4.4 KiB
Raw Permalink Blame History

3.1分布式存储系统的难点Why Hard

今天我们讨论一下GFS也就是The Google File System这篇论文。这门课程的主要内容是“大型存储”而GFS这是这门课里有关如何构建大型存储系统的众多案例学习的第一篇。

之所以要说存储原因是存储是一种关键的抽象。你可以想象在分布式系统中可能有各种各样重要的抽象可以应用在分布式系统中但是实际上简单的存储接口往往非常有用且极其通用。所以构建分布式系统大多都是关于如何设计存储系统或是设计其它基于大型分布式存储的系统。所以我们会更加关注如何为大型分布式存储系统设计一个优秀的接口以及如何设计存储系统的内部结构这样系统才能良好运行。通过阅读GFS论文我们可以开始了解到这是怎么做到的。

同时GFS论文也涉及到很多本课程常出现的话题例如并行性能、容错、复制和一致性。论文的内容也较为直观容易理解。论文本身也是一篇优秀的系统论文它从硬件到使用了GFS的软件都有讨论并且它也是一个成功的现实世界的设计。尽管这是在学术会议上发表的学术论文但是文章里介绍的东西GFS也相当成功并且在现实世界中使用了相当长的时间。所以我们知道我们今天讨论的是一个非常好的且有用的设计。

在讨论GFS之前我想聊一聊关于分布式存储系统做一些背景介绍。

首先 为什么分布式存储系统会如此之难,以至于你需要做大量的工作才能让它正确工作?我们从一个特殊的角度来理解,在这门课程的后面,这种理解角度也会出现。

人们设计大型分布式系统或大型存储系统出发点通常是,他们想获取巨大的性能加成,进而利用数百台计算机的资源来同时完成大量工作。因此,性能问题就成为了最初的诉求。 之后很自然的想法就是将数据分割放到大量的服务器上这样就可以并行的从多台服务器读取数据。我们将这种方式称之为分片Sharding

如果你在成百上千台服务器进行分片你将会看见常态的故障。如果你有数千台服务器那么总是会有一台服务器宕机每天甚至每个小时都可能会发生错误。所以我们需要自动化的方法而不是人工介入来修复错误。我们需要一个自动的容错系统这就引出了容错这个话题fault tolerance

实现容错最有用的一种方法是使用复制只需要维护2-3个数据的副本当其中一个故障了你就可以使用另一个。所以如果想要容错能力就得有复制replication

如果有复制那就有了两份数据的副本。可以确定的是如果你不小心它们就会不一致。所以你本来设想的是有了两个数据副本你可以任意使用其中一个副本来容错。但是如果你不够小心两个数据的副本就不是完全一致严格来说它们就不再互为副本了。而你获取到的数据内容也将取决于你向哪个副本请求数据。这对于应用程序来说就有些麻烦了。所以如果我们有了复制我们就有不一致的问题inconsistency

通过聪明的设计,你可以避免不一致的问题,并且让数据看起来也表现的符合预期。但是为了达到这样的效果,你总是需要额外的工作,需要不同服务器之间通过网络额外的交互,而这样的交互会降低性能。所以如果你想要一致性,你的代价就是低性能。但这明显不是我们最开始所希望的。

当然,这里并不是绝对的。你可以构建性能很高的系统,但是不可避免的,都会陷入到这里的循环来。现实中,如果你想要好的一致性,你就要付出相应的代价。如果你不想付出代价,那就要忍受一些不确定的行为。我们之后会在很多系统中看到这里介绍的循环。通常,人们很少会乐意为好的一致性付出相应的性能代价。