2017-07-15 48 views
0

我有两台服务器和一个程序,我想对他们(不一定同时)之间运行程序执行开关。拥有电脑/服务器

我们叫一个服务器“SA”,另一个“SB”。

SB是SA备份,我想,虽然我的计划是在SA执行,如果SA失败,则程序将立即拿起它离开的地方,并继续执行SB。

我可以完成这个最简单的方法是什么?

+0

你不得不坚持在共享位置数据。然后,SB可能会监视数据库,如果有一分钟内没有写入内容(或者不管间隔时间是多少),它会启动并读取数据库以确定它正在处理的内容。 – mrogers

+2

你不能。你的期望是不现实的。您可以在第二台计算机上运行应用程序,并从第一台开始载入状态,但无法无缝执行对方的代码。 –

回答

0

可能有一堆的,这可以做的方式,但我使用独占文件锁定做到这一点。要做到这一点,您需要两台服务器之间足够的网络连接,这两台服务器都可以打开要写入的文件。

你的基本算法(伪)是这样的:

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

相关问题