2009-09-16 56 views
1

通过重新启动计算机,路由器,程序和浏览器,您可以多久解决问题?或甚至通过重新安装操作系统或软件组件?快速重新启动技术,而不是保持良好状态(可用性和一致性)

当怀疑软件组件没有以正确的方式保持其状态时,这似乎是一种常见模式,那么通过重新启动组件就可以获得初始状态。

我听说亚马逊/谷歌有许多节点集群。每个节点的一个重要属性是它可以在几秒钟内重启。所以,如果其中一个失败了,那么将它返回到初始状态只是重新启动它的问题。

是否有任何语言/框架/设计模式在那里利用这种技术作为一流的公民?

编辑描述亚马逊背后的一些原则以及可用性总体原则和一致性的链接: http://www.infoq.com/presentations/availability-consistency

回答

2

这在嵌入式系统世界和电信行业中很常见。它在基于服务器的世界中不太常见。

有你可能感兴趣的一个研究小组,他们一直都在Recovery-Oriented Computing或“ROC”。 ROC的关键原则是任何程序都可以在启动后立即执行最清洁,最好,最可靠的状态。因此,在检测到故障时,他们宁愿重新启动软件,而不尝试从故障中恢复。

听起来很简单吧?那么,大部分的研究已经落实到了这个想法中。原因正是你和其他评论者指出的:操作系统重启太慢,无法成为可行的恢复方法。

ROC依赖于三个主要部分组成:

  1. 的方法,以尽早发现故障。
  2. 在保留系统其余部分的同时隔离故障组件的方法。
  3. 组件级重新启动。

ROC和典型的“夜间重启”方法之间真正的关键区别在于ROC是重启是反应的策略。我的意思是,大多数软件与一定程度的错误处理和恢复(投掷和捕捉,记录,重试循环等)ROC程序会检测出故障(异常)和立即退出写入。混合使用这两种模式只会让你陷入两个世界中最糟糕的境地 - 低可靠性和错误。

+0

@mtnygard。感谢链接:)。我不了解ROC的概念。 – 2009-09-25 05:54:09

1

嵌入式系统可能有一个检查站的功能,使每n毫秒,当前堆栈被保存。 内存在重新启动时(例如电池备份)是非易失性的,所以在开机时,会测试代码是否需要跳到旧的检查点,或者是否是新系统。

我会猜测亚马逊/谷歌使用了类似的技术(但更复杂)。

+0

嵌入式系统通常有相当长的时间来重启它们吗? (我想在这里或我的iPhone和黑莓) – ennuikiller 2009-09-16 20:15:13

+0

取决于他们如何编程。我写了一个系统,一直保持畅通 - 只要电池是好的,系统没有注意到故障。尽管如此,这与iPhone/Blackberry等应用程序/流程驱动系统通常是非常不同的方法。我怀疑ip/bb不会执行检查点功能......这是完全重新启动。是?没有/ – 2009-09-16 20:35:12

3

这实际上在Unix/Linux世界非常罕见。这些软件的设计(以及窗口)是为了保护自己免受恶劣行为的影响。我相信谷歌并不依靠硬重启来纠正不当行为的软件。我会说这种技术不应该被使用,如果有人说他们的软件恢复的最快途径,你应该寻找其他的东西!

+0

这是一个很好的观点,但也许我在我的问题中错误地加了口音。我acutaly有兴趣知道这个技术是否在其他层面上使用(不仅是操作系统),如果它被识别为设计模式。 – 2009-09-16 20:23:01

+0

+1。对我而言,重新启动并不是一种真正的模式,对于那些对真正发生的事情,真正的问题是什么以及如何解决这些问题毫无头绪的人来说,这是一种最后的尝试。实际上,重新启动并不是很常见的IMO(我已经看到许多重新启动只是因为操作系统补丁,这并不常见)。 – 2009-09-16 21:12:21

+0

如果我们谈论的是在单个(或少数)服务器上运行的系统,那么重新启动它当然不是一种模式,因为您需要停止所有操作。我听说过多年未重启的UNIX机器。 但是,如果您有一个由100个节点组成的集群,并且其中一些节点开始表现不佳,那么如果节点重新启动需要很长时间,那么您有可能在高负载下终止整个系统。 所以,我的实际问题是如果这种模式被识别并用于软件开发的其他领域,而不仅仅是在服务器/集群中。 – 2009-09-17 10:11:16

2

微控制器通常有一个看门狗定时器,必须每隔一段时间才会复位(通过一行代码),否则微控制器将复位。这使得固件不会陷入无限循环,等待输入等等。

未使用的内存有时会设置为导致复位或跳转到微控制器在启动时的相同位置的指令它被重置。如果以某种方式跳转到程序存储器外部的某个位置,这将重置微控制器。

1

虽然我无法想象设计模式本身,但以我的经验来看,这是开发人员“选择被打破”的结果。

我已经看到一个50用户的站点因为连接管理不佳而导致过度调用并且没有缓存,导致SQL Server企业版(750 MB数据库)和Novell服务器瘫痪。 Novell是总是根据开发人员的罪魁祸首,直到我们发现一个核心库中缺少“CloseConnection”调用。到那时,数千人在升级中花费了不成功的代价,以解决这一个缺失的代码行。

(为什么他们有企业版是超越我,所以不要问!)

1

如果你看一下脚本语言一样在Apache上运行PHP,每次调用开始一个新的进程。在基本情况下,进程之间没有共享状态,一旦调用完成,进程终止。

资源管理方面的优势不大,因为当进程完成时它们将被释放,并且对错误处理的需求减少,因为该进程被设计为快速失败并且不会处于不一致状态。

+0

+1好点,parkr :)! – 2009-09-24 11:37:54

1

我已经看到了它在应用层面的几个地方(一个应用程序重新启动本身,如果它的炸弹)。

我在应用级,其中服务从dBASE文件阅读开始读的时候X量后出错实施的模式。它会查找引发的特定错误,如果发现错误,则该服务会调用一个控制台应用程序来终止进程并重新启动该服务。这很糟糕,我讨厌它,但对于这种特殊情况,我找不到更好的答案。

,并承担记住,IIS有一个内置的功能,重新启动在一定条件下的应用程序池。

对于这个问题,重新启动服务是Windows上的任何服务作为服务时未采取行动的一个选项。