Files
MIT6.824/lecture-01-introduction/1.5-rong-cuo-fault-tolerance.md
2022-01-25 02:41:31 +00:00

5.5 KiB
Raw Blame History

1.5 可用性Availability

另一个重要的话题是容错。

如果你只使用一台计算机构建你的系统那么你的系统大概率是可靠的。因为一台计算机通常可以很好的运行很多年比如我办公室的服务器已经运行很多年而没有故障计算机是可靠的操作系统是可靠的明显我办公室的电源也是可靠的。所以一台计算机正常工作很长时间并不少见。然而如果你通过数千台计算机构建你的系统那么即使每台计算机可以稳定运行一年对于1000台计算机也意味着平均每天会有3台计算机故障。

所以大型分布式系统中有一个大问题那就是一些很罕见的问题会被放大。例如在我们的1000台计算机的集群中总是有故障要么是机器故障要么是运行出错要么是运行缓慢要么是执行错误的任务。一个更常见的问题是网络在一个有1000台计算机的网络中会有大量的网络电缆和网络交换机所以总是会有人踩着网线导致网线从接口掉出或者交换机风扇故障导致交换机过热而不工作。在一个大规模分布式系统中各个地方总是有一些小问题出现。所以大规模系统会将一些几乎不可能并且你不需要考虑的问题变成一个持续不断的问题。

所以,因为错误总会发生,必须要在设计时就考虑,系统能够屏蔽错误,或者说能够在出错时继续运行。同时,因为我们需要为第三方应用开发人员提供方便的抽象接口,我们的确也需要构建这样一种基础架构,它能够尽可能多的对应用开发人员屏蔽和掩盖错误。这样,应用开发人员就不需要处理各种各样的可能发生的错误。

对于容错有很多不同的概念可以表述。这些表述中有一个共同的思想就是可用性Availability。某些系统经过精心的设计这样在特定的错误类型下系统仍然能够正常运行仍然可以像没有出现错误一样为你提供完整的服务。

某些系统通过这种方式提供可用性。比如,你构建了一个有两个拷贝的多副本系统,其中一个故障了,另一个还能运行。当然如果两个副本都故障了,你的系统就不再有可用性。所以,可用系统通常是指,在特定的故障范围内,系统仍然能够提供服务,系统仍然是可用的。如果出现了更多的故障,系统将不再可用。

除了可用性之外另一种容错特性是自我可恢复性recoverability。这里的意思是如果出现了问题服务会停止工作不再响应请求之后有人来修复并且在修复之后系统仍然可以正常运行就像没有出现过问题一样。这是一个比可用性更弱的需求因为在出现故障到故障组件被修复期间系统将会完全停止工作。但是修复之后系统又可以完全正确的重新运行所以可恢复性是一个重要的需求。

对于一个可恢复的系统,通常需要做一些操作,例如将最新的数据存放在磁盘中,这样在供电恢复之后(假设故障就是断电),才能将这些数据取回来。甚至说对于一个具备可用性的系统,为了让系统在实际中具备应用意义,也需要具备可恢复性。因为可用的系统仅仅是在一定的故障范围内才可用,如果故障太多,可用系统也会停止工作,停止一切响应。但是当足够的故障被修复之后,系统还是需要能继续工作。所以,一个好的可用的系统,某种程度上应该也是可恢复的。当出现太多故障时,系统会停止响应,但是修复之后依然能正确运行。这是我们期望看到的。

为了实现这些特性,有很多工具。其中最重要的有两个:

  • 一个是非易失存储non-volatile storage类似于硬盘。这样当出现类似电源故障甚至整个机房的电源都故障时我们可以使用非易失存储比如硬盘闪存SSD之类的。我们可以存放一些checkpoint或者系统状态的log在这些存储中这样当备用电源恢复或者某人修好了电力供给我们还是可以从硬盘中读出系统最新的状态并从那个状态继续运行。所以这里的一个工具是非易失存储。因为更新非易失存储是代价很高的操作所以相应的出现了很多非易失存储的管理工具。同时构建一个高性能容错的系统聪明的做法是避免频繁的写入非易失存储。在过去甚至对于今天的一个3GHZ的处理器写入一个非易失存储意味着移动磁盘臂并等待磁碟旋转这两个过程都非常缓慢。有了闪存会好很多但是为了获取好的性能仍然需要许多思考。
  • 对于容错的另一个重要工具是复制replication不过管理复制的多副本系统会有些棘手。任何一个多副本系统中都会有一个关键的问题比如说我们有两台服务器它们本来应该是有着相同的系统状态现在的关键问题在于这两个副本总是会意外的偏离同步的状态而不再互为副本。对于任何一种使用复制实现容错的系统我们都面临这个问题。lab2和lab3都是通过管理多副本来实现容错的系统你将会看到这里究竟有多复杂。