【发布时间】:2012-11-14 20:08:12
【问题描述】:
我有一个针对 RDBMS 的作业处理分析服务,由于需要复杂的缓存和缓存更新逻辑,因此它需要是高可用性集群中的单例。作业以 JMS 消息的形式出现(通过 ActiveMQ)。它是托管在带有 Web 前端的 HA Tomcat 集群中的应用程序的一部分。
问题是,如果正在运行的节点发生故障,服务本身需要能够在几秒钟内恢复。故障可能意味着系统关闭或 CPU 速度变慢 - 即如果节点在 CPU 延迟后恢复,但处理已移交,则无法继续。
根据经验,这里最合适的解决方案是什么:
- 在每个作业开始之前基于数据库的锁和锁检查(我无法在这里轻松提出防弹解决方案 - 有什么建议吗?)
- 某种Paxos算法?您是否知道任何用于此目的的苗条框架,因为算法本身需要时间才能正确处理,然后进行 QA?
- 还有什么?
我不介意故障恢复是否缓慢,但我希望尽量减少每个作业的开销。
一些额外的背景:工作不涉及从数据库中读取数据,使用各种算法对其进行按摩(有点类似于寻找最短路线)并为不同的参与者提供最佳解决方案以继续前进。 Actor 与现实世界交互并返回一些反馈,基于这些后续步骤由同一个作业处理器优化。
【问题讨论】:
-
可能是hazelcast中的分布式锁?
-
澄清一下:集群中的一个节点执行“单例”作业,所有其他节点都处于“从”模式?如果一个节点发生故障,另一个节点必须恢复作业的状态并继续执行?
-
@home:正确。在服务方面,N-1 个节点处于从属模式。它们以负载平衡的方式提供网页,但不处理作业。
-
JBoss 中当然有 HASingleton,但我想要更轻量级的东西。
-
@alexvetter - 我正在研究基于 hazelcast 的解决方案。一旦我得到正确的答案,我会发布一个答案。