分布式恢复 - 可以在没有超时的情况下完成吗

时间:2015-04-08 16:18:50

标签: distributed-computing recovery distributed-system error-recovery

我们有一个邮件发件人应用程序,它在一个blob中接收一堆邮件,然后将所有这些邮件放入数据库。这可能需要长达十分钟。在此过程中,邮件的状态为BUILDING

完成后,状态变为READY

当服务器崩溃(当然不应该发生)并重新启动时,它会查找状态为BUILDING的所有邮件,并将其标记为ERROR。发生这种情况,因为我们从不想发送不完整的邮件。


现在我们想要使用第二台服务器进行扩展。上面的恢复策略在这里不起作用。

e.g。服务器1是BUILDING邮件,服务器2崩溃并重新启动。现在,服务器2将看到BUILDING邮件,并且不知道它是否已中止或是否在另一台服务器上运行。


那么分布式服务的最佳恢复策略是什么?

(我们考虑了一些超时机制,BUILDING服务器每隔几秒更新一次时间戳,当某个服务器重新启动时,它会检查是否有BUILDING个邮件没有&{ #39;已更新x分钟。此邮件很可能已中止。)


编辑:

我想要实现的目标:如果某个服务器重新启动(崩溃后或仅仅因为我们向群集添加了新的邮件服务器),它应该如果实际构建此特定邮件(由另一台服务器),则将邮件标记为ERROR

很高兴:如果这样做而无需存储服务器ID,因为这样就可以轻松添加和/或删除服务器。否则,将无法完全删除某些服务器,因为那时可能存在具有该特定服务器ID的BUILDING邮件。但是这个服务器被删除了,永远不会再次启动。虽然唯一可以将邮件设置为ERROR的服务器将会消失。

1 个答案:

答案 0 :(得分:1)

向状态跟踪添加两项内容:时间戳和服务器。

如果服务器启动并且看到任何处于建筑状态的东西,它就知道它失败了。相反,如果它启动并看到另一台服务器处于建筑状态的某些东西,它现在有了一些信息,它需要稍后查看以查看是否存在需要解决的问题。您需要担心多个服务器同时重新启动,因此您无法让服务器在启动时获取所有服务器的旧捆绑包。

或者您可以为您的操作系统使用群集服务。