我已经聚集的应用程序,要求一个节点被指定为主。集群节点是追踪在一桌 nodeID, isMaster, lastTimestamp 列。

集群中每个节点将尝试成为一个主每 X 几秒钟内。节点可以仅仅成为一个主如果

  • 没有其他主节点
  • lastTimestamp 在当前的主节点是老年人通过 2*X

当上述条件之一是满足

  • 目前的主节点的 isMaster 应该被清除
  • 新的主节点的 isMaster 应当设置
  • 新的主节点的 lastTimestamp 应设定为"现在"的时间戳。

什么是的 (便携式)SQL statement实现上述没有可能性两个或更多的节点成为主?

有帮助吗?

解决方案

不是这种协调通常由DBMS本身,而不是由上运行的应用DBMS?我也可以设想的方式来做到这一点在DBMS我很熟悉,但不知道更多关于你的系统(这大概是使用共享盘,因此,所有节点看到同样的数据;还有大概是锁定的协议,防止并发访问的数据;它是一个用户进程的主节点上,定期更新lastTimestamp),就会很难有多大帮助。并且,作为杰米的爱指出,DBMS应该允许有多个进程的协调访问的有关记录的-主要的有关记录是当前的主人的记录。

[编辑:也许我读得太多的进入它。

单更新的发言已经做的差异更新关于两排表,以及必须失败,如果只有一两次更新是可能的。也就是说,它必须改变当前主要的非主,改变自己的记录,因此它是主人。一个问题是如何DBMS强制执行'仅一个可行的主人'的制约因素。让我们假设,作和声明作为一个整体将会失败,如果有一个问题-因为这是应该的。为什么人们常常忽略表的名字,甚至当他们提供的列名字?哦,表名下 ClusterControl.每个节点必须知道自己NodeID以某种方式;我用{MyNodeID}以指示中出现的SQL。

你需要一个单独的心跳更新:

 UPDATE ClusterControl
     SET lastTimestamp = CURRENT_TIMESTAMP
     WHERE NodeID = {MyNodeID};

在"抓住主的状况"的更新可能是:

UPDATE ClusterControl
    SET lastTimestamp = (CASE
                         WHEN NodeID = {MyNodeID} THEN CURRENT_TIMESTAMP
                         ELSE lastTimestamp END),
        isMaster      = (CASE
                         WHEN NodeID = {MyNodeId} THEN 'Y'
                         ELSE 'N' END)
    WHERE (NodeID  = {MyNodeID} AND isMaster = 'N') OR
          (NodeID != {MyNodeID} AND
           lastTimestamp < CURRENT_TIMESTAMP - INTERVAL '120' SECOND AND
           isMaster = 'Y'
          );

背后的理论'抓住主状况的最新版(设置条):

  • 该lastTimestamp领域的新的总体设定为目前的时间戳,但老师是不变的。
  • 该isMaster场改变为'Y'为新的主要'N'旧掌握。

背后的理论其中的条款是:

  • 只有改变的记录对于当前节点,如果它不是当前的主或记录的当前主节点时,这个节点不是目前的节点和时间戳是超过120秒("2*X"的问题)旧的。

因为有一个(可能是神话)的约束,以确保只有一个行具有"Y"旗帜,这应当失败,因为需要时主是最新的。

未经测试的SQL!

]

其他提示

我可以想象一下,一个解决方案的一个Oracle数据库,但我不知道它会便携式。为什么这需要一个单一的便携式SQL statement?大多数数据库允许表锁和交易,它允许你去做这种事在多个发言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top