用于故障转移的分布式单件服务

时间:2016-04-21 09:22:40

标签: algorithm singleton distributed-system

我有一个抽象的问题。

我需要一个容错的服务。该服务一次只能在一个节点上运行。这是关键。

有两个连接的节点:A和B.

  • 如果A正在运行该服务,则B必须等待。
  • 如果关闭A,B应检测到此情况并启动服务。
  • 如果A再次打开,A应该等待,不要运行该服务。
  • 等。 (如果B关闭,A开始,如果A关闭,B开始)

我已经考虑过心跳协议来同步节点的状态并检测超时,但是存在很多竞争条件。

我可以使用全局锁添加第三个节点,但我不确定如何执行此操作。

任何人都知道有任何众所周知的算法吗?或者更好是否有任何开源软件可以让我控制这类事情?

由于

1 个答案:

答案 0 :(得分:1)

如果你可以在节点之间提供某种共享内存,那么有一种经典算法可以解决这个问题,称为Peterson's algorithm

它基于另外两个变量,称为flagturnTurn是一个整数变量,其值表示此时允许处于活动状态的节点的索引。换句话说,turn=1表示节点no 1有权激活,其他节点应该等待。换句话说,轮到他了 - 这就是名字的来源。

Flag是一个布尔数组,其中flag[i]表示第i个节点将自己声明为服务准备就绪。在您的设置中,flag[i]=false表示第i个节点已关闭。该算法的关键部分是准备服务的节点(即flag[i] = true)必须等到他获得turn

算法最初是为解决执行critical section而没有冲突的问题而开发的。但是,在您的情况下,关键部分只是运行服务。您必须确保在关闭第i个节点之前,将flag[i]设置为false。这绝对是一个棘手的部分,因为如果一个节点崩溃,它显然不能设置任何值。我会带着某种心跳来到这里。

关于解决类似问题的开源软件,请尝试搜索“群集故障转移”。阅读Google's PaxosGoogle FileSystem。有很多解决方案,但如果你想自己实现一些东西,我会试试Peterson的算法。

相关问题