MIT 6.5840 分布式系统

333 阅读10分钟

根据下面的资料完成课程内容:

Lecture 01 Introduction

在上这节课的同时,可以看一下论文:

Drivens and Challenges 基本介绍

  • 解决一个问题如果能不用分布式系统,那就尽可能在一台计算机上解决。但是随着大数据的发展,分布式系统越来越重要。
  • 人们通常希望获得更高的计算性能,能有大量的硬盘和大量的内存,同时系统还能够提供容错能力和安全性,希望系统能够跨越比较大的空间距离,这一切的需求,都推动着分布式系统的发展。
  • 分布式系统也遇到了很多挑战:
    • 如何保证分布式系统正确运行?(异步同步问题、分布式系统多个模块之间的正确运行、容错和安全性)
    • 如何保证分布式系统能够有较高的性能?

Abstraction and Implementation 基础架构

  • 基础架构(三大部分):存储、通信、计算。
  • 实现的一些工具:RPC(remote procedure call)、thread、concurrency control

scalability 可扩展性(重要话题:性能)

这里说的可扩展性并不是为了方便维护的可扩展性,而是指性能的可扩展性。

  • 指的是,如果我用一台计算机解决了一些问题,当我买了第二台计算机,我只需要一半的时间就可以解决这些问题,或者说每分钟可以解决两倍数量的问题。两台计算机构成的系统如果有两倍性能或者吞吐,就是我说的可扩展性。
  • 假设我们建立了一个常规网站,一般来说一个网站有一个 HTTP服务器,还有一些用户和浏览器,用户与一个基于Python或者PHP的web服务器通信,web服务器进而跟一些数据库进行交互。
  • 你发现可能有一亿人要登录你的网站。为了提升性能,你要做的第一件事情就是购买更多的web服务器,然后把不同用户分到不同服务器上。这样,一部分用户可以去访问第一台web服务器,另一部分去访问第二台web服务器。现在,数据库突然成为了瓶颈,并且增加更多的web服务器都无济于事了。
  • 所以,就需要分布式的存储系统,来为这么多服务器满足数据查询需求,从而提高系统的性能。

Availibility and Recoverability 可用性&可恢复性(重要话题:容错)

  • 如果你只使用一台计算机构建你的系统,那么你的系统大概率是可靠的。因为一台计算机通常可以很好的运行很多年,比如我办公室的服务器已经运行很多年而没有故障,计算机是可靠的,操作系统是可靠的,明显我办公室的电源也是可靠的。所以,一台计算机正常工作很长时间并不少见。

  • 然而如果你通过数千台计算机构建你的系统,那么即使每台计算机可以稳定运行一年,对于1000台计算机也意味着平均每天会有3台计算机故障。

    • 所以,大型分布式系统中有一个大问题,那就是一些很罕见的问题会被放大。例如在我们的1000台计算机的集群中,总是有故障,要么是机器故障,要么是运行出错,要么是运行缓慢,要么是执行错误的任务。
    • 一个更常见的问题是网络。
  • 可用性的定义:某些系统经过精心的设计,这样在特定的错误类型下,系统仍然能够正常运行,仍然可以像没有出现错误一样,为你提供完整的服务。

  • 可恢复性的定义:如果出现了问题,服务会停止工作,不再响应请求,之后有人来修复,并且在修复之后系统仍然可以正常运行,就像没有出现过问题一样。

    • 这是一个比可用性更弱的需求,因为在出现故障到故障组件被修复期间,系统将会完全停止工作。但是修复之后,系统又可以完全正确的重新运行,所以可恢复性是一个重要的需求。
  • 因为错误总会发生,必须要在设计时就考虑,系统能够屏蔽错误,或者说能够在出错时继续运行,即使在出错后系统崩溃了,也具备可恢复能力使得恢复之后与原来状态一样。可以参考下面的做法:

    1. 为第三方应用开发人员提供方便的抽象接口,我们的确也需要构建这样一种基础架构,它能够尽可能多的对应用开发人员屏蔽和掩盖错误。这样,应用开发人员就不需要处理各种各样的可能发生的错误。
    2. 非易失存储(non-volatile storage,类似于硬盘)。这样当出现类似电源故障,甚至整个机房的电源都故障时,我们可以使用非易失存储,比如硬盘,闪存,SSD之类的。我们可以存放一些checkpoint或者系统状态的log在这些存储中,这样当备用电源恢复或者某人修好了电力供给,我们还是可以从硬盘中读出系统最新的状态,并从那个状态继续运行。(但是磁盘的备份会影响到性能)
    3. 对于容错的另一个重要工具是复制(replication),但是复制两个备份的时候,又要保证备份之间是一致的。

Consistency 一致性(重要话题:数据一致)

数据的一致性指的是存储的读写一致性。 - 更多内容需要课外研究。

Lecture 03 GFS

Introduction 为什么分布式中最重要是存储系统设计

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

之所以要说存储,原因是,存储是一种关键的抽象。你可以想象,在分布式系统中,可能有各种各样重要的抽象(分布式系统的抽象到底是什么?),但是实际上,简单的存储接口往往非常有用且极其通用。

所以,构建分布式系统大多都是关于如何设计存储系统,或是设计其它基于大型分布式存储的系统。所以我们会更加关注如何为大型分布式存储系统设计一个优秀的接口,以及如何设计存储系统的内部结构,这样系统才能良好运行。

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

  • 为什么分布式存储系统会如此之难,以至于你需要做大量的工作才能让它正确工作?
    • 最初人们设计大型分布式系统或大型存储系统出发点通常是,他们想获取巨大的性能加成,进而利用数百台计算机的资源来同时完成大量工作。因此,性能问题就成为了最初的诉求。 之后,很自然的想法就是将数据分割放到大量的服务器上,这样就可以并行的从多台服务器读取数据。我们将这种方式称之为分片(Sharding)
    • 因为机器会出现故障(随着机器越来越多,不出故障的概率越来越小)。如果你在成百上千台服务器进行分片,你将会看见常态的故障。如果你有数千台服务器,那么总是会有一台服务器宕机,每天甚至每个小时都可能会发生错误。所以,我们需要自动化的方法而不是人工介入来修复错误。我们需要一个自动的容错系统,这就引出了容错这个话题(fault tolerance)
      • 实现容错最有用的一种方法是使用复制,只需要维护2-3个数据的副本,当其中一个故障了,你就可以使用另一个。所以,如果想要容错能力,就得有复制(replication)。
      • 但是复制两份数据,又引出了新的问题:数据不一致。通过聪明的设计,你可以避免不一致的问题,并且让数据看起来也表现的符合预期。但是为了达到这样的效果,你总是需要额外的工作,需要不同服务器之间通过网络额外的交互,而这样的交互会降低性能。所以如果你想要一致性,你的代价就是低性能。但这明显不是我们最开始所希望的。

Design Goals of GFS 设计目标

GFS设计目标:

  • Big, Fast
  • Global 被赋予权限的所有人都能看到这个存储系统
  • Sharding 分片,能保证存储容量大于单个服务器
  • Auto Recovery 出现小错误时,系统能够自动修复

但是GFS被设计在一个数据中心中使用(single data center),理论上数据备份应该在空间上分布越远越好。

GFS并不面向普通的用户,这是一个Google内部使用的系统,供Google的工程师写应用程序使用。所以Google并没有售卖GFS,它或许售卖了基于GFS的服务,但是GFS并不直接面向普通用户。

存储系统也分很多不同的领域。在存储系统中有一个完全不同的领域,这个领域只对小份数据进行优化。例如一个银行账户系统就需要一个能够读写100字节的数据库,因为100字节就可以表示人们的银行账户。但是GFS不是这样的系统,GFS是为TB级别的文件而生,在各个方面对大型的顺序文件读写做了定制。并且GFS只会顺序处理,不支持随机访问。某种程度上来说,它有点像批处理的风格。GFS并没有花费过多的精力来降低延迟,它的关注点在于巨大的吞吐量上,所以单次操作都涉及到MB级别的数据。

同时,论文也提出了一个当时非常异类的观点:存储系统具有弱一致性也是可以的。