0

我有 x 台机器,我想选择 1 来完成特定的工作(主要机器)。我有一个数据库,它是这些机器拥有的唯一共享资源,并且没有机器间通信机制。

为了选择一台机器,我正在考虑向数据库写入一个值,然后选择先成功的那个(比如 M1)。M1 定期更新数据库以表示它还活着。当 M1 死机时,其他机器看到 M1 最近没有更新 DB,将尝试写入 db 以承担主要机器角色。

我可以让机器在任何给定时间点写入 db 什么值,所以每台机器都尝试写入相同的值?如果所有机器的时钟都同步,我可能会选择 YYMMDDHHMM。但情况可能并非如此。

任何指针/想法?

4

2 回答 2

1

您可以使用 DBMS 的功能来查询服务器本身的时间,以遵循您在此处概述的方法。

为了做到这一点,您必须注意一些问题:

  • 在测试当前worker节点的活跃度时,必须在表上获取写锁,以确保worker活跃度的测试和作业的声明作为一个原子动作完成。这避免了多个工人同时要求。
  • 每当当前工作人员更新表以断言其活跃性时,它必须遵循相同的锁定机制以检测任何其他工作人员接管工作的情况
  • 为了知道其他工人已经接管了这项工作,您需要提供某种身份证明,以便可以看到当前正在从事这项工作的人

这些只是一般性的评论,因为从您的描述中,您并不清楚您希望如何详细地实现该算法。

于 2012-08-03T17:57:23.133 回答
1

根据您的数据库为您提供的锁语义,以及它在检测失败客户端方面的能力,每台机器尝试获取一个通用的排他锁可能就足够了。获得独占锁的机器是领导者。

于 2012-08-03T18:41:02.977 回答