【问题标题】:Maintaining state between two machines维护两台机器之间的状态
【发布时间】:2009-06-04 09:54:02
【问题描述】:
我们有两个用于控制关键系统的工业控制器。这个想法是,在一个控制器发生故障时,另一个控制器将自动接管。为确保无缝切换,每个备用控制器都必须始终镜像在线控制器的状态。
我们有一个解决方案,它的编码和文档都很差。问题是,是否有一种通用的设计模式可以实现这样的系统或开源软件来实现类似的事情,它们可用于创建可用于控制器或 PC 的通用解决方案,并且可以扩展以允许任意数量的控制器作为备用程序。
【问题讨论】:
标签:
session-state
embedded-control
【解决方案1】:
方法是“缓存一致性”。商业产品——例如Tangosol——这样做。
另一种方法是企业服务总线 (ESB) 或面向服务的架构 (SOA) 的轻量级版本。几乎所有的 SOA 供应商都有这方面的产品。我会从 Tibco 开始,它有一个轻量级的组件集供您使用。
由于 SOA 并不那么难,您可以使用 HTTP 协议自行开发,这样一个控制器就可以将状态 POST 到它的影子控制器。
【解决方案2】:
故障转移和透明故障转移是有区别的。你真的有透明故障转移的要求吗?如果是这样,您最终将为此付出代价(无论是成本还是复杂性)。
话虽如此,请查看Buddy Replication 上的这篇帖子,以获得解决问题的优雅方法。
【解决方案4】:
控制实时关键系统的传统方法是在lockstep 中运行两个单元。多年来,Tandem 一直在使用这种技术构建一些令人印象深刻的容错机器。
但是,锁步在很大程度上是一种硬件级别的解决方案;我认为您不能纯粹在软件级别实现经典锁步。或者至少,不是直截了当的。也许使用通过交换矢量时钟或类似螺旋桨式的东西同步的状态机?
【解决方案5】:
航天飞机的计算机也有类似的情况。在那种情况下,他们使用了 5 台计算机,如果其中一台计算机迟到或与其他计算机不同,则它(本质上)被选为离岛。
在您的情况下,您如何确定哪个控制器坏了?判断机是否也考虑单点故障?
两个控制器之间可用的通信级别是多少?共享内存、以太网,还是更慢的东西?
两者之间的状态信息变化有多快?
是否可以向两个控制器提供相同的信息,并且两个控制器是否会计算相同的状态转换?