【问题标题】:Have program execution switch between computers/servers在计算机/服务器之间进行程序执行切换
【发布时间】:2017-07-15 00:09:32
【问题描述】:

我有两台服务器和一个我想在它们上运行的程序(不一定必须同时)。

我们称一台服务器为“SA”,另一台为“SB”。

SB 是 SA 的备份,我希望当我的程序在 SA 上执行时,如果 SA 失败,那么程序将立即从中断处继续并继续在 SB 上执行。

我能做到这一点的最简单方法是什么?

【问题讨论】:

  • 您必须将数据保存在共享位置。然后,也许 SB 会监视数据库,如果 1 分钟(或任何间隔时间)没有写入某些内容,它将启动并读取数据库以找出它正在处理的内容。
  • 你不能。你的期望是不现实的。您可以在第二台计算机上运行应用程序并使其从第一台计算机加载状态,但它们不能无缝地执行彼此的代码。

标签: windows server alternate


【解决方案1】:

可能有很多方法可以做到这一点,但我会使用独占文件锁来做到这一点。要做到这一点,您需要两台服务器之间有足够的网络连接,它们都可以打开一个文件进行写入。

您的基本算法(伪代码)如下所示:

File f;
while (true) {
    myTurn = false
    try {
        Open Network file for writing
        myTurn = true;
    } catch (IOException e) {
        // not logging anything because this is expected.
        // you might log that you tried maybe
        myTurn = false;
    }
    if ( myTurn ) {
        Do all of your actual work here.
        loop many times if that's what you're doing.  
        don't exit this bit until your server wants to shut down
          (or crashes).
        But don't close the file
    }
}

基本上,您的应用会尝试以独占方式打开文件。

如果打不开,说明另一台服务器被锁定,所以这台服务器应该保持安静。

如果它可以打开文件,那么其他服务器没有运行,这台服务器应该可以工作。

为此,“工作”例程绝对不能挂起 - 只要其他服务器的进程处于活动状态,它就会挂起该网络文件锁,这是绝对必要的。所以如果另一台服务器陷入无限循环,你就倒霉了。

请记住,两台服务器都试图打开同一个网络文件。如果他们试图打开一个本地文件,它是行不通的。

这个问题有一个你可以重复使用的例子: Getting notified when a file lock is released

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多