我有一个抽象的问题。
我需要一个容错的服务。该服务一次只能在一个节点上运行。这是关键。
有两个连接的节点:A和B.
我已经考虑过心跳协议来同步节点的状态并检测超时,但是存在很多竞争条件。
我可以使用全局锁添加第三个节点,但我不确定如何执行此操作。
任何人都知道有任何众所周知的算法吗?或者更好是否有任何开源软件可以让我控制这类事情?
由于
答案 0 :(得分:1)
如果你可以在节点之间提供某种共享内存,那么有一种经典算法可以解决这个问题,称为Peterson's algorithm。
它基于另外两个变量,称为flag
和turn
。 Turn
是一个整数变量,其值表示此时允许处于活动状态的节点的索引。换句话说,turn=1
表示节点no 1有权激活,其他节点应该等待。换句话说,轮到他了 - 这就是名字的来源。
Flag
是一个布尔数组,其中flag[i]
表示第i个节点将自己声明为服务准备就绪。在您的设置中,flag[i]=false
表示第i个节点已关闭。该算法的关键部分是准备服务的节点(即flag[i] = true
)必须等到他获得turn
。
算法最初是为解决执行critical section而没有冲突的问题而开发的。但是,在您的情况下,关键部分只是运行服务。您必须确保在关闭第i个节点之前,将flag[i]
设置为false。这绝对是一个棘手的部分,因为如果一个节点崩溃,它显然不能设置任何值。我会带着某种心跳来到这里。
关于解决类似问题的开源软件,请尝试搜索“群集故障转移”。阅读Google's Paxos和Google FileSystem。有很多解决方案,但如果你想自己实现一些东西,我会试试Peterson的算法。