我们有两个工业控制器用于控制关键系统。这个想法是,当一个控制器发生故障时,另一个控制器将自动接管。为确保交换无缝,每个备用控制器必须始终镜像在线控制器的状态。
我们有一个解决方案,编码很差并且有文档记录。问题是,是否有一个通用的设计模式实现了这样一个系统或开源软件,实现了类似的东西,可以用来创建一个可用于控制器或PC的通用解决方案,并可以扩展到允许任何数量的控制器充当备用例程。
答案 0 :(得分:1)
接近是“缓存一致性”。商业产品 - 例如Tangosol - 就是这样做的。
另一种方法是轻量级的企业服务总线(ESB)或面向服务的体系结构(SOA)。几乎所有SOA供应商都有此产品。我从Tibco开始,它有一个可用于此的轻量级组件集。
由于SOA不是 ,所以你可以使用HTTP协议自行推送,这样一个控制器就可以将POST状态发送给它的影子控制器。
答案 1 :(得分:1)
故障转移和透明故障转移之间存在差异。你真的有透明故障转移的要求吗?如果是这样,你最终会为此付出代价(成本和复杂性)。
话虽如此,请查看Buddy Replication上的这篇文章,以找到问题的优雅解决方案。
答案 2 :(得分:0)
标准的Master-Slave模式使用了我几乎所有支持集群,分布式体系结构和复制(http://en.wikipedia.org/wiki/Database_replication)的DBMS。
所以,基本上在你的情况下你可以让Master机器保持状态,并且坐在那里的奴隶什么也不做,除了从主人的状态更新自己的状态。如果主设备发生故障,从设备看到主设备不再存在,并且可以接管状态控制,主设备只有在从备用设备更新其自身状态后才会再次使用(其状态为主人没有活动)。
答案 3 :(得分:0)
控制实时关键系统的传统方法是在lockstep中运行两个单元。 Tandem多年来一直在使用这种技术构建一些非常令人印象深刻的容错机器。
但是,lockstep是一个非常硬件级的解决方案;我认为你不能纯粹在软件层面实现经典的锁步。或者至少,不是直截了当。也许使用通过交换矢量时钟同步的状态机或类似螺旋桨头的东西?
答案 4 :(得分:0)
航天飞机计算机存在类似情况。在那种情况下,他们使用了5台计算机,如果一台机器迟到或与其他机器不同,那么(实质上)就是从岛上投票。
在您的情况下,您如何确定哪个控制器坏了?确定机器是否也考虑单点故障?
两个控制器之间的通信级别是多少?共享内存,以太网还是更慢的东西?
两者之间的状态信息变化有多快?
是否可以向两个控制器提供相同的信息,并且两个控制器是否都会计算相同的状态转换?
答案 5 :(得分:-1)
也许是共享的SQLite数据库或类似的东西?